Main Page   Modules   Class Hierarchy   Data Structures   File List   Data Fields   Globals  

oscl_mutex.h

Go to the documentation of this file.
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 

OSCL API
Posting Version: OPENCORE_20090310