130fdc8d8SChris Lattner //===-- PThreadMutex.cpp ----------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner // 1030fdc8d8SChris Lattner // Created by Greg Clayton on 12/9/08. 1130fdc8d8SChris Lattner // 1230fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 1330fdc8d8SChris Lattner 1430fdc8d8SChris Lattner #include "PThreadMutex.h" 1530fdc8d8SChris Lattner 1630fdc8d8SChris Lattner // C Includes 1730fdc8d8SChris Lattner // C++ Includes 1830fdc8d8SChris Lattner // Other libraries and framework includes 1930fdc8d8SChris Lattner // Project includes 2030fdc8d8SChris Lattner #include "DNBTimer.h" 2130fdc8d8SChris Lattner 2230fdc8d8SChris Lattner #if defined(DEBUG_PTHREAD_MUTEX_DEADLOCKS) 2330fdc8d8SChris Lattner 24*b9c1b51eSKate Stone PThreadMutex::Locker::Locker(PThreadMutex &m, const char *function, 25*b9c1b51eSKate Stone const char *file, const int line) 26*b9c1b51eSKate Stone : m_pMutex(m.Mutex()), m_function(function), m_file(file), m_line(line), 27*b9c1b51eSKate Stone m_lock_time(0) { 2830fdc8d8SChris Lattner Lock(); 2930fdc8d8SChris Lattner } 3030fdc8d8SChris Lattner 31*b9c1b51eSKate Stone PThreadMutex::Locker::Locker(PThreadMutex *m, const char *function, 32*b9c1b51eSKate Stone const char *file, const int line) 33*b9c1b51eSKate Stone : m_pMutex(m ? m->Mutex() : NULL), m_function(function), m_file(file), 34*b9c1b51eSKate Stone m_line(line), m_lock_time(0) { 3530fdc8d8SChris Lattner Lock(); 3630fdc8d8SChris Lattner } 3730fdc8d8SChris Lattner 38*b9c1b51eSKate Stone PThreadMutex::Locker::Locker(pthread_mutex_t *mutex, const char *function, 39*b9c1b51eSKate Stone const char *file, const int line) 40*b9c1b51eSKate Stone : m_pMutex(mutex), m_function(function), m_file(file), m_line(line), 41*b9c1b51eSKate Stone m_lock_time(0) { 4230fdc8d8SChris Lattner Lock(); 4330fdc8d8SChris Lattner } 4430fdc8d8SChris Lattner 45*b9c1b51eSKate Stone PThreadMutex::Locker::~Locker() { Unlock(); } 4630fdc8d8SChris Lattner 47*b9c1b51eSKate Stone void PThreadMutex::Locker::Lock() { 48*b9c1b51eSKate Stone if (m_pMutex) { 4930fdc8d8SChris Lattner m_lock_time = DNBTimer::GetTimeOfDay(); 50*b9c1b51eSKate Stone if (::pthread_mutex_trylock(m_pMutex) != 0) { 51*b9c1b51eSKate Stone fprintf(stdout, "::pthread_mutex_trylock (%8.8p) mutex is locked " 52*b9c1b51eSKate Stone "(function %s in %s:%i), waiting...\n", 53*b9c1b51eSKate Stone m_pMutex, m_function, m_file, m_line); 5430fdc8d8SChris Lattner ::pthread_mutex_lock(m_pMutex); 55*b9c1b51eSKate Stone fprintf(stdout, "::pthread_mutex_lock (%8.8p) succeeded after %6llu " 56*b9c1b51eSKate Stone "usecs (function %s in %s:%i)\n", 57*b9c1b51eSKate Stone m_pMutex, DNBTimer::GetTimeOfDay() - m_lock_time, m_function, 58*b9c1b51eSKate Stone m_file, m_line); 5930fdc8d8SChris Lattner } 6030fdc8d8SChris Lattner } 6130fdc8d8SChris Lattner } 6230fdc8d8SChris Lattner 63*b9c1b51eSKate Stone void PThreadMutex::Locker::Unlock() { 64*b9c1b51eSKate Stone fprintf(stdout, "::pthread_mutex_unlock (%8.8p) had lock for %6llu usecs in " 65*b9c1b51eSKate Stone "%s in %s:%i\n", 66*b9c1b51eSKate Stone m_pMutex, DNBTimer::GetTimeOfDay() - m_lock_time, m_function, m_file, 67*b9c1b51eSKate Stone m_line); 6830fdc8d8SChris Lattner ::pthread_mutex_unlock(m_pMutex); 6930fdc8d8SChris Lattner } 7030fdc8d8SChris Lattner 7130fdc8d8SChris Lattner #endif 72