00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _ThreadLibrary_Semaphore_H_
00018 #define _ThreadLibrary_Semaphore_H_ 1
00019
00030 #include <lib/sconfig.h>
00031
00032
00033 #if USE_PRIVATE__POSIX_SEMAPHORES
00034 #include <errno.h>
00035 #include <semaphore.h>
00036 #else
00037 #include <lib/threads/mutex.h>
00038 #include <lib/threads/condition.h>
00039 #endif
00040
00041
00051 class Semaphore
00052 {
00053 private:
00054 #if USE_PRIVATE__POSIX_SEMAPHORES
00055 sem_t s;
00056 #else
00057 ConditionMutex m;
00058 WaitCondition c;
00059 volatile int v;
00060 #endif
00061
00062 public:
00064 inline Semaphore(int initial_value=0)
00065 #if USE_PRIVATE__POSIX_SEMAPHORES
00066 { sem_init(&s,0,initial_value); }
00067 #else
00068 : m(),c(),v(initial_value) { }
00069 #endif
00070
00073 inline ~Semaphore()
00074 #if USE_PRIVATE__POSIX_SEMAPHORES
00075 { sem_destroy(&s); }
00076 #else
00077 { }
00078 #endif
00079
00081 int value()
00082 #if USE_PRIVATE__POSIX_SEMAPHORES
00083 { int val; sem_getvalue(&s,&val); return(val); }
00084 #else
00085 { m.lock(); int val=v; m.unlock(); return(val); }
00086 #endif
00087
00089 #if USE_PRIVATE__POSIX_SEMAPHORES
00090 inline void post() { sem_post(&s); }
00091 #else
00092 void post();
00093 #endif
00094
00097 #if USE_PRIVATE__POSIX_SEMAPHORES
00098 inline void wait() { sem_wait(&s); }
00099 #else
00100 void wait();
00101 #endif
00102
00105 #if USE_PRIVATE__POSIX_SEMAPHORES
00106 inline bool test() { return(sem_trywait(&s)==EAGAIN); }
00107 #else
00108 bool test();
00109 #endif
00110
00111 };
00112
00113 #endif