00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __itkConditionVariable_h
00018 #define __itkConditionVariable_h
00019
00020 #include "itkConfigure.h"
00021
00022
00023
00024
00025
00026 #ifdef ITK_USE_WIN32_THREADS
00027 #undef _WIN32_WINNT
00028 #define _WIN32_WINNT 0x0400
00029 #endif
00030
00031 #include "itkMutexLock.h"
00032 #include "itkLightObject.h"
00033
00034
00035 namespace itk {
00036
00067 class ITKCommon_EXPORT ConditionVariable : public LightObject
00068 {
00069 public:
00071 typedef ConditionVariable Self;
00072 typedef LightObject Superclass;
00073 typedef SmartPointer<Self> Pointer;
00074 typedef SmartPointer<const Self> ConstPointer;
00075
00077 itkNewMacro(Self);
00078
00080 itkTypeMacro(ConditionVariable, LightObject);
00081
00085 void Wait(SimpleMutexLock * mutex);
00086
00088 void Signal();
00089
00091 void Broadcast();
00092
00093 protected:
00094 ConditionVariable();
00095 ~ConditionVariable();
00096
00097 private:
00098 ConditionVariable(const Self & other);
00099 const Self & operator=( const Self & );
00100 #ifdef ITK_USE_PTHREADS
00101 pthread_cond_t m_ConditionVariable;
00102 MutexType m_Mutex;
00103 #else
00104 int m_NumberOfWaiters;
00105 #ifdef WIN32
00106 CRITICAL_SECTION m_NumberOfWaitersLock;
00107
00108
00109 HANDLE m_Semaphore;
00110 HANDLE m_WaitersAreDone;
00111
00112
00113
00114
00115
00116 size_t m_WasBroadcast;
00117
00118 #endif
00119 #endif
00120 };
00121
00122 }
00123
00124 #endif
00125