1*30fdc8d8SChris Lattner //===-- PThreadMutex.cpp ----------------------------------------*- C++ -*-===// 2*30fdc8d8SChris Lattner // 3*30fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 4*30fdc8d8SChris Lattner // 5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 7*30fdc8d8SChris Lattner // 8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 9*30fdc8d8SChris Lattner // 10*30fdc8d8SChris Lattner // Created by Greg Clayton on 12/9/08. 11*30fdc8d8SChris Lattner // 12*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 13*30fdc8d8SChris Lattner 14*30fdc8d8SChris Lattner #include "PThreadMutex.h" 15*30fdc8d8SChris Lattner 16*30fdc8d8SChris Lattner // C Includes 17*30fdc8d8SChris Lattner // C++ Includes 18*30fdc8d8SChris Lattner // Other libraries and framework includes 19*30fdc8d8SChris Lattner // Project includes 20*30fdc8d8SChris Lattner #include "DNBTimer.h" 21*30fdc8d8SChris Lattner 22*30fdc8d8SChris Lattner #if defined (DEBUG_PTHREAD_MUTEX_DEADLOCKS) 23*30fdc8d8SChris Lattner 24*30fdc8d8SChris Lattner PThreadMutex::Locker::Locker(PThreadMutex& m, const char *function, const char *file, const int line) : 25*30fdc8d8SChris Lattner m_pMutex(m.Mutex()), 26*30fdc8d8SChris Lattner m_function(function), 27*30fdc8d8SChris Lattner m_file(file), 28*30fdc8d8SChris Lattner m_line(line), 29*30fdc8d8SChris Lattner m_lock_time(0) 30*30fdc8d8SChris Lattner { 31*30fdc8d8SChris Lattner Lock(); 32*30fdc8d8SChris Lattner } 33*30fdc8d8SChris Lattner 34*30fdc8d8SChris Lattner PThreadMutex::Locker::Locker(PThreadMutex* m, const char *function, const char *file, const int line) : 35*30fdc8d8SChris Lattner m_pMutex(m ? m->Mutex() : NULL), 36*30fdc8d8SChris Lattner m_function(function), 37*30fdc8d8SChris Lattner m_file(file), 38*30fdc8d8SChris Lattner m_line(line), 39*30fdc8d8SChris Lattner m_lock_time(0) 40*30fdc8d8SChris Lattner { 41*30fdc8d8SChris Lattner Lock(); 42*30fdc8d8SChris Lattner } 43*30fdc8d8SChris Lattner 44*30fdc8d8SChris Lattner PThreadMutex::Locker::Locker(pthread_mutex_t *mutex, const char *function, const char *file, const int line) : 45*30fdc8d8SChris Lattner m_pMutex(mutex), 46*30fdc8d8SChris Lattner m_function(function), 47*30fdc8d8SChris Lattner m_file(file), 48*30fdc8d8SChris Lattner m_line(line), 49*30fdc8d8SChris Lattner m_lock_time(0) 50*30fdc8d8SChris Lattner { 51*30fdc8d8SChris Lattner Lock(); 52*30fdc8d8SChris Lattner } 53*30fdc8d8SChris Lattner 54*30fdc8d8SChris Lattner 55*30fdc8d8SChris Lattner PThreadMutex::Locker::~Locker() 56*30fdc8d8SChris Lattner { 57*30fdc8d8SChris Lattner Unlock(); 58*30fdc8d8SChris Lattner } 59*30fdc8d8SChris Lattner 60*30fdc8d8SChris Lattner 61*30fdc8d8SChris Lattner void 62*30fdc8d8SChris Lattner PThreadMutex::Locker::Lock() 63*30fdc8d8SChris Lattner { 64*30fdc8d8SChris Lattner if (m_pMutex) 65*30fdc8d8SChris Lattner { 66*30fdc8d8SChris Lattner m_lock_time = DNBTimer::GetTimeOfDay(); 67*30fdc8d8SChris Lattner if (::pthread_mutex_trylock (m_pMutex) != 0) 68*30fdc8d8SChris Lattner { 69*30fdc8d8SChris Lattner fprintf(stdout, "::pthread_mutex_trylock (%8.8p) mutex is locked (function %s in %s:%i), waiting...\n", m_pMutex, m_function, m_file, m_line); 70*30fdc8d8SChris Lattner ::pthread_mutex_lock (m_pMutex); 71*30fdc8d8SChris Lattner fprintf(stdout, "::pthread_mutex_lock (%8.8p) succeeded after %6llu usecs (function %s in %s:%i)\n", m_pMutex, DNBTimer::GetTimeOfDay() - m_lock_time, m_function, m_file, m_line); 72*30fdc8d8SChris Lattner } 73*30fdc8d8SChris Lattner } 74*30fdc8d8SChris Lattner } 75*30fdc8d8SChris Lattner 76*30fdc8d8SChris Lattner 77*30fdc8d8SChris Lattner void 78*30fdc8d8SChris Lattner PThreadMutex::Locker::Unlock() 79*30fdc8d8SChris Lattner { 80*30fdc8d8SChris Lattner fprintf(stdout, "::pthread_mutex_unlock (%8.8p) had lock for %6llu usecs in %s in %s:%i\n", m_pMutex, DNBTimer::GetTimeOfDay() - m_lock_time, m_function, m_file, m_line); 81*30fdc8d8SChris Lattner ::pthread_mutex_unlock (m_pMutex); 82*30fdc8d8SChris Lattner } 83*30fdc8d8SChris Lattner 84*30fdc8d8SChris Lattner #endif 85