130fdc8d8SChris Lattner //===-- PThreadMutex.cpp ----------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner //
930fdc8d8SChris Lattner // Created by Greg Clayton on 12/9/08.
1030fdc8d8SChris Lattner //
1130fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
1230fdc8d8SChris Lattner
1330fdc8d8SChris Lattner #include "PThreadMutex.h"
1430fdc8d8SChris Lattner
1530fdc8d8SChris Lattner #include "DNBTimer.h"
1630fdc8d8SChris Lattner
1730fdc8d8SChris Lattner #if defined(DEBUG_PTHREAD_MUTEX_DEADLOCKS)
1830fdc8d8SChris Lattner
Locker(PThreadMutex & m,const char * function,const char * file,const int line)19b9c1b51eSKate Stone PThreadMutex::Locker::Locker(PThreadMutex &m, const char *function,
20b9c1b51eSKate Stone const char *file, const int line)
21b9c1b51eSKate Stone : m_pMutex(m.Mutex()), m_function(function), m_file(file), m_line(line),
22b9c1b51eSKate Stone m_lock_time(0) {
2330fdc8d8SChris Lattner Lock();
2430fdc8d8SChris Lattner }
2530fdc8d8SChris Lattner
Locker(PThreadMutex * m,const char * function,const char * file,const int line)26b9c1b51eSKate Stone PThreadMutex::Locker::Locker(PThreadMutex *m, const char *function,
27b9c1b51eSKate Stone const char *file, const int line)
28b9c1b51eSKate Stone : m_pMutex(m ? m->Mutex() : NULL), m_function(function), m_file(file),
29b9c1b51eSKate Stone m_line(line), m_lock_time(0) {
3030fdc8d8SChris Lattner Lock();
3130fdc8d8SChris Lattner }
3230fdc8d8SChris Lattner
Locker(pthread_mutex_t * mutex,const char * function,const char * file,const int line)33b9c1b51eSKate Stone PThreadMutex::Locker::Locker(pthread_mutex_t *mutex, const char *function,
34b9c1b51eSKate Stone const char *file, const int line)
35b9c1b51eSKate Stone : m_pMutex(mutex), m_function(function), m_file(file), m_line(line),
36b9c1b51eSKate Stone m_lock_time(0) {
3730fdc8d8SChris Lattner Lock();
3830fdc8d8SChris Lattner }
3930fdc8d8SChris Lattner
~Locker()40b9c1b51eSKate Stone PThreadMutex::Locker::~Locker() { Unlock(); }
4130fdc8d8SChris Lattner
Lock()42b9c1b51eSKate Stone void PThreadMutex::Locker::Lock() {
43b9c1b51eSKate Stone if (m_pMutex) {
4430fdc8d8SChris Lattner m_lock_time = DNBTimer::GetTimeOfDay();
45b9c1b51eSKate Stone if (::pthread_mutex_trylock(m_pMutex) != 0) {
46b9c1b51eSKate Stone fprintf(stdout, "::pthread_mutex_trylock (%8.8p) mutex is locked "
47b9c1b51eSKate Stone "(function %s in %s:%i), waiting...\n",
48b9c1b51eSKate Stone m_pMutex, m_function, m_file, m_line);
4930fdc8d8SChris Lattner ::pthread_mutex_lock(m_pMutex);
50b9c1b51eSKate Stone fprintf(stdout, "::pthread_mutex_lock (%8.8p) succeeded after %6llu "
51b9c1b51eSKate Stone "usecs (function %s in %s:%i)\n",
52b9c1b51eSKate Stone m_pMutex, DNBTimer::GetTimeOfDay() - m_lock_time, m_function,
53b9c1b51eSKate Stone m_file, m_line);
5430fdc8d8SChris Lattner }
5530fdc8d8SChris Lattner }
5630fdc8d8SChris Lattner }
5730fdc8d8SChris Lattner
Unlock()58b9c1b51eSKate Stone void PThreadMutex::Locker::Unlock() {
59b9c1b51eSKate Stone fprintf(stdout, "::pthread_mutex_unlock (%8.8p) had lock for %6llu usecs in "
60b9c1b51eSKate Stone "%s in %s:%i\n",
61b9c1b51eSKate Stone m_pMutex, DNBTimer::GetTimeOfDay() - m_lock_time, m_function, m_file,
62b9c1b51eSKate Stone m_line);
6330fdc8d8SChris Lattner ::pthread_mutex_unlock(m_pMutex);
6430fdc8d8SChris Lattner }
6530fdc8d8SChris Lattner
6630fdc8d8SChris Lattner #endif
67