00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef TEMUTEX_H
00030 #define TEMUTEX_H
00031
00032 #include "TeAgnostic.h"
00033 #include "TeDefines.h"
00034
00035 #if TePLATFORM == TePLATFORMCODE_MSWINDOWS
00036 #include <windows.h>
00037 #elif TePLATFORM == TePLATFORMCODE_LINUX || TePLATFORM == TePLATFORMCODE_AIX || TePLATFORM == TePLATFORMCODE_APPLE
00038 #include <pthread.h>
00039 #include <errno.h>
00040 #else
00041 #error "ERROR: Unsupported platform"
00042 #endif
00043
00044
00045
00046
00047
00048
00049 class TL_DLL TeMutex
00050 {
00051 public :
00052
00053
00054
00055
00056 TeMutex();
00057
00058
00059
00060
00061 ~TeMutex();
00062
00063
00064
00065
00066
00067
00068 inline void lock()
00069 {
00070 #if TePLATFORM == TePLATFORMCODE_MSWINDOWS
00071
00072 DWORD return_value = 0;
00073 return_value = ::WaitForSingleObject( m_access_, INFINITE );
00074 TEAGN_DEBUG_CONDITION( ( ( return_value == WAIT_ABANDONED ) ||
00075 ( return_value == WAIT_OBJECT_0 ) ),
00076 "Unable to get mutex lock" );
00077
00078 #elif TePLATFORM == TePLATFORMCODE_LINUX || TePLATFORM == TePLATFORMCODE_AIX || TePLATFORM == TePLATFORMCODE_APPLE
00079
00080 pthread_mutex_lock( &m_access_ );
00081
00082 #else
00083 #error "Unsuported plataform"
00084 #endif
00085 };
00086
00087
00088
00089
00090
00091
00092
00093 inline bool tryLock()
00094 {
00095 #if TePLATFORM == TePLATFORMCODE_MSWINDOWS
00096
00097 DWORD return_value = ::WaitForSingleObject( m_access_,
00098 10 );
00099
00100 if( ( return_value == WAIT_OBJECT_0 ) ||
00101 ( return_value == WAIT_ABANDONED ) ) {
00102
00103 return true;
00104 } else {
00105 return false;
00106 }
00107
00108 #elif TePLATFORM == TePLATFORMCODE_LINUX || TePLATFORM == TePLATFORMCODE_AIX || TePLATFORM == TePLATFORMCODE_APPLE
00109
00110
00111 if( pthread_mutex_trylock( &m_access_ ) == EBUSY ) {
00112 return false;
00113 } else {
00114 return true;
00115 }
00116
00117 #else
00118 #error "Unsuported plataform"
00119 #endif
00120 };
00121
00122
00123
00124
00125 inline void unLock()
00126 {
00127 #if TePLATFORM == TePLATFORMCODE_MSWINDOWS
00128
00129 ::ReleaseMutex( m_access_ );
00130
00131 #elif TePLATFORM == TePLATFORMCODE_LINUX || TePLATFORM == TePLATFORMCODE_AIX || TePLATFORM == TePLATFORMCODE_APPLE
00132
00133
00134 pthread_mutex_unlock( &m_access_ );
00135
00136 #else
00137 #error "Unsuported plataform"
00138 #endif
00139 };
00140
00141 protected :
00142
00143 #if TePLATFORM == TePLATFORMCODE_MSWINDOWS
00144
00145
00146
00147
00148 HANDLE m_access_;
00149
00150
00151
00152
00153 SECURITY_ATTRIBUTES m_sa_;
00154
00155 #elif TePLATFORM == TePLATFORMCODE_LINUX || TePLATFORM == TePLATFORMCODE_AIX || TePLATFORM == TePLATFORMCODE_APPLE
00156
00157
00158
00159
00160
00161 pthread_mutex_t m_access_;
00162
00163 #else
00164 #error "Unsuported plataform"
00165 #endif
00166
00167 private :
00168
00169
00170
00171
00172 TeMutex( const TeMutex& ) {};
00173
00174
00175
00176
00177
00178
00179 const TeMutex& operator=( const TeMutex& ) { return *this; };
00180
00181 };
00182
00183 #endif