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 #include "ArExport.h"
00027 #include "ariaOSDef.h"
00028 #include "ArMutex.h"
00029 #include "ArLog.h"
00030
00031
00032 ArMutex::ArMutex() :
00033 myFailedInit(false),
00034 myMutex()
00035 {
00036 myLog = false;
00037 myLogName = "";
00038 myMutex=CreateMutex(0, true, 0);
00039 if (!myMutex)
00040 {
00041 myFailedInit=true;
00042 ArLog::logNoLock(ArLog::Terse, "ArMutex::ArMutex: Failed to initialize mutex %s", myLogName.c_str());
00043 }
00044 else
00045 unlock();
00046
00047 myStrMap[STATUS_FAILED_INIT]="Failed to initialize";
00048 myStrMap[STATUS_FAILED]="General failure";
00049 myStrMap[STATUS_ALREADY_LOCKED]="Mutex already locked";
00050 }
00051
00052 ArMutex::~ArMutex()
00053 {
00054 if (!myFailedInit && !CloseHandle(myMutex))
00055 ArLog::logNoLock(ArLog::Terse, "ArMutex::~ArMutex: Failed to destroy mutex.");
00056 }
00057
00058 int ArMutex::lock()
00059 {
00060 DWORD ret;
00061
00062 if (myLog)
00063 ArLog::log(ArLog::Terse, "Locking %s", myLogName.c_str());
00064 if (myFailedInit)
00065 {
00066 ArLog::logNoLock(ArLog::Terse, "ArMutex::lock: Initialization of mutex %s failed, failed lock", myLogName.c_str());
00067 return(STATUS_FAILED_INIT);
00068 }
00069
00070 ret=WaitForSingleObject(myMutex, INFINITE);
00071 if (ret == WAIT_ABANDONED)
00072 {
00073 ArLog::logNoLock(ArLog::Terse, "ArMutex::lock: Tried to lock a mutex %s which was locked by a different thread and never unlocked before that thread exited. This is a recoverable error", myLogName.c_str());
00074 return(lock());
00075 }
00076 else if (ret == WAIT_OBJECT_0)
00077 return(0);
00078 else
00079 {
00080 ArLog::logNoLock(ArLog::Terse, "ArMutex::lock: Failed to lock %s due to an unknown error", myLogName.c_str());
00081 return(STATUS_FAILED);
00082 }
00083
00084 return(0);
00085 }
00086
00087 int ArMutex::tryLock()
00088 {
00089 DWORD ret;
00090
00091 if (myFailedInit)
00092 {
00093 ArLog::logNoLock(ArLog::Terse, "ArMutex::lock: Initialization of mutex %s failed, failed lock", myLogName.c_str());
00094 return(STATUS_FAILED_INIT);
00095 }
00096
00097
00098 ret=WaitForSingleObject(myMutex, 1);
00099 if (ret == WAIT_ABANDONED)
00100 {
00101 ArLog::logNoLock(ArLog::Terse, "ArMutex::lock: Tried to lock mutex %s nwhich was locked by a different thread and never unlocked before that thread exited. This is a recoverable error", myLogName.c_str());
00102 return(lock());
00103 }
00104 else if (ret == WAIT_TIMEOUT)
00105 {
00106 ArLog::logNoLock(ArLog::Terse, "ArMutex::tryLock: Could not lock mutex %s because it is already locked", myLogName.c_str());
00107 return(STATUS_ALREADY_LOCKED);
00108 }
00109 else if (ret == WAIT_OBJECT_0)
00110 return(0);
00111 else
00112 {
00113 ArLog::logNoLock(ArLog::Terse, "ArMutex::lock: Failed to lock %s due to an unknown error", myLogName.c_str());
00114 return(STATUS_FAILED);
00115 }
00116
00117 return(0);
00118 }
00119
00120 int ArMutex::unlock()
00121 {
00122 if (myLog)
00123 ArLog::log(ArLog::Terse, "Unlocking %s", myLogName.c_str());
00124 if (myFailedInit)
00125 {
00126 ArLog::logNoLock(ArLog::Terse, "ArMutex::unlock: Initialization of mutex %s failed, failed unlock", myLogName.c_str());
00127 return(STATUS_FAILED_INIT);
00128 }
00129
00130 if (!ReleaseMutex(myMutex))
00131 {
00132 ArLog::logNoLock(ArLog::Terse, "ArMutex::unlock: Failed to unlock %s due to an unknown error", myLogName.c_str());
00133 return(STATUS_FAILED);
00134 }
00135
00136 return(0);
00137 }
00138
00139 AREXPORT const char * ArMutex::getError(int messageNumber) const
00140 {
00141 ArStrMap::const_iterator it;
00142 if ((it = myStrMap.find(messageNumber)) != myStrMap.end())
00143 return (*it).second.c_str();
00144 else
00145 return NULL;
00146
00147 }