2 * mono-semaphore.c: mono-semaphore functions
5 * Gonzalo Paniagua Javier <gonzalo@novell.com>
7 * (C) 2010 Novell, Inc.
12 #include "utils/mono-semaphore.h"
13 #ifdef HAVE_SYS_TIME_H
17 #if defined(HAVE_SEMAPHORE_H) || defined(USE_MACH_SEMA)
18 /* sem_* or semaphore_* functions in use */
20 # define TIMESPEC mach_timespec_t
21 # define WAIT_BLOCK(a,b) semaphore_timedwait (*(a), *(b))
23 # define TIMESPEC struct timespec
24 # define WAIT_BLOCK(a,b) sem_timedwait (a, b)
28 mono_sem_timedwait (MonoSemType *sem, guint32 timeout_ms)
36 return (!sem_trywait (sem));
38 if (timeout_ms == (guint32) 0xFFFFFFFF)
39 return mono_sem_wait (sem);
41 gettimeofday (&t, NULL);
42 ts.tv_sec = timeout_ms / 1000 + t.tv_sec;
43 ts.tv_nsec = (timeout_ms % 1000) * 1000000 + t.tv_usec * 1000;
44 while (ts.tv_nsec > 1000000000) {
45 ts.tv_nsec -= 1000000000;
49 while ((res = WAIT_BLOCK (sem, &ts) == -1) && errno == EINTR)
55 mono_sem_wait (MonoSemType *sem)
59 while ((res = sem_wait (sem) == -1) && errno == EINTR);
61 while ((res = semaphore_wait (*sem) == -1) && errno == EINTR);
67 mono_sem_post (MonoSemType *sem)
71 while ((res = sem_post (sem) == -1) && errno == EINTR);
73 while ((res = semaphore_signal (*sem) == -1) && errno == EINTR);
79 /* Windows or io-layer functions in use */
81 mono_sem_wait (MonoSemType *sem)
83 return mono_sem_timedwait (sem, INFINITE);
87 mono_sem_timedwait (MonoSemType *sem, guint32 timeout_ms)
91 res = WaitForSingleObjectEx (*sem, timeout_ms, FALSE);
98 mono_sem_post (MonoSemType *sem)
100 if (!ReleaseSemaphore (*sem, 1, NULL))