00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef RAUL_SEMAPHORE_HPP
00019 #define RAUL_SEMAPHORE_HPP
00020
00021 #include <semaphore.h>
00022 #include <boost/utility.hpp>
00023
00024 namespace Raul {
00025
00026
00039 class Semaphore : boost::noncopyable {
00040 public:
00041 inline Semaphore(unsigned int initial) { sem_init(&_sem, 0, initial); }
00042
00043 inline ~Semaphore() { sem_destroy(&_sem); }
00044
00045 inline void reset(unsigned int initial) {
00046 sem_destroy(&_sem);
00047 sem_init(&_sem, 0, initial);
00048 }
00049
00050 inline bool has_waiter() {
00051 int val;
00052 sem_getvalue(&_sem, &val);
00053 return (val <= 0);
00054 }
00055
00060 inline void post() { sem_post(&_sem); }
00061
00069 inline void wait() { while (sem_wait(&_sem) != 0) ; }
00070
00077 inline bool try_wait() { return (sem_trywait(&_sem) == 0); }
00078
00079 private:
00080 sem_t _sem;
00081 };
00082
00083
00084 }
00085
00086 #endif // RAUL_SEMAPHORE_HPP