1274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//===-- PThreadMutex.cpp ----------------------------------------*- C++ -*-===//
2274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//
3274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//                     The LLVM Compiler Infrastructure
4274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//
5274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// This file is distributed under the University of Illinois Open Source
6274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek// License. See LICENSE.TXT for details.
7274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//
8274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//===----------------------------------------------------------------------===//
9274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//
10274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//  Created by Greg Clayton on 12/9/08.
11274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//
12274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek//===----------------------------------------------------------------------===//
13274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
140c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek#include "PThreadMutex.h"
150c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek
1610e286aa8d39fb51a21412850265d9dae74613eeChris Lattner// C Includes
170c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek// C++ Includes
189378ba44b3f46d697653003c784be87746e138d2Douglas Gregor// Other libraries and framework includes
193574f46cf495ec61618fd6864b045c5b1d0d5068Daniel Dunbar// Project includes
20274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek#include "DNBTimer.h"
21274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek
220c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek#if defined (DEBUG_PTHREAD_MUTEX_DEADLOCKS)
230c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek
240c6a77bc1f52f282a969538f139ebde429076ed3Ted KremenekPThreadMutex::Locker::Locker(PThreadMutex& m, const char *function, const char *file, const int line) :
250c6a77bc1f52f282a969538f139ebde429076ed3Ted Kremenek    m_pMutex(m.Mutex()),
262596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar    m_function(function),
272596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar    m_file(file),
286f78c3b8b9343e7e9fbf2d457cccf00df6da5d47Chris Lattner    m_line(line),
293a321e23f66128dbb986343927456ff6702af617Michael J. Spencer    m_lock_time(0)
30274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek{
319378ba44b3f46d697653003c784be87746e138d2Douglas Gregor    Lock();
32274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek}
337b78b7c6d96deb1e63f8d0655ee6fa53de0b65efTed Kremenek
34268ee7016a2811803989487c0ad3799486092c63Ted KremenekPThreadMutex::Locker::Locker(PThreadMutex* m, const char *function, const char *file, const int line) :
35e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek    m_pMutex(m ? m->Mutex() : NULL),
36e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek    m_function(function),
37e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek    m_file(file),
38e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek    m_line(line),
39da9d61c96c412f6babc7f824152609562f302388Chris Lattner    m_lock_time(0)
40277faca30c9f8f72b79f55695cbe3395ec246e7cTed Kremenek{
412b2453a7d8fe732561795431f39ceb2b2a832d84Chris Lattner    Lock();
42277faca30c9f8f72b79f55695cbe3395ec246e7cTed Kremenek}
431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
442b2453a7d8fe732561795431f39ceb2b2a832d84Chris LattnerPThreadMutex::Locker::Locker(pthread_mutex_t *mutex, const char *function, const char *file, const int line) :
455f074266cc59563036c40516c814d63825723e20Ted Kremenek    m_pMutex(mutex),
46274b20863a728cc6a31ee75c670e3733600c1531Ted Kremenek    m_function(function),
47e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek    m_file(file),
48e5680f3cd678014cf0872d34726dc804b0cbbdd4Ted Kremenek    m_line(line),
49866bdf74547efe32c320554837ffce00fcc084feTed Kremenek    m_lock_time(0)
50866bdf74547efe32c320554837ffce00fcc084feTed Kremenek{
51866bdf74547efe32c320554837ffce00fcc084feTed Kremenek    Lock();
52866bdf74547efe32c320554837ffce00fcc084feTed Kremenek}
531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
54866bdf74547efe32c320554837ffce00fcc084feTed Kremenek
551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpPThreadMutex::Locker::~Locker()
56866bdf74547efe32c320554837ffce00fcc084feTed Kremenek{
571b5285e1ba31975864da356b2ed927e87670e654Chris Lattner    Unlock();
585ff4317536dbd7f03332bb250c8b35ec04a6f5dbChris Lattner}
595ff4317536dbd7f03332bb250c8b35ec04a6f5dbChris Lattner
605ff4317536dbd7f03332bb250c8b35ec04a6f5dbChris Lattner
611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
627b78b7c6d96deb1e63f8d0655ee6fa53de0b65efTed KremenekPThreadMutex::Locker::Lock()
637b78b7c6d96deb1e63f8d0655ee6fa53de0b65efTed Kremenek{
64aff6ef8e7bc3c3739f984c390e0af693e60be064Chris Lattner    if (m_pMutex)
657b78b7c6d96deb1e63f8d0655ee6fa53de0b65efTed Kremenek    {
66aff6ef8e7bc3c3739f984c390e0af693e60be064Chris Lattner        m_lock_time = DNBTimer::GetTimeOfDay();
671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        if (::pthread_mutex_trylock (m_pMutex) != 0)
68866bdf74547efe32c320554837ffce00fcc084feTed Kremenek        {
69866bdf74547efe32c320554837ffce00fcc084feTed Kremenek            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);
70866bdf74547efe32c320554837ffce00fcc084feTed Kremenek            ::pthread_mutex_lock (m_pMutex);
711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            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);
72866bdf74547efe32c320554837ffce00fcc084feTed Kremenek        }
73898a0bb1972efb6e03cb1151412ec7392cef07deChris Lattner    }
74898a0bb1972efb6e03cb1151412ec7392cef07deChris Lattner}
7559d08cb672136322375e5400578ee1fbd0947de2Ted Kremenek
76a64ccefdf0ea4e03ec88805d71b0af74950c7472Argyrios Kyrtzidis
77866bdf74547efe32c320554837ffce00fcc084feTed Kremenekvoid
7889d7ee9619d2dbdfa8d956a695c612a104a92cadTed KremenekPThreadMutex::Locker::Unlock()
79d0a69696acca62798dfc8b98f97c92bfa7fa0490Chris Lattner{
80277faca30c9f8f72b79f55695cbe3395ec246e7cTed Kremenek    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);
81277faca30c9f8f72b79f55695cbe3395ec246e7cTed Kremenek    ::pthread_mutex_unlock (m_pMutex);
82277faca30c9f8f72b79f55695cbe3395ec246e7cTed Kremenek}
83277faca30c9f8f72b79f55695cbe3395ec246e7cTed Kremenek
84d0a69696acca62798dfc8b98f97c92bfa7fa0490Chris Lattner#endif
85d0a69696acca62798dfc8b98f97c92bfa7fa0490Chris Lattner