34 #ifndef _UCOMMON_CONDITION_H_
35 #define _UCOMMON_CONDITION_H_
37 #ifndef _UCOMMON_CPR_H_
41 #ifndef _UCOMMON_ACCESS_H_
45 #ifndef _UCOMMON_TIMERS_H_
49 #ifndef _UCOMMON_MEMORY_H_
61 class __EXPORT ConditionMutex
64 friend class ConditionVar;
65 friend class autolock;
67 __DELETE_COPY(ConditionMutex);
70 #if defined(_MSTHREADS_)
71 mutable CRITICAL_SECTION mutex;
73 mutable pthread_mutex_t mutex;
88 inline void lock(
void) {
89 EnterCriticalSection(&mutex);
92 inline void unlock(
void) {
93 LeaveCriticalSection(&mutex);
100 inline void lock(
void) {
101 pthread_mutex_lock(&mutex);
107 inline void unlock(
void) {
108 pthread_mutex_unlock(&mutex);
112 class __EXPORT autolock
116 CRITICAL_SECTION *mutex;
118 pthread_mutex_t *mutex;
120 __DELETE_COPY(autolock);
123 inline autolock(
const ConditionMutex*
object) {
124 mutex = &
object->mutex;
126 EnterCriticalSection(mutex);
128 pthread_mutex_lock(mutex);
134 LeaveCriticalSection(mutex);
136 pthread_mutex_unlock(mutex);
148 class __EXPORT ConditionVar
151 __DELETE_DEFAULTS(ConditionVar);
154 friend class ConditionList;
156 #if defined(_MSTHREADS_)
157 mutable CONDITION_VARIABLE cond;
159 mutable pthread_cond_t cond;
161 ConditionMutex *shared;
167 ConditionVar(ConditionMutex *mutex);
179 bool wait(timeout_t timeout);
186 bool wait(
struct timespec *timeout);
191 void broadcast(
void);
197 inline void wait(
void) {
198 pthread_cond_wait(&cond, &shared->mutex);
204 inline void signal(
void) {
205 pthread_cond_signal(&cond);
211 inline void broadcast(
void) {
212 pthread_cond_broadcast(&cond);
227 class __EXPORT Conditional :
protected ConditionMutex
230 __DELETE_COPY(Conditional);
233 friend class ConditionalAccess;
234 friend class ConditionVar;
236 #if defined(_MSTHREADS_)
237 mutable CONDITION_VARIABLE cond;
240 class __LOCAL attribute
243 pthread_condattr_t attr;
247 __LOCAL
static attribute attr;
250 mutable pthread_cond_t cond;
253 friend class TimedEvent;
260 bool wait(timeout_t timeout);
267 bool wait(
struct timespec *timeout);
272 void broadcast(
void);
278 inline void wait(
void) {
279 pthread_cond_wait(&cond, &mutex);
285 inline void signal(
void) {
286 pthread_cond_signal(&cond);
292 inline void broadcast(
void) {
293 pthread_cond_broadcast(&cond);
307 friend class autolock;
310 #if !defined(_MSTHREADS_) && !defined(__PTH__)
316 static inline pthread_condattr_t *initializer(
void) {
327 static void set(
struct timespec *hires, timeout_t timeout);
337 class __EXPORT ConditionalAccess :
private Conditional
340 __DELETE_COPY(ConditionalAccess);
343 #if defined _MSTHREADS_
344 CONDITION_VARIABLE bcast;
346 mutable pthread_cond_t bcast;
349 static unsigned max_sharing;
351 unsigned pending, waiting, sharing;
358 bool waitSignal(timeout_t timeout);
365 bool waitBroadcast(timeout_t timeout);
373 bool waitSignal(
struct timespec *timeout);
380 bool waitBroadcast(
struct timespec *timeout);
388 inline static void set(
struct timespec *hires, timeout_t timeout) {
389 Conditional::set(hires, timeout);
394 inline void lock(
void) {
395 EnterCriticalSection(&mutex);
398 inline void unlock(
void) {
399 LeaveCriticalSection(&mutex);
402 void waitSignal(
void);
404 void waitBroadcast(
void);
406 inline void signal(
void) {
407 Conditional::signal();
410 inline void broadcast(
void) {
411 Conditional::broadcast();
418 inline void lock(
void) {
419 pthread_mutex_lock(&mutex);
425 inline void unlock(
void) {
426 pthread_mutex_unlock(&mutex);
432 inline void waitSignal(
void) {
433 pthread_cond_wait(&cond, &mutex);
439 inline void waitBroadcast(
void) {
440 pthread_cond_wait(&bcast, &mutex);
447 inline void signal(
void) {
448 pthread_cond_signal(&cond);
454 inline void broadcast(
void) {
455 pthread_cond_broadcast(&bcast);
467 ~ConditionalAccess();
495 void limit_sharing(
unsigned max);
508 class __EXPORT ConditionalLock :
protected ConditionalAccess,
public __PROTOCOL SharedProtocol
511 __DELETE_COPY(ConditionalLock);
514 class Context :
public LinkedObject
517 __DELETE_COPY(Context);
520 inline Context(LinkedObject **root) : LinkedObject(root) {}
526 LinkedObject *contexts;
528 virtual void _share(
void) __OVERRIDE;
529 virtual void _unshare(
void) __OVERRIDE;
531 Context *getContext(
void);
568 virtual void exclusive(
void);
573 virtual void share(
void);
588 class __EXPORT Barrier :
private Conditional
594 __DELETE_DEFAULTS(Barrier);
601 Barrier(
unsigned count);
613 void set(
unsigned count);
629 unsigned operator++(
void);
631 unsigned operator--(
void);
644 bool wait(timeout_t timeout);
655 class __EXPORT Semaphore :
public __PROTOCOL SharedProtocol,
protected Conditional
658 unsigned count, waits, used;
660 virtual void _share(
void) __OVERRIDE;
661 virtual void _unshare(
void) __OVERRIDE;
663 __DELETE_COPY(Semaphore);
666 typedef autoshared<Semaphore> autosync;
672 Semaphore(
unsigned count = 0);
679 Semaphore(
unsigned count,
unsigned avail);
694 bool wait(timeout_t timeout);
700 void set(
unsigned count);
710 inline void operator++(
void) {
717 inline void operator--(
void) {