X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fsemaphore.h;h=e6c09c54437e57ed3ae0cf8903a30c920c976760;hb=6a38983c19fe78753962288e206c5817ad595448;hp=75c51e6a424716deee151e3bedfd7eb80342e006;hpb=e1ea831a640fba534e7e42e399f04cdf681ef8d3;p=libs%2Fcore.git diff --git a/source/core/semaphore.h b/source/core/semaphore.h index 75c51e6..e6c09c5 100644 --- a/source/core/semaphore.h +++ b/source/core/semaphore.h @@ -1,34 +1,55 @@ -/* -This file is part of libmspframework +/* $Id$ + +This file is part of libmspcore Copyright © 2006 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ -#ifndef MSP_FRAMEWORK_SEMAPHORE_H_ -#define MSP_FRAMEWORK_SEMAPHORE_H_ -#include +#ifndef MSP_CORE_SEMAPHORE_H_ +#define MSP_CORE_SEMAPHORE_H_ + #include "mutex.h" +#include "types.h" #include "../time/timedelta.h" namespace Msp { class Semaphore { -public: -#ifndef WIN32 - Semaphore() { pthread_cond_init(&cond, 0); } - //Mutex &get_mutex() { return mutex; } - int signal() { MutexLock l(mutex); return pthread_cond_signal(&cond); } - int broadcast() { MutexLock l(mutex); return pthread_cond_broadcast(&cond); } - int wait() { mutex.lock(); return pthread_cond_wait(&cond, &mutex.mutex); } - int wait(const Time::TimeDelta &); - ~Semaphore() { pthread_cond_destroy(&cond); } +private: + Mutex *mutex; + bool own_mutex; + SemaphoreHandle sem; +#ifdef WIN32 + unsigned count; #endif + +public: + Semaphore(); + Semaphore(Mutex &); private: - Mutex mutex; - pthread_cond_t cond; + void init(); +public: + ~Semaphore(); + + int signal(); + int broadcast(); + int wait(); + int wait(const Time::TimeDelta &); + Mutex &get_mutex() { return *mutex; } }; +#ifndef WIN32 +inline int Semaphore::signal() +{ return pthread_cond_signal(&sem); } + +inline int Semaphore::broadcast() +{ return pthread_cond_broadcast(&sem); } + +inline int Semaphore::wait() +{ return pthread_cond_wait(&sem, &mutex->mutex); } +#endif + } #endif