this repo has no description
1#ifndef DISPATCH_WIN_POSIX_SEMAPHORE_
2#define DISPATCH_WIN_POSIX_SEMAPHORE_
3
4typedef HANDLE sem_t;
5
6static int sem_init(sem_t * sem, int shared, unsigned int val)
7{
8 *sem = CreateSemaphore(0, val, 1, 0);
9 // TODO: Proper error handling
10 return *sem == 0;
11}
12
13static inline int sem_destroy(sem_t* s)
14{
15 return CloseHandle(s) != 1;
16}
17
18static inline int sem_post(sem_t* s)
19{
20 return !ReleaseSemaphore(s, 1, 0);
21}
22
23static inline int sem_wait(sem_t* s)
24{
25 return WaitForSingleObject(s, INFINITE) == WAIT_FAILED;
26}
27
28static int sem_timedwait(sem_t * sem, const struct timespec * timeout)
29{
30 DWORD duration = (DWORD)(timeout->tv_nsec / 1000000) + (DWORD)(timeout->tv_sec * 1000);
31
32 switch(WaitForSingleObject(sem,duration) ){
33 case WAIT_TIMEOUT:
34 return ETIMEDOUT;
35 case WAIT_FAILED:
36 return EINVAL;
37 default:
38 return 0;
39 }
40}
41
42#endif /* DISPATCH_WIN_POSIX_SEMAPHORE_ */