29 #ifndef RCF_DETAIL_POSIX_EVENT_HPP
30 #define RCF_DETAIL_POSIX_EVENT_HPP
32 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
34 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
36 #if defined(BOOST_HAS_PTHREADS)
38 #include <boost/assert.hpp>
42 #include <RCF/thread/push_options.hpp>
54 RCF_EXPORT posix_event();
59 ::pthread_cond_destroy(&cond_);
63 template <
typename Lock>
64 void signal_one(Lock& lock)
66 BOOST_ASSERT(lock.locked());
68 ::pthread_cond_signal(&cond_);
72 template <
typename Lock>
73 void signal_all(Lock& lock)
75 BOOST_ASSERT(lock.locked());
77 ::pthread_cond_broadcast(&cond_);
81 template <
typename Lock>
82 void clear(Lock& lock)
84 BOOST_ASSERT(lock.locked());
89 template <
typename Lock>
94 BOOST_ASSERT(lock.locked());
95 ::pthread_cond_wait(&cond_, &lock.mutex().mutex_);
98 template <
typename Lock>
99 bool timed_wait(Lock& lock, boost::uint32_t waitMs)
101 BOOST_ASSERT(lock.locked());
105 #ifdef RCF_USE_CLOCK_MONOTONIC
107 struct timespec ts = {0};
108 clock_gettime(CLOCK_MONOTONIC, &ts);
112 struct timeval tp = {0};
113 gettimeofday(&tp, NULL);
116 struct timespec ts = {0};
117 ts.tv_sec = tp.tv_sec;
118 ts.tv_nsec = tp.tv_usec * 1000;
123 ts.tv_sec += (waitMs / 1000);
124 boost::uint32_t remainderMs = waitMs % 1000;
125 ts.tv_nsec += (remainderMs * 1000 * 1000);
128 if (ts.tv_nsec >= 1000*1000*1000)
130 BOOST_ASSERT(ts.tv_nsec < 2*1000*1000*1000);
132 ts.tv_nsec -= 1000*1000*1000;
137 int ret = ::pthread_cond_timedwait(&cond_, &lock.mutex().mutex_, &ts);
138 if (ret == ETIMEDOUT)
147 template <
typename Lock>
148 void notify_all(Lock& lock)
154 ::pthread_cond_t cond_;
155 ::pthread_condattr_t condattr_;
161 #include <RCF/thread/pop_options.hpp>
164 #endif // defined(BOOST_HAS_PTHREADS)
166 #endif // RCF_DETAIL_POSIX_EVENT_HPP