00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_CSUTIL_THREADING_PTHREAD_CONDITION_H__
00020 #define __CS_CSUTIL_THREADING_PTHREAD_CONDITION_H__
00021
00022 #ifndef DOXYGEN_RUN
00023
00024 #include "csutil/threading/atomicops.h"
00025 #include "csutil/threading/mutex.h"
00026 #include "csutil/noncopyable.h"
00027
00028 #include <sys/time.h>
00029
00030 namespace CS
00031 {
00032 namespace Threading
00033 {
00034 namespace Implementation
00035 {
00036
00037 class ConditionBase
00038 {
00039 public:
00040 ConditionBase ()
00041 {
00042 pthread_cond_init (&condition, 0);
00043 }
00044
00045 void NotifyOne ()
00046 {
00047 pthread_cond_signal (&condition);
00048 }
00049
00050 void NotifyAll ()
00051 {
00052 pthread_cond_broadcast (&condition);
00053 }
00054
00055 template<typename LockType>
00056 bool Wait (LockType& lock, csTicks timeout)
00057 {
00058 if (timeout > 0)
00059 {
00060 long const nsec_per_sec = 1000 * 1000 * 1000;
00061 struct timeval now;
00062 struct timespec to;
00063 gettimeofday (&now, 0);
00064 to.tv_sec = now.tv_sec + (timeout / 1000);
00065 to.tv_nsec = (now.tv_usec + (timeout % 1000) * 1000) * 1000;
00066 if (to.tv_nsec >= nsec_per_sec)
00067 {
00068 to.tv_sec += to.tv_nsec / nsec_per_sec;
00069 to.tv_nsec %= nsec_per_sec;
00070 }
00071 return pthread_cond_timedwait (&condition, &lock.mutex, &to)
00072 == 0;
00073 }
00074 else
00075 {
00076 pthread_cond_wait (&condition, &lock.mutex);
00077 return true;
00078 }
00079 }
00080
00081
00082 protected:
00083 pthread_cond_t condition;
00084 };
00085
00086 }
00087 }
00088 }
00089
00090 #endif // DOXYGEN_RUN
00091
00092 #endif // __CS_CSUTIL_THREADING_PTHREAD_CONDITION_H__