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
00030
00036 #include "OW_config.h"
00037 #include "OW_NonRecursiveMutexImpl.hpp"
00038 #include <cerrno>
00039 #include <cassert>
00040
00041 namespace OW_NAMESPACE
00042 {
00043
00044 namespace NonRecursiveMutexImpl
00045 {
00046
00052 int
00053 createMutex(NonRecursiveMutex_t& handle)
00054 {
00055 #if defined(OW_USE_PTHREAD)
00056 pthread_mutexattr_t attr;
00057 int res = pthread_mutexattr_init(&attr);
00058 assert(res == 0);
00059 if (res != 0)
00060 {
00061 return -1;
00062 }
00063
00064 res = pthread_mutex_init(&handle.mutex, &attr);
00065 pthread_mutexattr_destroy(&attr);
00066 if (res != 0)
00067 {
00068 return -1;
00069 }
00070
00071 return 0;
00072 #elif defined(OW_WIN32)
00073 int cc = -1;
00074 if ((handle = CreateMutex(NULL, FALSE, NULL)))
00075 {
00076 cc = 0;
00077 }
00078 return cc;
00079 #else
00080 #error "port me!"
00081 #endif
00082 }
00092 int
00093 destroyMutex(NonRecursiveMutex_t& handle)
00094 {
00095 #if defined(OW_USE_PTHREAD)
00096 switch (pthread_mutex_destroy(&handle.mutex))
00097 {
00098 case 0:
00099 break;
00100 case EBUSY:
00101 return -1;
00102 break;
00103 default:
00104 return -2;
00105 }
00106 return 0;
00107 #elif defined (OW_WIN32)
00108 ReleaseMutex(handle);
00109 return (CloseHandle(handle) == 0) ? -2 : 0;
00110 #else
00111 #error "port me!"
00112 #endif
00113 }
00122 int
00123 acquireMutex(NonRecursiveMutex_t& handle)
00124 {
00125 #if defined (OW_USE_PTHREAD)
00126 int res = pthread_mutex_lock(&handle.mutex);
00127 assert(res == 0);
00128 return res;
00129 #elif defined (OW_WIN32)
00130 int cc = -1;
00131 if (WaitForSingleObject(handle, INFINITE) != WAIT_FAILED)
00132 {
00133 cc = 0;
00134 }
00135 return cc;
00136 #else
00137 #error "port me!"
00138 #endif
00139 }
00146 int
00147 releaseMutex(NonRecursiveMutex_t& handle)
00148 {
00149 #if defined (OW_USE_PTHREAD)
00150 int res = pthread_mutex_unlock(&handle.mutex);
00151 assert(res == 0);
00152 return res;
00153
00154 #elif defined (OW_WIN32)
00155 return (ReleaseMutex(handle)) ? 0 : -1;
00156 #else
00157 #error "port me!"
00158 #endif
00159 }
00160
00161 int
00162 conditionPreWait(NonRecursiveMutex_t& handle, NonRecursiveMutexLockState& state)
00163 {
00164 #if defined (OW_WIN32)
00165 state.pmutex = &handle;
00166 #else
00167 state.pmutex = &handle.mutex;
00168 #endif
00169 return 0;
00170 }
00171 int
00172 conditionPostWait(NonRecursiveMutex_t& handle, NonRecursiveMutexLockState& state)
00173 {
00174 return 0;
00175 }
00176
00177 }
00178 }
00179