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