Condition.hxx
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __CONDITION__
00023 #define __CONDITION__
00024
00025 #include "ErrSystem.hxx"
00026 #include "Lock.hxx"
00027 #include <pthread.h>
00028
00029 namespace CLAM
00030 {
00031
00032 struct xtime;
00033
00034 class Condition
00035 {
00036 public:
00037 Condition();
00038 ~Condition();
00039
00040 void NotifyOne();
00041 void NotifyAll();
00042
00043 template <typename L>
00044 void Wait( L& lock )
00045 {
00046 if ( !lock )
00047 throw LockError("Invalid lock");
00048
00049 DoWait( lock.mMutex );
00050 }
00051
00052 template <typename L, typename Pr >
00053 void Wait( L& lock, Pr predicate )
00054 {
00055 if ( !lock )
00056 throw LockError("Invalid lock");
00057
00058 while ( !predicate() )
00059 DoWait( lock.mMutex );
00060 }
00061
00062 template <typename L>
00063 bool TimedWait( L& lock, const xtime& xt )
00064 {
00065 if (!lock )
00066 throw LockError();
00067
00068 return DoTimedWait( lock.mMutex, xt );
00069 }
00070
00071 template <typename L, typename Pr>
00072 bool TimedWait( L& lock, const xtime& xt, Pr predicate )
00073 {
00074 if ( !lock )
00075 throw LockError();
00076
00077 while( !predicate() )
00078 {
00079 if (!DoTimedWait( lock.mMutex, xt ) )
00080 return false;
00081 }
00082
00083 return true;
00084 }
00085
00086 private:
00087
00088 template <typename M>
00089 void DoWait( M& mutex )
00090 {
00091 typedef typename Hidden::LockOps<M> LockOps;
00092 typename LockOps::LockState state;
00093
00094 LockOps::Unlock( mutex, state );
00095 DoWait( state.pmutex );
00096 LockOps::Lock( mutex, state );
00097 }
00098
00099 template <typename M>
00100 bool DoTimedWait( M& mutex, const xtime& xt )
00101 {
00102 typedef typename Hidden::LockOps<M> LockOps;
00103 typename LockOps::LockState state;
00104
00105 LockOps::Unlock( mutex, state );
00106
00107 bool ret = false;
00108
00109 ret = DoTimedWait( xt, state.pmutex );
00110
00111 LockOps::Lock( mutex, state );
00112
00113 return ret;
00114 }
00115
00116 void DoWait( pthread_mutex_t* pMutex );
00117
00118 bool DoTimedWait( const xtime& xt, pthread_mutex_t* pMutex);
00119
00120 pthread_cond_t mCondition;
00121 };
00122
00123 }
00124
00125 #endif // Condition.hxx
00126