diff --git a/invertedlogic/iLPlatform/iLSemaphore.h b/invertedlogic/iLPlatform/iLSemaphore.h index 42df4e4..d3e7133 100644 --- a/invertedlogic/iLPlatform/iLSemaphore.h +++ b/invertedlogic/iLPlatform/iLSemaphore.h @@ -1,119 +1,21 @@ -#include -#include /* For O_* constants */ -#include /* For mode constants */ -#include +#ifndef IL_SEMAPHORE_H +#define IL_SEMAPHORE_H -#if 1 +#include "iLTypes.h" -typedef pthread_mutex_t iLMutex; -typedef sem_t iLSemaphore; -static inline void iLMutex_Create(iLMutex* a_mutex) -{ - pthread_mutex_init(a_mutex, NULL); -} +static inline iLResult iLMutex_Create(iLMutex* a_mutex); +static inline iLResult iLMutex_Lock(iLMutex* a_mutex); +static inline iLResult iLMutex_Unlock(iLMutex* a_mutex); -static inline void iLMutex_Lock(iLMutex* a_mutex) -{ - pthread_mutex_lock(a_mutex); -} +static inline iLResult iLSemaphore_Create(iLSemaphore* a_sem, uint32_t a_initCount, uint32_t a_maxCount); +static inline iLResult iLSemaphore_Wait(iLSemaphore* a_sem); +static inline iLResult iLSemaphore_Signal(iLSemaphore* a_sem, uint32_t a_count); -static inline void iLMutex_Unlock(iLMutex* a_mutex) -{ - pthread_mutex_unlock(a_mutex); -} -static inline void iLSemaphore_Create(iLSemaphore* a_sem, uint32_t a_initCount, uint32_t a_maxCount) -{ - a_sem = sem_open("/sem", O_CREAT, S_IRWXU, a_initCount); -} +#include "iLSemaphore.inl" -static inline void iLSemaphore_Wait(iLSemaphore* a_sem) -{ - sem_wait(a_sem); -} -static inline void iLSemaphore_Signal(iLSemaphore* a_sem, uint32_t a_count) -{ - for (int i = 0; i < a_count; i++) - sem_post(a_sem); -} - -#else - -typedef uint32_t iLMutex; - -static inline void iLMutex_Create(iLMutex* a_mutex) -{ - *a_mutex = 0; -} - -static inline void iLMutex_Lock(iLMutex* a_mutex) -{ - int spinCount = 0; - while (__sync_lock_test_and_set(a_mutex, 1) == 1) - { - spinCount++; - if (spinCount > 1000000) - { - spinCount = 0; - pthread_yield(); - } - } -} - -static inline void iLMutex_Unlock(iLMutex* a_mutex) -{ - __sync_lock_release(a_mutex); -} - -struct iLSemaphore -{ - uint32_t count; - uint32_t maxCount; - uint32_t waitCount; - iLMutex mutex; - pthread_cond_t cond; -}; - -static inline void iLSemaphore_Create(iLSemaphore* a_sem, uint32_t a_initCount, iLMutex* a_maxCount) -{ - a_sem->count = a_initCount; - a_sem->maxCount = a_maxCount; - a_sem->waitCount = 0; - iLMutex_Create(&a_sem->mutex); - pthread_cond_init(&a_sem->cond, NULL); -} - -static inline void iLSemaphore_Wait(iLSemaphore* a_sem) -{ - iLMutex_Lock(&a_sem->mutex); - while(a_sem->count == 0) - { - ++a_sem->waitCount; - pthread_cond_wait(&a_sem->cond, &a_sem->mutex); - --a_sem->waitCount; - } - --a_sem->count; - iLMutex_Unlock(&a_sem->mutex); -} - -static inline void iLSemaphore_Signal(iLSemaphore* a_sem, uint32_t a_count) -{ - iLMutex_Lock(&a_sem->mutex); - a_sem->count += a_count; - if (a_sem->count > a_sem->maxCount) - { - a_sem->count = a_sem->maxCount; - } - if (a_sem->waitCount > 0) - { - pthread_cond_signal(&a_sem->cond); - } - iLMutex_Unlock(&a_sem->mutex); -} - -#endif - +#endif // IL_SEMAPHORE_H diff --git a/invertedlogic/iLPlatform/iLSemaphore.h b/invertedlogic/iLPlatform/iLSemaphore.h index 42df4e4..d3e7133 100644 --- a/invertedlogic/iLPlatform/iLSemaphore.h +++ b/invertedlogic/iLPlatform/iLSemaphore.h @@ -1,119 +1,21 @@ -#include -#include /* For O_* constants */ -#include /* For mode constants */ -#include +#ifndef IL_SEMAPHORE_H +#define IL_SEMAPHORE_H -#if 1 +#include "iLTypes.h" -typedef pthread_mutex_t iLMutex; -typedef sem_t iLSemaphore; -static inline void iLMutex_Create(iLMutex* a_mutex) -{ - pthread_mutex_init(a_mutex, NULL); -} +static inline iLResult iLMutex_Create(iLMutex* a_mutex); +static inline iLResult iLMutex_Lock(iLMutex* a_mutex); +static inline iLResult iLMutex_Unlock(iLMutex* a_mutex); -static inline void iLMutex_Lock(iLMutex* a_mutex) -{ - pthread_mutex_lock(a_mutex); -} +static inline iLResult iLSemaphore_Create(iLSemaphore* a_sem, uint32_t a_initCount, uint32_t a_maxCount); +static inline iLResult iLSemaphore_Wait(iLSemaphore* a_sem); +static inline iLResult iLSemaphore_Signal(iLSemaphore* a_sem, uint32_t a_count); -static inline void iLMutex_Unlock(iLMutex* a_mutex) -{ - pthread_mutex_unlock(a_mutex); -} -static inline void iLSemaphore_Create(iLSemaphore* a_sem, uint32_t a_initCount, uint32_t a_maxCount) -{ - a_sem = sem_open("/sem", O_CREAT, S_IRWXU, a_initCount); -} +#include "iLSemaphore.inl" -static inline void iLSemaphore_Wait(iLSemaphore* a_sem) -{ - sem_wait(a_sem); -} -static inline void iLSemaphore_Signal(iLSemaphore* a_sem, uint32_t a_count) -{ - for (int i = 0; i < a_count; i++) - sem_post(a_sem); -} - -#else - -typedef uint32_t iLMutex; - -static inline void iLMutex_Create(iLMutex* a_mutex) -{ - *a_mutex = 0; -} - -static inline void iLMutex_Lock(iLMutex* a_mutex) -{ - int spinCount = 0; - while (__sync_lock_test_and_set(a_mutex, 1) == 1) - { - spinCount++; - if (spinCount > 1000000) - { - spinCount = 0; - pthread_yield(); - } - } -} - -static inline void iLMutex_Unlock(iLMutex* a_mutex) -{ - __sync_lock_release(a_mutex); -} - -struct iLSemaphore -{ - uint32_t count; - uint32_t maxCount; - uint32_t waitCount; - iLMutex mutex; - pthread_cond_t cond; -}; - -static inline void iLSemaphore_Create(iLSemaphore* a_sem, uint32_t a_initCount, iLMutex* a_maxCount) -{ - a_sem->count = a_initCount; - a_sem->maxCount = a_maxCount; - a_sem->waitCount = 0; - iLMutex_Create(&a_sem->mutex); - pthread_cond_init(&a_sem->cond, NULL); -} - -static inline void iLSemaphore_Wait(iLSemaphore* a_sem) -{ - iLMutex_Lock(&a_sem->mutex); - while(a_sem->count == 0) - { - ++a_sem->waitCount; - pthread_cond_wait(&a_sem->cond, &a_sem->mutex); - --a_sem->waitCount; - } - --a_sem->count; - iLMutex_Unlock(&a_sem->mutex); -} - -static inline void iLSemaphore_Signal(iLSemaphore* a_sem, uint32_t a_count) -{ - iLMutex_Lock(&a_sem->mutex); - a_sem->count += a_count; - if (a_sem->count > a_sem->maxCount) - { - a_sem->count = a_sem->maxCount; - } - if (a_sem->waitCount > 0) - { - pthread_cond_signal(&a_sem->cond); - } - iLMutex_Unlock(&a_sem->mutex); -} - -#endif - +#endif // IL_SEMAPHORE_H diff --git a/invertedlogic/iLPlatform/iLSemaphore.inl b/invertedlogic/iLPlatform/iLSemaphore.inl new file mode 100644 index 0000000..683340d --- /dev/null +++ b/invertedlogic/iLPlatform/iLSemaphore.inl @@ -0,0 +1,129 @@ +#include /* For O_* constants */ +#include /* For mode constants */ + + +#if 1 + +typedef pthread_mutex_t iLMutex; +typedef sem_t iLSemaphore; + +static inline iLResult iLMutex_Create(iLMutex* a_mutex) +{ + pthread_mutex_init(a_mutex, NULL); + return iLR_OK; +} + +static inline iLResult iLMutex_Lock(iLMutex* a_mutex) +{ + pthread_mutex_lock(a_mutex); + return iLR_OK; +} + +static inline iLResult iLMutex_Unlock(iLMutex* a_mutex) +{ + pthread_mutex_unlock(a_mutex); + return iLR_OK; +} + +static inline iLResult iLSemaphore_Create(iLSemaphore* a_sem, uint32_t a_initCount, uint32_t a_maxCount) +{ + a_sem = sem_open("/sem", O_CREAT, S_IRWXU, a_initCount); + return iLR_OK; +} + +static inline iLResult iLSemaphore_Wait(iLSemaphore* a_sem) +{ + sem_wait(a_sem); + return iLR_OK; +} + +static inline iLResult iLSemaphore_Signal(iLSemaphore* a_sem, uint32_t a_count) +{ + for (int i = 0; i < a_count; i++) + sem_post(a_sem); + return iLR_OK; +} + +#else + +typedef uint32_t iLMutex; + +static inline iLResult iLMutex_Create(iLMutex* a_mutex) +{ + *a_mutex = 0; + return iLR_OK; +} + +static inline iLResult iLMutex_Lock(iLMutex* a_mutex) +{ + int spinCount = 0; + while (__sync_lock_test_and_set(a_mutex, 1) == 1) + { + spinCount++; + if (spinCount > 1000000) + { + spinCount = 0; + pthread_yield(); + } + } + return iLR_OK; +} + +static inline iLResult iLMutex_Unlock(iLMutex* a_mutex) +{ + __sync_lock_release(a_mutex); + return iLR_OK; +} + +struct iLSemaphore +{ + uint32_t count; + uint32_t maxCount; + uint32_t waitCount; + iLMutex mutex; + pthread_cond_t cond; +}; + +static inline iLResult iLSemaphore_Create(iLSemaphore* a_sem, uint32_t a_initCount, iLMutex* a_maxCount) +{ + a_sem->count = a_initCount; + a_sem->maxCount = a_maxCount; + a_sem->waitCount = 0; + iLMutex_Create(&a_sem->mutex); + pthread_cond_init(&a_sem->cond, NULL); + return iLR_OK; +} + +static inline iLResult iLSemaphore_Wait(iLSemaphore* a_sem) +{ + iLMutex_Lock(&a_sem->mutex); + while(a_sem->count == 0) + { + ++a_sem->waitCount; + pthread_cond_wait(&a_sem->cond, &a_sem->mutex); + --a_sem->waitCount; + } + --a_sem->count; + iLMutex_Unlock(&a_sem->mutex); + return iLR_OK; +} + +static inline iLResult iLSemaphore_Signal(iLSemaphore* a_sem, uint32_t a_count) +{ + iLMutex_Lock(&a_sem->mutex); + a_sem->count += a_count; + if (a_sem->count > a_sem->maxCount) + { + a_sem->count = a_sem->maxCount; + } + if (a_sem->waitCount > 0) + { + pthread_cond_signal(&a_sem->cond); + } + iLMutex_Unlock(&a_sem->mutex); + return iLR_OK; +} + +#endif + + diff --git a/invertedlogic/iLPlatform/iLSemaphore.h b/invertedlogic/iLPlatform/iLSemaphore.h index 42df4e4..d3e7133 100644 --- a/invertedlogic/iLPlatform/iLSemaphore.h +++ b/invertedlogic/iLPlatform/iLSemaphore.h @@ -1,119 +1,21 @@ -#include -#include /* For O_* constants */ -#include /* For mode constants */ -#include +#ifndef IL_SEMAPHORE_H +#define IL_SEMAPHORE_H -#if 1 +#include "iLTypes.h" -typedef pthread_mutex_t iLMutex; -typedef sem_t iLSemaphore; -static inline void iLMutex_Create(iLMutex* a_mutex) -{ - pthread_mutex_init(a_mutex, NULL); -} +static inline iLResult iLMutex_Create(iLMutex* a_mutex); +static inline iLResult iLMutex_Lock(iLMutex* a_mutex); +static inline iLResult iLMutex_Unlock(iLMutex* a_mutex); -static inline void iLMutex_Lock(iLMutex* a_mutex) -{ - pthread_mutex_lock(a_mutex); -} +static inline iLResult iLSemaphore_Create(iLSemaphore* a_sem, uint32_t a_initCount, uint32_t a_maxCount); +static inline iLResult iLSemaphore_Wait(iLSemaphore* a_sem); +static inline iLResult iLSemaphore_Signal(iLSemaphore* a_sem, uint32_t a_count); -static inline void iLMutex_Unlock(iLMutex* a_mutex) -{ - pthread_mutex_unlock(a_mutex); -} -static inline void iLSemaphore_Create(iLSemaphore* a_sem, uint32_t a_initCount, uint32_t a_maxCount) -{ - a_sem = sem_open("/sem", O_CREAT, S_IRWXU, a_initCount); -} +#include "iLSemaphore.inl" -static inline void iLSemaphore_Wait(iLSemaphore* a_sem) -{ - sem_wait(a_sem); -} -static inline void iLSemaphore_Signal(iLSemaphore* a_sem, uint32_t a_count) -{ - for (int i = 0; i < a_count; i++) - sem_post(a_sem); -} - -#else - -typedef uint32_t iLMutex; - -static inline void iLMutex_Create(iLMutex* a_mutex) -{ - *a_mutex = 0; -} - -static inline void iLMutex_Lock(iLMutex* a_mutex) -{ - int spinCount = 0; - while (__sync_lock_test_and_set(a_mutex, 1) == 1) - { - spinCount++; - if (spinCount > 1000000) - { - spinCount = 0; - pthread_yield(); - } - } -} - -static inline void iLMutex_Unlock(iLMutex* a_mutex) -{ - __sync_lock_release(a_mutex); -} - -struct iLSemaphore -{ - uint32_t count; - uint32_t maxCount; - uint32_t waitCount; - iLMutex mutex; - pthread_cond_t cond; -}; - -static inline void iLSemaphore_Create(iLSemaphore* a_sem, uint32_t a_initCount, iLMutex* a_maxCount) -{ - a_sem->count = a_initCount; - a_sem->maxCount = a_maxCount; - a_sem->waitCount = 0; - iLMutex_Create(&a_sem->mutex); - pthread_cond_init(&a_sem->cond, NULL); -} - -static inline void iLSemaphore_Wait(iLSemaphore* a_sem) -{ - iLMutex_Lock(&a_sem->mutex); - while(a_sem->count == 0) - { - ++a_sem->waitCount; - pthread_cond_wait(&a_sem->cond, &a_sem->mutex); - --a_sem->waitCount; - } - --a_sem->count; - iLMutex_Unlock(&a_sem->mutex); -} - -static inline void iLSemaphore_Signal(iLSemaphore* a_sem, uint32_t a_count) -{ - iLMutex_Lock(&a_sem->mutex); - a_sem->count += a_count; - if (a_sem->count > a_sem->maxCount) - { - a_sem->count = a_sem->maxCount; - } - if (a_sem->waitCount > 0) - { - pthread_cond_signal(&a_sem->cond); - } - iLMutex_Unlock(&a_sem->mutex); -} - -#endif - +#endif // IL_SEMAPHORE_H diff --git a/invertedlogic/iLPlatform/iLSemaphore.inl b/invertedlogic/iLPlatform/iLSemaphore.inl new file mode 100644 index 0000000..683340d --- /dev/null +++ b/invertedlogic/iLPlatform/iLSemaphore.inl @@ -0,0 +1,129 @@ +#include /* For O_* constants */ +#include /* For mode constants */ + + +#if 1 + +typedef pthread_mutex_t iLMutex; +typedef sem_t iLSemaphore; + +static inline iLResult iLMutex_Create(iLMutex* a_mutex) +{ + pthread_mutex_init(a_mutex, NULL); + return iLR_OK; +} + +static inline iLResult iLMutex_Lock(iLMutex* a_mutex) +{ + pthread_mutex_lock(a_mutex); + return iLR_OK; +} + +static inline iLResult iLMutex_Unlock(iLMutex* a_mutex) +{ + pthread_mutex_unlock(a_mutex); + return iLR_OK; +} + +static inline iLResult iLSemaphore_Create(iLSemaphore* a_sem, uint32_t a_initCount, uint32_t a_maxCount) +{ + a_sem = sem_open("/sem", O_CREAT, S_IRWXU, a_initCount); + return iLR_OK; +} + +static inline iLResult iLSemaphore_Wait(iLSemaphore* a_sem) +{ + sem_wait(a_sem); + return iLR_OK; +} + +static inline iLResult iLSemaphore_Signal(iLSemaphore* a_sem, uint32_t a_count) +{ + for (int i = 0; i < a_count; i++) + sem_post(a_sem); + return iLR_OK; +} + +#else + +typedef uint32_t iLMutex; + +static inline iLResult iLMutex_Create(iLMutex* a_mutex) +{ + *a_mutex = 0; + return iLR_OK; +} + +static inline iLResult iLMutex_Lock(iLMutex* a_mutex) +{ + int spinCount = 0; + while (__sync_lock_test_and_set(a_mutex, 1) == 1) + { + spinCount++; + if (spinCount > 1000000) + { + spinCount = 0; + pthread_yield(); + } + } + return iLR_OK; +} + +static inline iLResult iLMutex_Unlock(iLMutex* a_mutex) +{ + __sync_lock_release(a_mutex); + return iLR_OK; +} + +struct iLSemaphore +{ + uint32_t count; + uint32_t maxCount; + uint32_t waitCount; + iLMutex mutex; + pthread_cond_t cond; +}; + +static inline iLResult iLSemaphore_Create(iLSemaphore* a_sem, uint32_t a_initCount, iLMutex* a_maxCount) +{ + a_sem->count = a_initCount; + a_sem->maxCount = a_maxCount; + a_sem->waitCount = 0; + iLMutex_Create(&a_sem->mutex); + pthread_cond_init(&a_sem->cond, NULL); + return iLR_OK; +} + +static inline iLResult iLSemaphore_Wait(iLSemaphore* a_sem) +{ + iLMutex_Lock(&a_sem->mutex); + while(a_sem->count == 0) + { + ++a_sem->waitCount; + pthread_cond_wait(&a_sem->cond, &a_sem->mutex); + --a_sem->waitCount; + } + --a_sem->count; + iLMutex_Unlock(&a_sem->mutex); + return iLR_OK; +} + +static inline iLResult iLSemaphore_Signal(iLSemaphore* a_sem, uint32_t a_count) +{ + iLMutex_Lock(&a_sem->mutex); + a_sem->count += a_count; + if (a_sem->count > a_sem->maxCount) + { + a_sem->count = a_sem->maxCount; + } + if (a_sem->waitCount > 0) + { + pthread_cond_signal(&a_sem->cond); + } + iLMutex_Unlock(&a_sem->mutex); + return iLR_OK; +} + +#endif + + diff --git a/invertedlogic/iLPlatform/iLTypes.h b/invertedlogic/iLPlatform/iLTypes.h index 91f896f..7eca69c 100644 --- a/invertedlogic/iLPlatform/iLTypes.h +++ b/invertedlogic/iLPlatform/iLTypes.h @@ -8,16 +8,21 @@ #if defined(IL_PLATFORM_UNIX) #include +#include typedef FILE iLFile; typedef pthread_t iLThread; typedef int32_t* iLAtomic32; typedef int64_t* iLAtomic64; +typedef pthread_mutex_t iLMutex; +typedef sem_t iLSemaphore; #elif defined(IL_PLATFORM_WINDOWS) #include typedef HANDLE iLFile; typedef HANDLE iLThread; typedef volatile int32_t* iLAtomic32; typedef volatile int64_t* iLAtomic64; +typedef HANDLE iLMutex; +typedef HANDLE iLSemaphore; #else # error "Unsupported platform" #endif