10 #define WIN32_LEAN_AND_MEAN
11 #define String String_
14 #elif defined(__APPLE__)
16 #include <mach/mach.h>
17 #include <mach/task.h>
18 #include <mach/semaphore.h>
21 #include <semaphore.h>
27 public class Semaphore : struct
29 #if defined(__WIN32__)
31 #elif defined(__APPLE__)
32 semaphore_t semaphore;
39 int initCount, maxCount;
43 #if defined(__WIN32__)
44 handle = CreateSemaphore(null, 0, 1, null);
45 #elif defined(__APPLE__)
46 semaphore_create(mach_task_self(), &semaphore, SYNC_POLICY_FIFO, 0);
48 sem_init(&semaphore, 0, 0);
56 #if defined(__WIN32__)
57 if(handle) CloseHandle(handle);
58 #elif defined(__APPLE__)
59 semaphore_destroy(mach_task_self(), semaphore);
61 sem_destroy(&semaphore);
68 #if defined(__WIN32__)
69 WaitForSingleObject(handle, 0);
70 #elif defined(__APPLE__)
80 semaphore_wait(semaphore);
82 sem_trywait(&semaphore);
88 #if defined(__WIN32__)
89 if(WaitForSingleObject(handle, INFINITE /*2000*/) == WAIT_TIMEOUT)
90 PrintLn("Semaphore not released?");
91 #elif defined(__APPLE__)
95 semaphore_wait(semaphore);
100 if(!sem_wait(&semaphore) || errno != EINTR)
104 sem_wait(&semaphore);
111 #if defined(__WIN32__)
112 ReleaseSemaphore(handle, 1, null);
113 #elif defined(__APPLE__)
117 semaphore_signal(semaphore);
120 sem_getvalue(&semaphore, &count);
122 sem_post(&semaphore);
126 property int initCount
130 #if defined(__WIN32__)
131 if(handle) CloseHandle(handle);
132 handle = CreateSemaphore(null, initCount, value, null);
133 #elif defined(__APPLE__)
134 semaphore_destroy(mach_task_self(), semaphore);
135 semaphore_create(mach_task_self(), &semaphore, SYNC_POLICY_FIFO, 0);
138 sem_destroy(&semaphore);
139 sem_init(&semaphore, 0, initCount);
143 get { return initCount; }
145 property int maxCount
149 #if defined(__WIN32__)
150 if(handle) CloseHandle(handle);
151 handle = CreateSemaphore(null, value, maxCount, null);
155 get { return maxCount; }