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