1*9880d681SAndroid Build Coastguard Worker //===- Mutex.cpp - Mutual Exclusion Lock ------------------------*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file implements the llvm::sys::Mutex class. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #include "llvm/Config/config.h" 15*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Mutex.h" 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 18*9880d681SAndroid Build Coastguard Worker //=== WARNING: Implementation here must contain only TRULY operating system 19*9880d681SAndroid Build Coastguard Worker //=== independent code. 20*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Worker #if !defined(LLVM_ENABLE_THREADS) || LLVM_ENABLE_THREADS == 0 23*9880d681SAndroid Build Coastguard Worker // Define all methods as no-ops if threading is explicitly disabled 24*9880d681SAndroid Build Coastguard Worker namespace llvm { 25*9880d681SAndroid Build Coastguard Worker using namespace sys; MutexImpl(bool recursive)26*9880d681SAndroid Build Coastguard WorkerMutexImpl::MutexImpl( bool recursive) { } ~MutexImpl()27*9880d681SAndroid Build Coastguard WorkerMutexImpl::~MutexImpl() { } acquire()28*9880d681SAndroid Build Coastguard Workerbool MutexImpl::acquire() { return true; } release()29*9880d681SAndroid Build Coastguard Workerbool MutexImpl::release() { return true; } tryacquire()30*9880d681SAndroid Build Coastguard Workerbool MutexImpl::tryacquire() { return true; } 31*9880d681SAndroid Build Coastguard Worker } 32*9880d681SAndroid Build Coastguard Worker #else 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker #if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_MUTEX_LOCK) 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker #include <cassert> 37*9880d681SAndroid Build Coastguard Worker #include <pthread.h> 38*9880d681SAndroid Build Coastguard Worker #include <stdlib.h> 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker namespace llvm { 41*9880d681SAndroid Build Coastguard Worker using namespace sys; 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker // Construct a Mutex using pthread calls MutexImpl(bool recursive)44*9880d681SAndroid Build Coastguard WorkerMutexImpl::MutexImpl( bool recursive) 45*9880d681SAndroid Build Coastguard Worker : data_(nullptr) 46*9880d681SAndroid Build Coastguard Worker { 47*9880d681SAndroid Build Coastguard Worker // Declare the pthread_mutex data structures 48*9880d681SAndroid Build Coastguard Worker pthread_mutex_t* mutex = 49*9880d681SAndroid Build Coastguard Worker static_cast<pthread_mutex_t*>(malloc(sizeof(pthread_mutex_t))); 50*9880d681SAndroid Build Coastguard Worker pthread_mutexattr_t attr; 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker // Initialize the mutex attributes 53*9880d681SAndroid Build Coastguard Worker int errorcode = pthread_mutexattr_init(&attr); 54*9880d681SAndroid Build Coastguard Worker assert(errorcode == 0); (void)errorcode; 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker // Initialize the mutex as a recursive mutex, if requested, or normal 57*9880d681SAndroid Build Coastguard Worker // otherwise. 58*9880d681SAndroid Build Coastguard Worker int kind = ( recursive ? PTHREAD_MUTEX_RECURSIVE : PTHREAD_MUTEX_NORMAL ); 59*9880d681SAndroid Build Coastguard Worker errorcode = pthread_mutexattr_settype(&attr, kind); 60*9880d681SAndroid Build Coastguard Worker assert(errorcode == 0); 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker // Initialize the mutex 63*9880d681SAndroid Build Coastguard Worker errorcode = pthread_mutex_init(mutex, &attr); 64*9880d681SAndroid Build Coastguard Worker assert(errorcode == 0); 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker // Destroy the attributes 67*9880d681SAndroid Build Coastguard Worker errorcode = pthread_mutexattr_destroy(&attr); 68*9880d681SAndroid Build Coastguard Worker assert(errorcode == 0); 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker // Assign the data member 71*9880d681SAndroid Build Coastguard Worker data_ = mutex; 72*9880d681SAndroid Build Coastguard Worker } 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker // Destruct a Mutex ~MutexImpl()75*9880d681SAndroid Build Coastguard WorkerMutexImpl::~MutexImpl() 76*9880d681SAndroid Build Coastguard Worker { 77*9880d681SAndroid Build Coastguard Worker pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_); 78*9880d681SAndroid Build Coastguard Worker assert(mutex != nullptr); 79*9880d681SAndroid Build Coastguard Worker pthread_mutex_destroy(mutex); 80*9880d681SAndroid Build Coastguard Worker free(mutex); 81*9880d681SAndroid Build Coastguard Worker } 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker bool acquire()84*9880d681SAndroid Build Coastguard WorkerMutexImpl::acquire() 85*9880d681SAndroid Build Coastguard Worker { 86*9880d681SAndroid Build Coastguard Worker pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_); 87*9880d681SAndroid Build Coastguard Worker assert(mutex != nullptr); 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker int errorcode = pthread_mutex_lock(mutex); 90*9880d681SAndroid Build Coastguard Worker return errorcode == 0; 91*9880d681SAndroid Build Coastguard Worker } 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker bool release()94*9880d681SAndroid Build Coastguard WorkerMutexImpl::release() 95*9880d681SAndroid Build Coastguard Worker { 96*9880d681SAndroid Build Coastguard Worker pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_); 97*9880d681SAndroid Build Coastguard Worker assert(mutex != nullptr); 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker int errorcode = pthread_mutex_unlock(mutex); 100*9880d681SAndroid Build Coastguard Worker return errorcode == 0; 101*9880d681SAndroid Build Coastguard Worker } 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker bool tryacquire()104*9880d681SAndroid Build Coastguard WorkerMutexImpl::tryacquire() 105*9880d681SAndroid Build Coastguard Worker { 106*9880d681SAndroid Build Coastguard Worker pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_); 107*9880d681SAndroid Build Coastguard Worker assert(mutex != nullptr); 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker int errorcode = pthread_mutex_trylock(mutex); 110*9880d681SAndroid Build Coastguard Worker return errorcode == 0; 111*9880d681SAndroid Build Coastguard Worker } 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker } 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker #elif defined(LLVM_ON_UNIX) 116*9880d681SAndroid Build Coastguard Worker #include "Unix/Mutex.inc" 117*9880d681SAndroid Build Coastguard Worker #elif defined( LLVM_ON_WIN32) 118*9880d681SAndroid Build Coastguard Worker #include "Windows/Mutex.inc" 119*9880d681SAndroid Build Coastguard Worker #else 120*9880d681SAndroid Build Coastguard Worker #warning Neither LLVM_ON_UNIX nor LLVM_ON_WIN32 was set in Support/Mutex.cpp 121*9880d681SAndroid Build Coastguard Worker #endif 122*9880d681SAndroid Build Coastguard Worker #endif 123