00001 00002 // -*- c++ -*- 00003 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 00004 00005 // O S C L _ M U T E X 00006 00007 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = 00008 00015 #ifndef OSCL_MUTEX_H_INCLUDED 00016 #define OSCL_MUTEX_H_INCLUDED 00017 00018 #ifndef OSCLCONFIG_PROC_H_INCLUDED 00019 #include "osclconfig_proc.h" 00020 #endif 00021 #ifndef OSCL_TYPES_H_INCLUDED 00022 #include "oscl_types.h" 00023 #endif 00024 #ifndef OSCL_BASE_H_INCLUDED 00025 #include "oscl_base.h" 00026 #endif 00027 #ifndef OSCL_THREAD_H_INCLUDED 00028 #include "oscl_thread.h" 00029 #endif 00030 #ifndef OSCL_LOCK_BASE_H_INCLUDED 00031 #include "oscl_lock_base.h" 00032 #endif 00033 00034 00038 class OsclMutex : public OsclLockBase 00039 { 00040 public: 00041 00045 OSCL_IMPORT_REF OsclMutex(); 00046 00050 OSCL_IMPORT_REF virtual ~OsclMutex(); 00051 00060 OSCL_IMPORT_REF OsclProcStatus::eOsclProcError Create(void); 00061 00062 00070 OSCL_IMPORT_REF void Lock(); 00071 00083 OSCL_IMPORT_REF OsclProcStatus::eOsclProcError TryLock(); 00084 00085 00093 OSCL_IMPORT_REF void Unlock(); 00094 00095 00104 OSCL_IMPORT_REF OsclProcStatus::eOsclProcError Close(void); 00105 00106 private: 00107 00115 OsclProcStatus::eOsclProcError ErrorMapping(int32 Error); 00116 00117 TOsclMutexObject ObjMutex; 00118 bool bCreated; 00119 00120 }; 00121 00136 #if !OSCL_HAS_NON_PREEMPTIVE_THREAD_SUPPORT 00137 //In pre-emptive threading, OsclNoYieldMutex is identical to OsclMutex 00138 typedef OsclMutex OsclNoYieldMutex; 00139 #else 00140 //In non-pre-emptive threading, OsclNoYieldMutex is a NO-OP. 00141 class OsclNoYieldMutex : public OsclLockBase 00142 { 00143 public: 00144 00148 OsclNoYieldMutex() 00149 { 00150 #ifndef NDEBUG 00151 iNumLock = 0; 00152 bCreated = false; 00153 #endif 00154 } 00155 00159 virtual ~OsclNoYieldMutex() 00160 {} 00161 00170 OsclProcStatus::eOsclProcError Create(void) 00171 { 00172 #ifndef NDEBUG 00173 if (bCreated) 00174 return OsclProcStatus::INVALID_OPERATION_ERROR; 00175 bCreated = true; 00176 #endif 00177 return OsclProcStatus::SUCCESS_ERROR; 00178 } 00179 00180 00188 void Lock() 00189 { 00190 #ifndef NDEBUG 00191 OSCL_ASSERT(bCreated); 00192 OSCL_ASSERT(iNumLock == 0);//detect deadlock condition. 00193 iNumLock++; 00194 #endif 00195 } 00196 00208 OsclProcStatus::eOsclProcError TryLock() 00209 { 00210 #ifndef NDEBUG 00211 if (!bCreated) 00212 return OsclProcStatus::INVALID_OPERATION_ERROR; 00213 if (iNumLock) 00214 return OsclProcStatus::MUTEX_LOCKED_ERROR; 00215 else 00216 Lock(); 00217 return OsclProcStatus::SUCCESS_ERROR; 00218 #endif 00219 } 00220 00221 00229 void Unlock() 00230 { 00231 #ifndef NDEBUG 00232 OSCL_ASSERT(bCreated); 00233 OSCL_ASSERT(iNumLock); 00234 if (iNumLock > 0) 00235 iNumLock--; 00236 #endif 00237 } 00238 00239 00248 OsclProcStatus::eOsclProcError Close(void) 00249 { 00250 #ifndef NDEBUG 00251 if (!bCreated) 00252 return OsclProcStatus::INVALID_OPERATION_ERROR; 00253 bCreated = false; 00254 #endif 00255 return OsclProcStatus::SUCCESS_ERROR; 00256 } 00257 00258 private: 00259 00260 #ifndef NDEBUG 00261 uint32 iNumLock; 00262 bool bCreated; 00263 #endif 00264 00265 }; 00266 #endif //OSCL_HAS_NON_PREEMPTIVE_THREAD_SUPPORT 00267 00271 class OsclThreadLock: public OsclLockBase 00272 { 00273 public: 00274 OSCL_IMPORT_REF OsclThreadLock(); 00275 OSCL_IMPORT_REF virtual ~OsclThreadLock(); 00276 OSCL_IMPORT_REF void Lock(); 00277 OSCL_IMPORT_REF void Unlock(); 00278 private: 00279 OsclMutex iMutex; 00280 }; 00281 00282 #endif 00283 00284 00285