3 #ifndef __ZMQ_CONDITON_VARIABLE_HPP_INCLUDED__
4 #define __ZMQ_CONDITON_VARIABLE_HPP_INCLUDED__
11 #if defined(ZMQ_USE_CV_IMPL_NONE)
15 class condition_variable_t
18 inline condition_variable_t () {
zmq_assert (
false); }
20 inline int wait (mutex_t *
mutex_,
int timeout_)
26 inline void broadcast () {
zmq_assert (
false); }
32 #elif defined(ZMQ_USE_CV_IMPL_WIN32API)
38 class condition_variable_t
41 inline condition_variable_t () { InitializeConditionVariable (&_cv); }
43 inline int wait (mutex_t *
mutex_,
int timeout_)
45 int rc = SleepConditionVariableCS (&_cv,
mutex_->get_cs (), timeout_);
52 if (rc != ERROR_TIMEOUT)
59 inline void broadcast () { WakeAllConditionVariable (&_cv); }
62 CONDITION_VARIABLE _cv;
68 #elif defined(ZMQ_USE_CV_IMPL_STL11)
70 #include <condition_variable>
74 class condition_variable_t
79 int wait (mutex_t *
mutex_,
int timeout_)
86 }
else if (_cv.wait_for (*
mutex_, std::chrono::milliseconds (timeout_))
102 std::condition_variable_any _cv;
108 #elif defined(ZMQ_USE_CV_IMPL_VXWORKS)
114 class condition_variable_t
119 inline ~condition_variable_t ()
121 scoped_lock_t l (_listenersMutex);
122 for (
size_t i = 0;
i < _listeners.size ();
i++) {
123 semDelete (_listeners[
i]);
127 inline int wait (mutex_t *
mutex_,
int timeout_)
135 SEM_ID sem = semBCreate (SEM_Q_PRIORITY, SEM_EMPTY);
137 scoped_lock_t l (_listenersMutex);
138 _listeners.push_back (sem);
144 rc = semTake (sem, WAIT_FOREVER);
146 int ticksPerSec = sysClkRateGet ();
147 int timeoutTicks = (timeout_ * ticksPerSec) / 1000 + 1;
148 rc = semTake (sem, timeoutTicks);
152 scoped_lock_t l (_listenersMutex);
154 for (
size_t i = 0;
i < _listeners.size ();
i++) {
155 if (_listeners[
i] == sem) {
156 _listeners.erase (_listeners.begin () +
i);
167 if (rc == S_objLib_OBJ_TIMEOUT) {
175 inline void broadcast ()
177 scoped_lock_t l (_listenersMutex);
178 for (
size_t i = 0;
i < _listeners.size ();
i++) {
179 semGive (_listeners[
i]);
184 mutex_t _listenersMutex;
185 std::vector<SEM_ID> _listeners;
191 #elif defined(ZMQ_USE_CV_IMPL_PTHREADS)
195 #if defined(__ANDROID_API__) && __ANDROID_API__ < 21
196 #define ANDROID_LEGACY
197 extern "C" int pthread_cond_timedwait_monotonic_np (pthread_cond_t *,
199 const struct timespec *);
204 class condition_variable_t
207 inline condition_variable_t ()
209 pthread_condattr_t attr;
210 pthread_condattr_init (&attr);
211 #if !defined(ZMQ_HAVE_OSX) && !defined(ANDROID_LEGACY)
212 pthread_condattr_setclock (&attr, CLOCK_MONOTONIC);
214 int rc = pthread_cond_init (&_cond, &attr);
218 inline ~condition_variable_t ()
220 int rc = pthread_cond_destroy (&_cond);
224 inline int wait (mutex_t *
mutex_,
int timeout_)
228 if (timeout_ != -1) {
235 rc = clock_gettime (CLOCK_MONOTONIC, &
timeout);
239 timeout.tv_sec += timeout_ / 1000;
240 timeout.tv_nsec += (timeout_ % 1000) * 1000000;
242 if (
timeout.tv_nsec >= 1000000000) {
247 rc = pthread_cond_timedwait_relative_np (
249 #elif defined(ANDROID_LEGACY)
250 rc = pthread_cond_timedwait_monotonic_np (
254 pthread_cond_timedwait (&_cond,
mutex_->get_mutex (), &
timeout);
257 rc = pthread_cond_wait (&_cond,
mutex_->get_mutex ());
271 inline void broadcast ()
273 int rc = pthread_cond_broadcast (&_cond);
278 pthread_cond_t _cond;