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