Skip to content

Commit

Permalink
Implement semaphores on POSIX
Browse files Browse the repository at this point in the history
  • Loading branch information
emberian committed Oct 14, 2012
1 parent 8c9c11d commit ba94e03
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 17 deletions.
39 changes: 24 additions & 15 deletions Thread.c
@@ -1,11 +1,14 @@
/** @file Thread.c
/**
* @file Thread.c
* @brief Threading functions and synchronization primitives.
*/

#include "Thread.h"

#ifdef WINDOWS
#include <Windows.h>
#elif defined POSIX
#include <errno.h>
#endif

/**
Expand Down Expand Up @@ -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
}
3 changes: 1 addition & 2 deletions Thread.h
Expand Up @@ -10,13 +10,12 @@
typedef void* SAL_Semaphore;
#elif defined POSIX
#include <pthread.h>
#include <errno.h>

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);
Expand Down

0 comments on commit ba94e03

Please sign in to comment.