annotate Mutex.cpp @ 38:d2ff6e7be4a1 vampy2final

updated vampy2final readme
author fazekasgy
date Mon, 05 Oct 2009 12:05:26 +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