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
00031 class Semaphore : boost::noncopyable {
00032 public:
00033 inline Semaphore(unsigned int initial) { sem_init(&_sem, 0, initial); }
00034
00035 inline ~Semaphore() { sem_destroy(&_sem); }
00036
00037 inline void reset(unsigned int initial) {
00038 sem_destroy(&_sem);
00039 sem_init(&_sem, 0, initial);
00040 }
00041
00042 inline bool has_waiter() {
00043 int val;
00044 sem_getvalue(&_sem, &val);
00045 return (val <= 0);
00046 }
00047
00052 inline void post() { sem_post(&_sem); }
00053
00061 inline void wait() { while (sem_wait(&_sem) != 0) {} }
00062
00069 inline bool try_wait() { return (sem_trywait(&_sem) == 0); }
00070
00071 private:
00072 sem_t _sem;
00073 };
00074
00075
00076 }
00077
00078 #endif // RAUL_SEMAPHORE_HPP