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 #ifdef __APPLE__
00022 #include <limits.h>
00023 #include <CoreServices/CoreServices.h>
00024 #else
00025 #include <semaphore.h>
00026 #endif
00027
00028 #include <boost/utility.hpp>
00029
00030 namespace Raul {
00031
00032
00037 class Semaphore : boost::noncopyable {
00038 public:
00039 inline Semaphore(unsigned int initial) {
00040 #ifdef __APPLE__
00041 MPCreateSemaphore(UINT_MAX, initial, &_sem);
00042 #else
00043 sem_init(&_sem, 0, initial);
00044 #endif
00045 }
00046
00047 inline ~Semaphore() {
00048 #ifdef __APPLE__
00049 MPDeleteSemaphore(_sem);
00050 #else
00051 sem_destroy(&_sem);
00052 #endif
00053 }
00054
00059 inline void reset(unsigned int initial) {
00060 #ifdef __APPLE__
00061 MPDeleteSemaphore(_sem);
00062 MPCreateSemaphore(UINT_MAX, initial, &_sem);
00063 #else
00064 sem_destroy(&_sem);
00065 sem_init(&_sem, 0, initial);
00066 #endif
00067 }
00068
00073 inline void post() {
00074 #ifdef __APPLE__
00075 MPSignalSemaphore(_sem);
00076 #else
00077 sem_post(&_sem);
00078 #endif
00079 }
00080
00085 inline void wait() {
00086 #ifdef __APPLE__
00087 MPWaitOnSemaphore(_sem, kDurationForever);
00088 #else
00089
00090
00091
00092
00093 while (sem_wait(&_sem) != 0) {}
00094 #endif
00095 }
00096
00103 inline bool try_wait() {
00104 #ifdef __APPLE__
00105 return MPWaitOnSemaphore(_sem, kDurationImmediate) == noErr;
00106 #else
00107 return (sem_trywait(&_sem) == 0);
00108 #endif
00109 }
00110
00111 private:
00112 #ifdef __APPLE__
00113 MPSemaphoreID _sem;
00114 #else
00115 sem_t _sem;
00116 #endif
00117 };
00118
00119
00120 }
00121
00122 #endif // RAUL_SEMAPHORE_HPP