annotate Mutex.cpp @ 53:7e59caea821b

* Make a better job of preloading Python, especially when it's in a framework. Go for the Python file in the frameworks directory in preference to any libpythonX.Y.dylib. Particularly, don't try to preload any library without an absolute path until we've exhausted all our framework possibilities (so as to avoid picking up an ancient system library).
author cannam
date Fri, 09 Oct 2009 13:48:25 +0000
parents 27bab3a16c9a
children
rev   line source
fazekasgy@37 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
fazekasgy@37 2
fazekasgy@37 3 /*
fazekasgy@37 4 Basic cross-platform mutex abstraction class.
fazekasgy@37 5 This file copyright 2007 Chris Cannam.
fazekasgy@37 6 */
fazekasgy@37 7
fazekasgy@37 8 #include "Mutex.h"
fazekasgy@37 9 #include <iostream>
fazekasgy@37 10
fazekasgy@37 11 #ifndef _WIN32
fazekasgy@37 12 #include <sys/time.h>
fazekasgy@37 13 #include <time.h>
fazekasgy@37 14 #endif
fazekasgy@37 15
fazekasgy@37 16 using std::cerr;
fazekasgy@37 17 using std::endl;
fazekasgy@37 18 using std::string;
fazekasgy@37 19
fazekasgy@37 20 #ifdef _WIN32
fazekasgy@37 21
fazekasgy@37 22 Mutex::Mutex()
fazekasgy@37 23 #ifndef NO_THREAD_CHECKS
fazekasgy@37 24 :
fazekasgy@37 25 m_lockedBy(-1)
fazekasgy@37 26 #endif
fazekasgy@37 27 {
fazekasgy@37 28 m_mutex = CreateMutex(NULL, FALSE, NULL);
fazekasgy@37 29 #ifdef DEBUG_MUTEX
fazekasgy@37 30 cerr << "MUTEX DEBUG: " << (void *)GetCurrentThreadId() << ": Initialised mutex " << &m_mutex << endl;
fazekasgy@37 31 #endif
fazekasgy@37 32 }
fazekasgy@37 33
fazekasgy@37 34 Mutex::~Mutex()
fazekasgy@37 35 {
fazekasgy@37 36 #ifdef DEBUG_MUTEX
fazekasgy@37 37 cerr << "MUTEX DEBUG: " << (void *)GetCurrentThreadId() << ": Destroying mutex " << &m_mutex << endl;
fazekasgy@37 38 #endif
fazekasgy@37 39 CloseHandle(m_mutex);
fazekasgy@37 40 }
fazekasgy@37 41
fazekasgy@37 42 void
fazekasgy@37 43 Mutex::lock()
fazekasgy@37 44 {
fazekasgy@37 45 #ifndef NO_THREAD_CHECKS
fazekasgy@37 46 DWORD tid = GetCurrentThreadId();
fazekasgy@37 47 if (m_lockedBy == tid) {
fazekasgy@37 48 cerr << "ERROR: Deadlock on mutex " << &m_mutex << endl;
fazekasgy@37 49 }
fazekasgy@37 50 #endif
fazekasgy@37 51 #ifdef DEBUG_MUTEX
fazekasgy@37 52 cerr << "MUTEX DEBUG: " << (void *)tid << ": Want to lock mutex " << &m_mutex << endl;
fazekasgy@37 53 #endif
fazekasgy@37 54 WaitForSingleObject(m_mutex, INFINITE);
fazekasgy@37 55 #ifndef NO_THREAD_CHECKS
fazekasgy@37 56 m_lockedBy = tid;
fazekasgy@37 57 #endif
fazekasgy@37 58 #ifdef DEBUG_MUTEX
fazekasgy@37 59 cerr << "MUTEX DEBUG: " << (void *)tid << ": Locked mutex " << &m_mutex << endl;
fazekasgy@37 60 #endif
fazekasgy@37 61 }
fazekasgy@37 62
fazekasgy@37 63 void
fazekasgy@37 64 Mutex::unlock()
fazekasgy@37 65 {
fazekasgy@37 66 #ifndef NO_THREAD_CHECKS
fazekasgy@37 67 DWORD tid = GetCurrentThreadId();
fazekasgy@37 68 if (m_lockedBy != tid) {
fazekasgy@37 69 cerr << "ERROR: Mutex " << &m_mutex << " not owned by unlocking thread" << endl;
fazekasgy@37 70 return;
fazekasgy@37 71 }
fazekasgy@37 72 #endif
fazekasgy@37 73 #ifdef DEBUG_MUTEX
fazekasgy@37 74 cerr << "MUTEX DEBUG: " << (void *)tid << ": Unlocking mutex " << &m_mutex << endl;
fazekasgy@37 75 #endif
fazekasgy@37 76 #ifndef NO_THREAD_CHECKS
fazekasgy@37 77 m_lockedBy = -1;
fazekasgy@37 78 #endif
fazekasgy@37 79 ReleaseMutex(m_mutex);
fazekasgy@37 80 }
fazekasgy@37 81
fazekasgy@37 82 bool
fazekasgy@37 83 Mutex::trylock()
fazekasgy@37 84 {
fazekasgy@37 85 #ifndef NO_THREAD_CHECKS
fazekasgy@37 86 DWORD tid = GetCurrentThreadId();
fazekasgy@37 87 #endif
fazekasgy@37 88 DWORD result = WaitForSingleObject(m_mutex, 0);
fazekasgy@37 89 if (result == WAIT_TIMEOUT || result == WAIT_FAILED) {
fazekasgy@37 90 #ifdef DEBUG_MUTEX
fazekasgy@37 91 cerr << "MUTEX DEBUG: " << (void *)tid << ": Mutex " << &m_mutex << " unavailable" << endl;
fazekasgy@37 92 #endif
fazekasgy@37 93 return false;
fazekasgy@37 94 } else {
fazekasgy@37 95 #ifndef NO_THREAD_CHECKS
fazekasgy@37 96 m_lockedBy = tid;
fazekasgy@37 97 #endif
fazekasgy@37 98 #ifdef DEBUG_MUTEX
fazekasgy@37 99 cerr << "MUTEX DEBUG: " << (void *)tid << ": Locked mutex " << &m_mutex << " (from trylock)" << endl;
fazekasgy@37 100 #endif
fazekasgy@37 101 return true;
fazekasgy@37 102 }
fazekasgy@37 103 }
fazekasgy@37 104
fazekasgy@37 105 #else /* !_WIN32 */
fazekasgy@37 106
fazekasgy@37 107 Mutex::Mutex()
fazekasgy@37 108 #ifndef NO_THREAD_CHECKS
fazekasgy@37 109 :
fazekasgy@37 110 m_lockedBy(0),
fazekasgy@37 111 m_locked(false)
fazekasgy@37 112 #endif
fazekasgy@37 113 {
fazekasgy@37 114 pthread_mutex_init(&m_mutex, 0);
fazekasgy@37 115 #ifdef DEBUG_MUTEX
fazekasgy@37 116 cerr << "MUTEX DEBUG: " << (void *)pthread_self() << ": Initialised mutex " << &m_mutex << endl;
fazekasgy@37 117 #endif
fazekasgy@37 118 }
fazekasgy@37 119
fazekasgy@37 120 Mutex::~Mutex()
fazekasgy@37 121 {
fazekasgy@37 122 #ifdef DEBUG_MUTEX
fazekasgy@37 123 cerr << "MUTEX DEBUG: " << (void *)pthread_self() << ": Destroying mutex " << &m_mutex << endl;
fazekasgy@37 124 #endif
fazekasgy@37 125 pthread_mutex_destroy(&m_mutex);
fazekasgy@37 126 }
fazekasgy@37 127
fazekasgy@37 128 void
fazekasgy@37 129 Mutex::lock()
fazekasgy@37 130 {
fazekasgy@37 131 #ifndef NO_THREAD_CHECKS
fazekasgy@37 132 pthread_t tid = pthread_self();
fazekasgy@37 133 if (m_locked && m_lockedBy == tid) {
fazekasgy@37 134 cerr << "ERROR: Deadlock on mutex " << &m_mutex << endl;
fazekasgy@37 135 }
fazekasgy@37 136 #endif
fazekasgy@37 137 #ifdef DEBUG_MUTEX
fazekasgy@37 138 cerr << "MUTEX DEBUG: " << (void *)tid << ": Want to lock mutex " << &m_mutex << endl;
fazekasgy@37 139 #endif
fazekasgy@37 140 pthread_mutex_lock(&m_mutex);
fazekasgy@37 141 #ifndef NO_THREAD_CHECKS
fazekasgy@37 142 m_lockedBy = tid;
fazekasgy@37 143 m_locked = true;
fazekasgy@37 144 #endif
fazekasgy@37 145 #ifdef DEBUG_MUTEX
fazekasgy@37 146 cerr << "MUTEX DEBUG: " << (void *)tid << ": Locked mutex " << &m_mutex << endl;
fazekasgy@37 147 #endif
fazekasgy@37 148 }
fazekasgy@37 149
fazekasgy@37 150 void
fazekasgy@37 151 Mutex::unlock()
fazekasgy@37 152 {
fazekasgy@37 153 #ifndef NO_THREAD_CHECKS
fazekasgy@37 154 pthread_t tid = pthread_self();
fazekasgy@37 155 if (!m_locked) {
fazekasgy@37 156 cerr << "ERROR: Mutex " << &m_mutex << " not locked in unlock" << endl;
fazekasgy@37 157 return;
fazekasgy@37 158 } else if (m_lockedBy != tid) {
fazekasgy@37 159 cerr << "ERROR: Mutex " << &m_mutex << " not owned by unlocking thread" << endl;
fazekasgy@37 160 return;
fazekasgy@37 161 }
fazekasgy@37 162 #endif
fazekasgy@37 163 #ifdef DEBUG_MUTEX
fazekasgy@37 164 cerr << "MUTEX DEBUG: " << (void *)tid << ": Unlocking mutex " << &m_mutex << endl;
fazekasgy@37 165 #endif
fazekasgy@37 166 #ifndef NO_THREAD_CHECKS
fazekasgy@37 167 m_locked = false;
fazekasgy@37 168 #endif
fazekasgy@37 169 pthread_mutex_unlock(&m_mutex);
fazekasgy@37 170 }
fazekasgy@37 171
fazekasgy@37 172 bool
fazekasgy@37 173 Mutex::trylock()
fazekasgy@37 174 {
fazekasgy@37 175 #ifndef NO_THREAD_CHECKS
fazekasgy@37 176 pthread_t tid = pthread_self();
fazekasgy@37 177 #endif
fazekasgy@37 178 if (pthread_mutex_trylock(&m_mutex)) {
fazekasgy@37 179 #ifdef DEBUG_MUTEX
fazekasgy@37 180 cerr << "MUTEX DEBUG: " << (void *)tid << ": Mutex " << &m_mutex << " unavailable" << endl;
fazekasgy@37 181 #endif
fazekasgy@37 182 return false;
fazekasgy@37 183 } else {
fazekasgy@37 184 #ifndef NO_THREAD_CHECKS
fazekasgy@37 185 m_lockedBy = tid;
fazekasgy@37 186 m_locked = true;
fazekasgy@37 187 #endif
fazekasgy@37 188 #ifdef DEBUG_MUTEX
fazekasgy@37 189 cerr << "MUTEX DEBUG: " << (void *)tid << ": Locked mutex " << &m_mutex << " (from trylock)" << endl;
fazekasgy@37 190 #endif
fazekasgy@37 191 return true;
fazekasgy@37 192 }
fazekasgy@37 193 }
fazekasgy@37 194
fazekasgy@37 195 #endif
fazekasgy@37 196
fazekasgy@37 197 MutexLocker::MutexLocker(Mutex *mutex) :
fazekasgy@37 198 m_mutex(mutex)
fazekasgy@37 199 {
fazekasgy@37 200 if (m_mutex) {
fazekasgy@37 201 m_mutex->lock();
fazekasgy@37 202 }
fazekasgy@37 203 }
fazekasgy@37 204
fazekasgy@37 205 MutexLocker::~MutexLocker()
fazekasgy@37 206 {
fazekasgy@37 207 if (m_mutex) {
fazekasgy@37 208 m_mutex->unlock();
fazekasgy@37 209 }
fazekasgy@37 210 }
fazekasgy@37 211