diff options
| author | oy <tom_adams@web.de> | 2012-01-03 15:40:30 -0800 |
|---|---|---|
| committer | oy <tom_adams@web.de> | 2012-01-03 15:40:30 -0800 |
| commit | 7328098f8d03e65975ec82162d2049f46fed223d (patch) | |
| tree | 1c42d719df3971a3a8558a6a1a30c68b4b6f574e /src/base | |
| parent | c975390195eed17c615bbebfab981a2394dec424 (diff) | |
| parent | 7393151b6d4cbfd8c4be29145344dcce22aa47d7 (diff) | |
| download | zcatch-7328098f8d03e65975ec82162d2049f46fed223d.tar.gz zcatch-7328098f8d03e65975ec82162d2049f46fed223d.zip | |
Merge pull request #912 from matricks/threadedflip
Threadedflip
Diffstat (limited to 'src/base')
| -rw-r--r-- | src/base/system.c | 15 | ||||
| -rw-r--r-- | src/base/system.h | 17 | ||||
| -rw-r--r-- | src/base/tl/threading.h | 106 |
3 files changed, 138 insertions, 0 deletions
diff --git a/src/base/system.c b/src/base/system.c index bf06a36e..a11caf4c 100644 --- a/src/base/system.c +++ b/src/base/system.c @@ -505,6 +505,21 @@ void lock_release(LOCK lock) #endif } +#if defined(CONF_FAMILY_UNIX) +void semaphore_init(SEMAPHORE *sem) { sem_init(sem, 0, 0); } +void semaphore_wait(SEMAPHORE *sem) { sem_wait(sem); } +void semaphore_signal(SEMAPHORE *sem) { sem_post(sem); } +void semaphore_destroy(SEMAPHORE *sem) { sem_destroy(sem); } +#elif defined(CONF_FAMILY_WINDOWS) +void semaphore_init(SEMAPHORE *sem) { (HANDLE)(*sem) = CreateSemaphore(0, 0, 10000, 0); } +void semaphore_wait(SEMAPHORE *sem) { WaitForSingleObject((HANDLE)*sem, 0L); } +void semaphore_signal(SEMAPHORE *sem) { ReleaseSemaphore((HANDLE)*sem, 1, NULL); } +void semaphore_destroy(SEMAPHORE *sem) { CloseHandle((HANDLE)*sem); } +#else + #error not implemented on this platform +#endif + + /* ----- time ----- */ int64 time_get() { diff --git a/src/base/system.h b/src/base/system.h index 5060fcb0..b3588dbf 100644 --- a/src/base/system.h +++ b/src/base/system.h @@ -400,6 +400,23 @@ int lock_try(LOCK lock); void lock_wait(LOCK lock); void lock_release(LOCK lock); + +/* Group: Semaphores */ + +#if defined(CONF_FAMILY_UNIX) + #include <semaphore.h> + typedef sem_t SEMAPHORE; +#elif defined(CONF_FAMILY_WINDOWS) + typedef void* SEMAPHORE; +#else + #error missing sempahore implementation +#endif + +void semaphore_init(SEMAPHORE *sem); +void semaphore_wait(SEMAPHORE *sem); +void semaphore_signal(SEMAPHORE *sem); +void semaphore_destroy(SEMAPHORE *sem); + /* Group: Timer */ #ifdef __GNUC__ /* if compiled with -pedantic-errors it will complain about long diff --git a/src/base/tl/threading.h b/src/base/tl/threading.h new file mode 100644 index 00000000..dbf788cd --- /dev/null +++ b/src/base/tl/threading.h @@ -0,0 +1,106 @@ + +#pragma once + +#include "../system.h" + +/* + atomic_inc - should return the value after increment + atomic_dec - should return the value after decrement + atomic_compswap - should return the value before the eventual swap + +*/ + +#if defined(__GNUC__) + + inline unsigned atomic_inc(volatile unsigned *pValue) + { + return __sync_fetch_and_add(pValue, 1); + } + + inline unsigned atomic_dec(volatile unsigned *pValue) + { + return __sync_fetch_and_add(pValue, -1); + } + + inline unsigned atomic_compswap(volatile unsigned *pValue, unsigned comperand, unsigned value) + { + return __sync_val_compare_and_swap(pValue, comperand, value); + } + + inline void sync_barrier() + { + __sync_synchronize(); + } + +#elif defined(_MSC_VER) + #include <intrin.h> + + inline unsigned atomic_inc(volatile unsigned *pValue) + { + return _InterlockedIncrement((volatile long *)pValue); + } + + inline unsigned atomic_dec(volatile unsigned *pValue) + { + return _InterlockedDecrement((volatile long *)pValue); + } + + inline unsigned atomic_compswap(volatile unsigned *pValue, unsigned comperand, unsigned value) + { + return _InterlockedCompareExchange((volatile long *)pValue, (long)value, (long)comperand); + } + + inline void sync_barrier() + { + _ReadWriteBarrier(); + } +#else + #error missing atomic implementation for this compiler +#endif + +class semaphore +{ + SEMAPHORE sem; +public: + semaphore() { semaphore_init(&sem); } + ~semaphore() { semaphore_destroy(&sem); } + void wait() { semaphore_wait(&sem); } + void signal() { semaphore_signal(&sem); } +}; + +class lock +{ + friend class scope_lock; + + LOCK var; + + void take() { lock_wait(var); } + void release() { lock_release(var); } + +public: + lock() + { + var = lock_create(); + } + + ~lock() + { + lock_destroy(var); + } +}; + +class scope_lock +{ + lock *var; +public: + scope_lock(lock *l) + { + var = l; + var->take(); + } + + ~scope_lock() + { + var->release(); + } +}; |