11 #if defined(__WIN32__)
12 #define WIN32_LEAN_AND_MEAN
13 #define String String_
16 #elif defined(__APPLE__)
18 #include <mach/mach.h>
19 #include <mach/task.h>
20 #include <mach/semaphore.h>
23 #include <semaphore.h>
29 public class Semaphore : struct
31 #if !defined(__EMSCRIPTEN__)
33 #if defined(__WIN32__)
35 #elif defined(__APPLE__)
36 semaphore_t semaphore;
44 int initCount, maxCount;
48 #if !defined(__EMSCRIPTEN__)
49 #if defined(__WIN32__)
50 handle = CreateSemaphore(null, 0, 1, null);
51 #elif defined(__APPLE__)
52 semaphore_create(mach_task_self(), &semaphore, SYNC_POLICY_FIFO, 0);
54 sem_init(&semaphore, 0, 0);
63 #if !defined(__EMSCRIPTEN__)
64 #if defined(__WIN32__)
65 if(handle) CloseHandle(handle);
66 #elif defined(__APPLE__)
67 semaphore_destroy(mach_task_self(), semaphore);
69 sem_destroy(&semaphore);
78 #if !defined(__EMSCRIPTEN__)
79 #if defined(__WIN32__)
80 result = WaitForSingleObject(handle, 0) != WAIT_TIMEOUT;
81 #elif defined(__APPLE__)
93 semaphore_wait(semaphore);
95 result = sem_trywait(&semaphore) != EAGAIN;
103 #if !defined(__EMSCRIPTEN__)
104 #if defined(__WIN32__)
105 if(WaitForSingleObject(handle, INFINITE /*2000*/) == WAIT_TIMEOUT)
106 PrintLn("Semaphore not released?");
107 #elif defined(__APPLE__)
111 semaphore_wait(semaphore);
116 if(!sem_wait(&semaphore) || errno != EINTR)
120 sem_wait(&semaphore);
128 #if !defined(__EMSCRIPTEN__)
129 #if defined(__WIN32__)
130 ReleaseSemaphore(handle, 1, null);
131 #elif defined(__APPLE__)
135 semaphore_signal(semaphore);
138 sem_getvalue(&semaphore, &count);
140 sem_post(&semaphore);
145 property int initCount
149 #if !defined(__EMSCRIPTEN__)
150 #if defined(__WIN32__)
151 if(handle) CloseHandle(handle);
152 handle = CreateSemaphore(null, initCount, value, null);
153 #elif defined(__APPLE__)
154 semaphore_destroy(mach_task_self(), semaphore);
155 semaphore_create(mach_task_self(), &semaphore, SYNC_POLICY_FIFO, 0);
158 sem_destroy(&semaphore);
159 sem_init(&semaphore, 0, initCount);
164 get { return initCount; }
166 property int maxCount
170 #if !defined(__EMSCRIPTEN__)
171 #if defined(__WIN32__)
172 if(handle) CloseHandle(handle);
173 handle = CreateSemaphore(null, value, maxCount, null);
178 get { return maxCount; }