1 /*
2  * Copyright (c) 2006-2008 Amit Singh/Google Inc.
3  * Copyright (c) 2011-2013 Benjamin Fleischer
4  */
5 
6 #ifndef _DARWIN_COMPAT_
7 #define _DARWIN_COMPAT_
8 
9 #include <pthread.h>
10 
11 /* Semaphores */
12 
13 typedef struct darwin_sem {
14     int id;
15     union {
16         struct
17         {
18             unsigned int    count;
19             pthread_mutex_t count_lock;
20             pthread_cond_t  count_cond;
21         } local;
22     } __data;
23 } darwin_sem_t;
24 
25 #define DARWIN_SEM_VALUE_MAX ((int32_t)32767)
26 
27 int darwin_sem_init(darwin_sem_t *sem, int pshared, unsigned int value);
28 int darwin_sem_destroy(darwin_sem_t *sem);
29 int darwin_sem_getvalue(darwin_sem_t *sem, unsigned int *value);
30 int darwin_sem_post(darwin_sem_t *sem);
31 int darwin_sem_timedwait(darwin_sem_t *sem, const struct timespec *abs_timeout);
32 int darwin_sem_trywait(darwin_sem_t *sem);
33 int darwin_sem_wait(darwin_sem_t *sem);
34 
35 /* Caller must not include <semaphore.h> */
36 
37 typedef darwin_sem_t sem_t;
38 
39 #define sem_init(s, p, v)   darwin_sem_init(s, p, v)
40 #define sem_destroy(s)      darwin_sem_destroy(s)
41 #define sem_getvalue(s, v)  darwin_sem_getvalue(s, v)
42 #define sem_post(s)         darwin_sem_post(s)
43 #define sem_timedwait(s, t) darwin_sem_timedwait(s, t)
44 #define sem_trywait(s)      darwin_sem_trywait(s)
45 #define sem_wait(s)         darwin_sem_wait(s)
46 
47 #define SEM_VALUE_MAX       DARWIN_SEM_VALUE_MAX
48 
49 #endif /* _DARWIN_COMPAT_ */
50