00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef INCLUDED_THREAD_SYNCHRONIZE_HH
00024 #define INCLUDED_THREAD_SYNCHRONIZE_HH
00025
00026 namespace fatalmind {
00027
00028 template<class Lock>
00029 class Synchronize {
00030 public:
00031 inline Synchronize(Lock& lock): _lock(lock) {
00032 _lock.lock();
00033 }
00034
00035 inline Synchronize(Synchronize& rho)
00036 : _lock(rho._lock)
00037 {
00038 _lock.recursive_ok();
00039 }
00040
00041 inline ~Synchronize() {
00042 _lock.unlock();
00043 }
00044 private:
00045 Lock& _lock;
00046 };
00047
00048
00049 template<> class Synchronize<NopLock<> > {
00050 public:
00051 inline Synchronize(NopLock<> lock) {
00052 }
00053 inline ~Synchronize() {
00054 }
00055 };
00056
00057
00058
00059
00060
00061 template<class Lock, class Lock2>
00062 class Synchronize2 {
00063 public:
00064 inline Synchronize2(Lock& lock, Lock2& lock2)
00065 : _lock(lock)
00066 , _lock2(lock2)
00067 {
00068 _lock.lock();
00069
00070 if (&_lock != &_lock) {
00071 _lock2.lock();
00072 }
00073 }
00074
00075 inline ~Synchronize2() {
00076 if (&_lock != &_lock) {
00077 _lock2.unlock();
00078 }
00079 _lock.unlock();
00080 }
00081 private:
00082 Lock& _lock;
00083 Lock2& _lock2;
00084 };
00085
00086 template<> class Synchronize2<NopLock<> , NopLock<> > {
00087 public:
00088 inline Synchronize2(NopLock<>& lock, NopLock<>& lock2) {
00089 }
00090 inline ~Synchronize2() {
00091 }
00092 };
00093
00094 }
00095
00096 #endif