124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Mutex.cpp -----------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Mutex.h" 111503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#include "lldb/Host/Host.h" 121503c0fa0a4a9351484e47d88310435592494d76Greg Clayton 131503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#include <string.h> 141503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#include <stdio.h> 151503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#include <unistd.h> 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if 0 1817f4bff45d668c65deb447f914d59b2801d5be8fGreg Clayton// This logging is way too verbose to enable even for a log channel. 1917f4bff45d668c65deb447f914d59b2801d5be8fGreg Clayton// This logging can be enabled by changing the "#if 0", but should be 2017f4bff45d668c65deb447f914d59b2801d5be8fGreg Clayton// reverted prior to checking in. 2117f4bff45d668c65deb447f914d59b2801d5be8fGreg Clayton#include <cstdio> 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define DEBUG_LOG(fmt, ...) printf(fmt, ## __VA_ARGS__) 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#else 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define DEBUG_LOG(fmt, ...) 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 271503c0fa0a4a9351484e47d88310435592494d76Greg Clayton// Enable extra mutex error checking 281503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#ifdef LLDB_CONFIGURATION_DEBUG 291503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#define ENABLE_MUTEX_ERROR_CHECKING 1 30559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata#include <inttypes.h> 311503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#endif 321503c0fa0a4a9351484e47d88310435592494d76Greg Clayton 3392c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton#if ENABLE_MUTEX_ERROR_CHECKING 3492c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton#include <set> 3592c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton 3692c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Claytonenum MutexAction 3792c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton{ 3892c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton eMutexActionInitialized, 3992c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton eMutexActionDestroyed, 4092c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton eMutexActionAssertInitialized 4192c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton}; 4292c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton 4392c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Claytonstatic bool 4492c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Claytonerror_check_mutex (pthread_mutex_t *m, MutexAction action) 4592c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton{ 4692c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton typedef std::set<pthread_mutex_t *> mutex_set; 4792c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton static pthread_mutex_t g_mutex_set_mutex = PTHREAD_MUTEX_INITIALIZER; 480e82f8e98a27b0b3cd6ee7136022994076e62528Sean Callanan static mutex_set g_initialized_mutex_set; 490e82f8e98a27b0b3cd6ee7136022994076e62528Sean Callanan static mutex_set g_destroyed_mutex_set; 5092c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton 5192c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton bool success = true; 5292c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton int err; 5392c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton // Manually call lock so we don't to any of this error checking 5492c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton err = ::pthread_mutex_lock (&g_mutex_set_mutex); 5592c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton assert(err == 0); 5692c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton switch (action) 5792c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton { 5892c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton case eMutexActionInitialized: 5992c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton // Make sure this isn't already in our initialized mutex set... 6092c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton assert (g_initialized_mutex_set.find(m) == g_initialized_mutex_set.end()); 6192c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton // Remove this from the destroyed set in case it was ever in there 6292c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton g_destroyed_mutex_set.erase(m); 6392c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton // Add the mutex to the initialized set 6492c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton g_initialized_mutex_set.insert(m); 6592c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton break; 6692c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton 6792c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton case eMutexActionDestroyed: 6892c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton // Make sure this isn't already in our destroyed mutex set... 6992c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton assert (g_destroyed_mutex_set.find(m) == g_destroyed_mutex_set.end()); 7092c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton // Remove this from the initialized so we can put it into the destroyed set 7192c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton g_initialized_mutex_set.erase(m); 7292c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton // Add the mutex to the destroyed set 7392c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton g_destroyed_mutex_set.insert(m); 7492c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton break; 7592c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton case eMutexActionAssertInitialized: 7692c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton // This function will return true if "m" is in the initialized mutex set 7792c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton success = g_initialized_mutex_set.find(m) != g_initialized_mutex_set.end(); 789aa4b847f08f31a003f23c367e2240f4d3245799Jim Ingham assert (success); 7992c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton break; 8092c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton } 8192c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton // Manually call unlock so we don't to any of this error checking 8292c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton err = ::pthread_mutex_unlock (&g_mutex_set_mutex); 8392c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton assert(err == 0); 8492c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton return success; 8592c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton} 8692c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton 8792c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton#endif 8892c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Default constructor. 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This will create a scoped mutex locking object that doesn't have 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// a mutex to lock. One will need to be provided using the Reset() 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// method. 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMutex::Locker::Locker () : 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mutex_ptr(NULL) 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Constructor with a Mutex object. 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This will create a scoped mutex locking object that extracts the 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mutex owned by "m" and locks it. 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMutex::Locker::Locker (Mutex& m) : 110516f0849819d094d4eab39a1f27b770259103ff8Greg Clayton m_mutex_ptr(NULL) 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1121b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham Lock (m); 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Constructor with a Mutex object pointer. 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This will create a scoped mutex locking object that extracts the 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mutex owned by "m" and locks it. 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMutex::Locker::Locker (Mutex* m) : 122516f0849819d094d4eab39a1f27b770259103ff8Greg Clayton m_mutex_ptr(NULL) 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 124516f0849819d094d4eab39a1f27b770259103ff8Greg Clayton if (m) 1251b584ebc1de8b50fe375cffb5fb33ad13be10046Jim Ingham Lock (m); 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 1295d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton// Destructor 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Unlocks any owned mutex object (if it is valid). 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMutex::Locker::~Locker () 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 135516f0849819d094d4eab39a1f27b770259103ff8Greg Clayton Unlock(); 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Unlock the current mutex in this object (if this owns a valid 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// mutex) and lock the new "mutex" object if it is non-NULL. 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1431b584ebc1de8b50fe375cffb5fb33ad13be10046Jim InghamMutex::Locker::Lock (Mutex &mutex) 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1451a67946295ac66ff7a8787be25d8b56f49742345Greg Clayton // We already have this mutex locked or both are NULL... 146088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham if (m_mutex_ptr == &mutex) 1471a67946295ac66ff7a8787be25d8b56f49742345Greg Clayton return; 1481a67946295ac66ff7a8787be25d8b56f49742345Greg Clayton 149516f0849819d094d4eab39a1f27b770259103ff8Greg Clayton Unlock (); 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 151088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham m_mutex_ptr = &mutex; 152088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham m_mutex_ptr->Lock(); 153516f0849819d094d4eab39a1f27b770259103ff8Greg Clayton} 154516f0849819d094d4eab39a1f27b770259103ff8Greg Clayton 155516f0849819d094d4eab39a1f27b770259103ff8Greg Claytonvoid 156516f0849819d094d4eab39a1f27b770259103ff8Greg ClaytonMutex::Locker::Unlock () 157516f0849819d094d4eab39a1f27b770259103ff8Greg Clayton{ 158516f0849819d094d4eab39a1f27b770259103ff8Greg Clayton if (m_mutex_ptr) 159516f0849819d094d4eab39a1f27b770259103ff8Greg Clayton { 160088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham m_mutex_ptr->Unlock (); 161516f0849819d094d4eab39a1f27b770259103ff8Greg Clayton m_mutex_ptr = NULL; 162516f0849819d094d4eab39a1f27b770259103ff8Greg Clayton } 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 166088684d31c66df959fa2f3840f00b73b79b07756Jim InghamMutex::Locker::TryLock (Mutex &mutex, const char *failure_message) 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1681a67946295ac66ff7a8787be25d8b56f49742345Greg Clayton // We already have this mutex locked! 169088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham if (m_mutex_ptr == &mutex) 170088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham return true; 1711a67946295ac66ff7a8787be25d8b56f49742345Greg Clayton 172516f0849819d094d4eab39a1f27b770259103ff8Greg Clayton Unlock (); 1731a67946295ac66ff7a8787be25d8b56f49742345Greg Clayton 174088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham if (mutex.TryLock(failure_message) == 0) 175088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham m_mutex_ptr = &mutex; 176088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mutex_ptr != NULL; 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Default constructor. 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Creates a pthread mutex with no attributes. 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMutex::Mutex () : 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mutex() 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int err; 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner err = ::pthread_mutex_init (&m_mutex, NULL); 19092c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton#if ENABLE_MUTEX_ERROR_CHECKING 19192c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton if (err == 0) 19292c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton error_check_mutex (&m_mutex, eMutexActionInitialized); 19392c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton#endif 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(err == 0); 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Default constructor. 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Creates a pthread mutex with "type" as the mutex type. 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMutex::Mutex (Mutex::Type type) : 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mutex() 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int err; 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::pthread_mutexattr_t attr; 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner err = ::pthread_mutexattr_init (&attr); 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(err == 0); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (type) 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eMutexTypeNormal: 2121503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#if ENABLE_MUTEX_ERROR_CHECKING 2131503c0fa0a4a9351484e47d88310435592494d76Greg Clayton err = ::pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_ERRORCHECK); 2141503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#else 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner err = ::pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_NORMAL); 2161503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#endif 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eMutexTypeRecursive: 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner err = ::pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE); 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(err == 0); 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner err = ::pthread_mutex_init (&m_mutex, &attr); 22592c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton#if ENABLE_MUTEX_ERROR_CHECKING 22692c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton if (err == 0) 22792c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton error_check_mutex (&m_mutex, eMutexActionInitialized); 22892c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton#endif 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(err == 0); 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner err = ::pthread_mutexattr_destroy (&attr); 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert(err == 0); 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor. 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destroys the mutex owned by this object. 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMutex::~Mutex() 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 241d387b462eecb908af265ecc7006781b4532073adGreg Clayton int err = ::pthread_mutex_destroy (&m_mutex); 242884288bcb6824452a3c64eb772c0976501acc47aMatt Kopec assert(err == 0); 2431503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#if ENABLE_MUTEX_ERROR_CHECKING 24492c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton if (err == 0) 24592c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton error_check_mutex (&m_mutex, eMutexActionDestroyed); 24692c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton else 2471503c0fa0a4a9351484e47d88310435592494d76Greg Clayton { 2481503c0fa0a4a9351484e47d88310435592494d76Greg Clayton Host::SetCrashDescriptionWithFormat ("%s error: pthread_mutex_destroy() => err = %i (%s)", __PRETTY_FUNCTION__, err, strerror(err)); 2491503c0fa0a4a9351484e47d88310435592494d76Greg Clayton assert(err == 0); 2501503c0fa0a4a9351484e47d88310435592494d76Greg Clayton } 2511503c0fa0a4a9351484e47d88310435592494d76Greg Clayton memset (&m_mutex, '\xba', sizeof(m_mutex)); 2521503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#endif 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Mutex get accessor. 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpthread_mutex_t * 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerMutex::GetMutex() 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_mutex; 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham//---------------------------------------------------------------------- 265088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// Locks the mutex owned by this object, if the mutex is already 266088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// locked, the calling thread will block until the mutex becomes 267088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// available. 268088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// 269088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// RETURNS 270088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// The error code from the pthread_mutex_lock() function call. 271088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham//---------------------------------------------------------------------- 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 273088684d31c66df959fa2f3840f00b73b79b07756Jim InghamMutex::Lock() 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2755f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea DEBUG_LOG ("[%4.4" PRIx64 "/%4.4" PRIx64 "] pthread_mutex_lock (%p)...\n", Host::GetCurrentProcessID(), Host::GetCurrentThreadID(), &m_mutex); 27692c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton 27792c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton#if ENABLE_MUTEX_ERROR_CHECKING 278088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham error_check_mutex (&m_mutex, eMutexActionAssertInitialized); 27992c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton#endif 28092c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton 281088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham int err = ::pthread_mutex_lock (&m_mutex); 28292c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton 28392c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton 2841503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#if ENABLE_MUTEX_ERROR_CHECKING 2851503c0fa0a4a9351484e47d88310435592494d76Greg Clayton if (err) 2861503c0fa0a4a9351484e47d88310435592494d76Greg Clayton { 287088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham Host::SetCrashDescriptionWithFormat ("%s error: pthread_mutex_lock(%p) => err = %i (%s)", __PRETTY_FUNCTION__, &m_mutex, err, strerror(err)); 2881503c0fa0a4a9351484e47d88310435592494d76Greg Clayton assert(err == 0); 2891503c0fa0a4a9351484e47d88310435592494d76Greg Clayton } 2901503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#endif 2915f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea DEBUG_LOG ("[%4.4" PRIx64 "/%4.4" PRIx64 "] pthread_mutex_lock (%p) => %i\n", Host::GetCurrentProcessID(), Host::GetCurrentThreadID(), &m_mutex, err); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return err; 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 295088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham//---------------------------------------------------------------------- 296088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// Attempts to lock the mutex owned by this object without blocking. 297088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// If the mutex is already locked, TryLock() will not block waiting 298088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// for the mutex, but will return an error condition. 299088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// 300088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// RETURNS 301088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// The error code from the pthread_mutex_trylock() function call. 302088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham//---------------------------------------------------------------------- 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 304088684d31c66df959fa2f3840f00b73b79b07756Jim InghamMutex::TryLock(const char *failure_message) 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30692c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton#if ENABLE_MUTEX_ERROR_CHECKING 307088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham error_check_mutex (&m_mutex, eMutexActionAssertInitialized); 30892c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton#endif 30992c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton 310088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham int err = ::pthread_mutex_trylock (&m_mutex); 3115f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea DEBUG_LOG ("[%4.4" PRIx64 "/%4.4" PRIx64 "] pthread_mutex_trylock (%p) => %i\n", Host::GetCurrentProcessID(), Host::GetCurrentThreadID(), &m_mutex, err); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return err; 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 315088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham//---------------------------------------------------------------------- 316088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// If the current thread holds the lock on the owned mutex, then 317088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// Unlock() will unlock the mutex. Calling Unlock() on this object 318088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// that the calling thread does not hold will result in undefined 319088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// behavior. 320088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// 321088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// RETURNS 322088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham// The error code from the pthread_mutex_unlock() function call. 323088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham//---------------------------------------------------------------------- 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 325088684d31c66df959fa2f3840f00b73b79b07756Jim InghamMutex::Unlock() 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32792c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton#if ENABLE_MUTEX_ERROR_CHECKING 328088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham error_check_mutex (&m_mutex, eMutexActionAssertInitialized); 32992c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton#endif 33092c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton 331088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham int err = ::pthread_mutex_unlock (&m_mutex); 33292c3b9eed6cf5e7faf18a053c400bddbefa5ff05Greg Clayton 3331503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#if ENABLE_MUTEX_ERROR_CHECKING 3341503c0fa0a4a9351484e47d88310435592494d76Greg Clayton if (err) 3351503c0fa0a4a9351484e47d88310435592494d76Greg Clayton { 336088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham Host::SetCrashDescriptionWithFormat ("%s error: pthread_mutex_unlock(%p) => err = %i (%s)", __PRETTY_FUNCTION__, &m_mutex, err, strerror(err)); 3371503c0fa0a4a9351484e47d88310435592494d76Greg Clayton assert(err == 0); 3381503c0fa0a4a9351484e47d88310435592494d76Greg Clayton } 3391503c0fa0a4a9351484e47d88310435592494d76Greg Clayton#endif 3405f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea DEBUG_LOG ("[%4.4" PRIx64 "/%4.4" PRIx64 "] pthread_mutex_unlock (%p) => %i\n", Host::GetCurrentProcessID(), Host::GetCurrentThreadID(), &m_mutex, err); 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return err; 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 344088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham#ifdef LLDB_CONFIGURATION_DEBUG 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 346088684d31c66df959fa2f3840f00b73b79b07756Jim InghamTrackingMutex::Unlock () 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 348088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham if (!m_failure_message.empty()) 349088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham Host::SetCrashDescriptionWithFormat ("Unlocking lock (on thread %p) that thread: %p failed to get: %s", 350088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham pthread_self(), 351088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham m_thread_that_tried, 352088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham m_failure_message.c_str()); 353088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham assert (m_failure_message.empty()); 354088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham return Mutex::Unlock(); 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 356559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata 357559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granataint 358559bb5cacf6777cf1ad8ee32256585d049123332Enrico GranataLoggingMutex::Lock () 359559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata{ 360559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata printf("locking mutex %p by [%4.4" PRIx64 "/%4.4" PRIx64 "]...", this, Host::GetCurrentProcessID(), Host::GetCurrentThreadID()); 361559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata int x = Mutex::Lock(); 362559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata m_locked = true; 363559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata printf("%d\n",x); 364559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata return x; 365559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata} 366559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata 367559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granataint 368559bb5cacf6777cf1ad8ee32256585d049123332Enrico GranataLoggingMutex::Unlock () 369559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata{ 370559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata printf("unlocking mutex %p by [%4.4" PRIx64 "/%4.4" PRIx64 "]...", this, Host::GetCurrentProcessID(), Host::GetCurrentThreadID()); 371559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata int x = Mutex::Unlock(); 372559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata m_locked = false; 373559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata printf("%d\n",x); 374559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata return x; 375559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata} 376559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata 377559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granataint 378559bb5cacf6777cf1ad8ee32256585d049123332Enrico GranataLoggingMutex::TryLock (const char *failure_message) 379559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata{ 380559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata printf("trylocking mutex %p by [%4.4" PRIx64 "/%4.4" PRIx64 "]...", this, Host::GetCurrentProcessID(), Host::GetCurrentThreadID()); 381559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata int x = Mutex::TryLock(failure_message); 382559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata if (x == 0) 383559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata m_locked = true; 384559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata printf("%d\n",x); 385559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata return x; 386559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata} 387559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata 388088684d31c66df959fa2f3840f00b73b79b07756Jim Ingham#endif 389559bb5cacf6777cf1ad8ee32256585d049123332Enrico Granata 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 391