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