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