00001 /* === S Y N F I G ========================================================= */ 00021 /* ========================================================================= */ 00022 00023 /* === S T A R T =========================================================== */ 00024 00025 #ifndef __SYNFIG_MUTEX_H 00026 #define __SYNFIG_MUTEX_H 00027 00028 /* === H E A D E R S ======================================================= */ 00029 00030 /* === M A C R O S ========================================================= */ 00031 00032 /* === T Y P E D E F S ===================================================== */ 00033 00034 /* === C L A S S E S & S T R U C T S ======================================= */ 00035 00036 namespace synfig { 00037 00038 class RecMutex; 00039 00040 class Mutex 00041 { 00042 friend class RecMutex; 00043 00044 protected: 00045 void* blackbox; 00046 00047 public: 00048 00049 class Lock 00050 { 00051 Mutex& mutex; 00052 public: 00053 Lock(Mutex& x):mutex(x) { mutex.lock(); } 00054 ~Lock() { mutex.unlock(); } 00055 }; 00056 00057 Mutex(); 00058 ~Mutex(); 00059 00060 void lock(); 00061 void unlock(); 00062 bool try_lock(); 00063 bool is_locked(); 00064 00065 private: 00067 Mutex(const Mutex&); 00068 00070 void operator=(const Mutex&); 00071 }; 00072 00073 class RecMutex : public Mutex 00074 { 00075 public: 00076 RecMutex(); 00077 00078 void unlock_all(); 00079 }; 00080 00081 class RWLock 00082 { 00083 void* blackbox; 00084 00085 public: 00086 00087 class ReaderLock 00088 { 00089 RWLock& rw_lock; 00090 public: 00091 ReaderLock(RWLock& x):rw_lock(x) { rw_lock.reader_lock(); } 00092 ~ReaderLock() { rw_lock.reader_unlock(); } 00093 }; 00094 class WriterLock 00095 { 00096 RWLock& rw_lock; 00097 public: 00098 WriterLock(RWLock& x):rw_lock(x) { rw_lock.writer_lock(); } 00099 ~WriterLock() { rw_lock.writer_unlock(); } 00100 }; 00101 00102 RWLock(); 00103 ~RWLock(); 00104 00105 void reader_lock(); 00106 void reader_unlock(); 00107 bool reader_trylock(); 00108 00109 void writer_lock(); 00110 void writer_unlock(); 00111 bool writer_trylock(); 00112 }; 00113 00114 }; // END of namespace synfig 00115 00116 /* === E N D =============================================================== */ 00117 00118 #endif