00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef _CAVERNPLUS_CONDITION_C
00018 #define _CAVERNPLUS_CONDITION_C
00019
00020 #include "CAVERNts_mutex_c.hxx"
00021
00022 #ifdef CAVERN_USE_GLOBUS_THREADS
00023 typedef globus_cond_t CAVERN_COND_T;
00024 #elif defined(CAVERN_USE_PTHREADS)
00025 typedef pthread_cond_t CAVERN_COND_T;
00026 #elif defined(CAVERN_USE_WINDOWSTHREADS)
00027 class _CAVERN_COND_T
00028 {
00029 public:
00030 _CAVERN_COND_T() {
00031 waiters = 0;
00032 wasBroadcast = 0;
00033 sema = CreateSemaphore(NULL, 0, 0xFFFFFFFF, NULL);
00034 waitersDone = CreateEvent(NULL, FALSE, FALSE, NULL);
00035 waitersLock = CreateMutex(NULL, FALSE, NULL);
00036 }
00037
00038 virtual ~_CAVERN_COND_T() {
00039 if (waitersDone) CloseHandle(waitersDone);
00040 if (waitersLock) CloseHandle(waitersLock);
00041 if (sema) CloseHandle(sema);
00042 }
00043
00044 long waiters;
00045 HANDLE waitersLock;
00046
00047
00048 HANDLE sema;
00049
00050
00051
00052
00053 HANDLE waitersDone;
00054
00055
00056 size_t wasBroadcast;
00057 };
00058
00059 typedef _CAVERN_COND_T * CAVERN_COND_T;
00060 #else
00061 #error One of CAVERN_USE_GLOBUS_THREADS, CAVERN_USE_PTHREADS, or CAVERN_USE_WINDOWSTHREADS must be defined.
00062 #endif
00063
00107 class CAVERNts_condition_c {
00108 public:
00109
00117 int wait(CAVERNts_mutex_c *mutex);
00118
00127 int signal();
00128
00135 int broadcastSignal();
00136
00138 CAVERN_COND_T *getCondition();
00139
00140 CAVERNts_condition_c();
00141 ~CAVERNts_condition_c();
00142
00143 private:
00144 CAVERN_COND_T itsCV;
00145 };
00146
00147
00148 #endif
00149