00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef FIX_MUTEX_H
00023 #define FIX_MUTEX_H
00024
00025 #include "Utility.h"
00026
00027 namespace FIX
00028 {
00030 class Mutex
00031 {
00032 public:
00033 Mutex()
00034 {
00035 #ifdef _MSC_VER
00036 InitializeCriticalSection( &m_mutex );
00037 #else
00038 m_count = 0;
00039 m_threadID = 0;
00040
00041
00042
00043
00044 pthread_mutex_init( &m_mutex, 0 );
00045 #endif
00046 }
00047
00048 ~Mutex()
00049 {
00050 #ifdef _MSC_VER
00051 DeleteCriticalSection( &m_mutex );
00052 #else
00053 pthread_mutex_destroy( &m_mutex );
00054 #endif
00055 }
00056
00057 void lock()
00058 {
00059 #ifdef _MSC_VER
00060 EnterCriticalSection( &m_mutex );
00061 #else
00062 if ( m_count && m_threadID == pthread_self() )
00063 { ++m_count; return ; }
00064 pthread_mutex_lock( &m_mutex );
00065 ++m_count;
00066 m_threadID = pthread_self();
00067 #endif
00068 }
00069
00070 void unlock()
00071 {
00072 #ifdef _MSC_VER
00073 LeaveCriticalSection( &m_mutex );
00074 #else
00075 if ( m_count > 1 )
00076 { m_count--; return ; }
00077 --m_count;
00078 m_threadID = 0;
00079 pthread_mutex_unlock( &m_mutex );
00080 #endif
00081 }
00082
00083 private:
00084
00085 #ifdef _MSC_VER
00086 CRITICAL_SECTION m_mutex;
00087 #else
00088 pthread_mutex_t m_mutex;
00089 pthread_t m_threadID;
00090 int m_count;
00091 #endif
00092 };
00093
00095 class Locker
00096 {
00097 public:
00098 Locker( Mutex& mutex )
00099 : m_mutex( mutex )
00100 {
00101 m_mutex.lock();
00102 }
00103
00104 ~Locker()
00105 {
00106 m_mutex.unlock();
00107 }
00108 private:
00109 Mutex& m_mutex;
00110 };
00111
00113 class ReverseLocker
00114 {
00115 public:
00116 ReverseLocker( Mutex& mutex )
00117 : m_mutex( mutex )
00118 {
00119 m_mutex.unlock();
00120 }
00121
00122 ~ReverseLocker()
00123 {
00124 m_mutex.lock();
00125 }
00126 private:
00127 Mutex& m_mutex;
00128 };
00129 }
00130
00131 #endif