From ba94e035face3deb032b902853f7be7f81a9a1b9 Mon Sep 17 00:00:00 2001 From: Corey Richardson Date: Sun, 14 Oct 2012 11:35:44 -0400 Subject: [PATCH] Implement semaphores on POSIX --- Thread.c | 39 ++++++++++++++++++++++++--------------- Thread.h | 3 +-- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/Thread.c b/Thread.c index 2e1eef6..e730906 100644 --- a/Thread.c +++ b/Thread.c @@ -1,4 +1,5 @@ -/** @file Thread.c +/** + * @file Thread.c * @brief Threading functions and synchronization primitives. */ @@ -6,6 +7,8 @@ #ifdef WINDOWS #include +#elif defined POSIX + #include #endif /** @@ -137,53 +140,59 @@ void SAL_Mutex_Release(SAL_Mutex mutex) { /** * Create a new semaphore. * - * @return a new semaphore + * @returns a new semaphore, NULL on failure */ SAL_Semaphore SAL_Semaphore_Create(void) { #ifdef WINDOWS return CreateSemaphore(NULL, 0, 4294967295, NULL); #elif defined POSIX - + sem_t *sem = Allocate(sem_t); + if (sem_init(sem, 0 /* shared between threads */, 0) != 0) { + return NULL; + } + return sem; #endif } /** * Free a semaphore. * - * @param semaphore to free. + * @param semaphore to free + * @warning Don't free a semaphor that is still in use (being waited on) */ -void SAL_Semaphore_Free(SAL_Semaphore Semaphore) { +void SAL_Semaphore_Free(SAL_Semaphore semaphore) { #ifdef WINDOWS - CloseHandle(Semaphore); + CloseHandle(semaphore); #elif defined POSIX - + sem_destroy(semaphore); + Free(semaphore); #endif } /** * Decrement a semaphore. * - * @param semaphore to decrement. + * @param semaphore to decrement * * @warning This function will block if the semaphore count is zero. */ -void SAL_Semaphore_Decrement(SAL_Semaphore Semaphore) { +void SAL_Semaphore_Decrement(SAL_Semaphore semaphore) { #ifdef WINDOWS - WaitForSingleObject(Semaphore, INFINITE); + WaitForSingleObject(semaphore, INFINITE); #elif defined POSIX - + while (sem_wait(semaphore) == -1 && errno == EINTR); #endif } /** * Increment a semaphore. * - * @param semaphore to increment. + * @param semaphore to increment */ -void SAL_Semaphore_Increment(SAL_Semaphore Semaphore) { +void SAL_Semaphore_Increment(SAL_Semaphore semaphore) { #ifdef WINDOWS - ReleaseSemaphore(Semaphore, 1, NULL); + ReleaseSemaphore(semaphore, 1, NULL); #elif defined POSIX - + sem_post(semaphore); #endif } diff --git a/Thread.h b/Thread.h index f2e495e..58d1b65 100644 --- a/Thread.h +++ b/Thread.h @@ -10,13 +10,12 @@ typedef void* SAL_Semaphore; #elif defined POSIX #include - #include typedef void* (*SAL_Thread_StartAddress)(void* SAL_Thread_StartParameter); typedef pthread_t SAL_Thread; typedef pthread_mutex_t* SAL_Mutex; - typedef pthread_cond_t* SAL_Semaphore; + typedef sem_t* SAL_Semaphore; #endif public SAL_Thread SAL_Thread_Create(SAL_Thread_StartAddress startAddress, void* startParameter);