Mutex.cpp revision 234353
1218885Sdim//===- Mutex.cpp - Mutual Exclusion Lock ------------------------*- C++ -*-===// 2218885Sdim// 3218885Sdim// The LLVM Compiler Infrastructure 4218885Sdim// 5218885Sdim// This file is distributed under the University of Illinois Open Source 6218885Sdim// License. See LICENSE.TXT for details. 7218885Sdim// 8218885Sdim//===----------------------------------------------------------------------===// 9218885Sdim// 10218885Sdim// This file implements the llvm::sys::Mutex class. 11218885Sdim// 12218885Sdim//===----------------------------------------------------------------------===// 13218885Sdim 14218885Sdim#include "llvm/Config/config.h" 15218885Sdim#include "llvm/Support/Mutex.h" 16218885Sdim 17218885Sdim//===----------------------------------------------------------------------===// 18218885Sdim//=== WARNING: Implementation here must contain only TRULY operating system 19218885Sdim//=== independent code. 20218885Sdim//===----------------------------------------------------------------------===// 21218885Sdim 22234353Sdim#if !defined(LLVM_ENABLE_THREADS) || LLVM_ENABLE_THREADS == 0 23218885Sdim// Define all methods as no-ops if threading is explicitly disabled 24218885Sdimnamespace llvm { 25218885Sdimusing namespace sys; 26218885SdimMutexImpl::MutexImpl( bool recursive) { } 27218885SdimMutexImpl::~MutexImpl() { } 28218885Sdimbool MutexImpl::acquire() { return true; } 29218885Sdimbool MutexImpl::release() { return true; } 30218885Sdimbool MutexImpl::tryacquire() { return true; } 31218885Sdim} 32218885Sdim#else 33218885Sdim 34218885Sdim#if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_MUTEX_LOCK) 35218885Sdim 36218885Sdim#include <cassert> 37218885Sdim#include <pthread.h> 38218885Sdim#include <stdlib.h> 39218885Sdim 40218885Sdimnamespace llvm { 41218885Sdimusing namespace sys; 42218885Sdim 43218885Sdim// Construct a Mutex using pthread calls 44218885SdimMutexImpl::MutexImpl( bool recursive) 45218885Sdim : data_(0) 46218885Sdim{ 47234353Sdim // Declare the pthread_mutex data structures 48234353Sdim pthread_mutex_t* mutex = 49234353Sdim static_cast<pthread_mutex_t*>(malloc(sizeof(pthread_mutex_t))); 50234353Sdim pthread_mutexattr_t attr; 51218885Sdim 52234353Sdim // Initialize the mutex attributes 53234353Sdim int errorcode = pthread_mutexattr_init(&attr); 54234353Sdim assert(errorcode == 0); (void)errorcode; 55218885Sdim 56234353Sdim // Initialize the mutex as a recursive mutex, if requested, or normal 57234353Sdim // otherwise. 58234353Sdim int kind = ( recursive ? PTHREAD_MUTEX_RECURSIVE : PTHREAD_MUTEX_NORMAL ); 59234353Sdim errorcode = pthread_mutexattr_settype(&attr, kind); 60234353Sdim assert(errorcode == 0); 61218885Sdim 62218885Sdim#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__DragonFly__) 63234353Sdim // Make it a process local mutex 64234353Sdim errorcode = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_PRIVATE); 65234353Sdim assert(errorcode == 0); 66218885Sdim#endif 67218885Sdim 68234353Sdim // Initialize the mutex 69234353Sdim errorcode = pthread_mutex_init(mutex, &attr); 70234353Sdim assert(errorcode == 0); 71218885Sdim 72234353Sdim // Destroy the attributes 73234353Sdim errorcode = pthread_mutexattr_destroy(&attr); 74234353Sdim assert(errorcode == 0); 75218885Sdim 76234353Sdim // Assign the data member 77234353Sdim data_ = mutex; 78218885Sdim} 79218885Sdim 80218885Sdim// Destruct a Mutex 81218885SdimMutexImpl::~MutexImpl() 82218885Sdim{ 83234353Sdim pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_); 84234353Sdim assert(mutex != 0); 85234353Sdim pthread_mutex_destroy(mutex); 86234353Sdim free(mutex); 87218885Sdim} 88218885Sdim 89218885Sdimbool 90218885SdimMutexImpl::acquire() 91218885Sdim{ 92234353Sdim pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_); 93234353Sdim assert(mutex != 0); 94218885Sdim 95234353Sdim int errorcode = pthread_mutex_lock(mutex); 96234353Sdim return errorcode == 0; 97218885Sdim} 98218885Sdim 99218885Sdimbool 100218885SdimMutexImpl::release() 101218885Sdim{ 102234353Sdim pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_); 103234353Sdim assert(mutex != 0); 104218885Sdim 105234353Sdim int errorcode = pthread_mutex_unlock(mutex); 106234353Sdim return errorcode == 0; 107218885Sdim} 108218885Sdim 109218885Sdimbool 110218885SdimMutexImpl::tryacquire() 111218885Sdim{ 112234353Sdim pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_); 113234353Sdim assert(mutex != 0); 114218885Sdim 115234353Sdim int errorcode = pthread_mutex_trylock(mutex); 116234353Sdim return errorcode == 0; 117218885Sdim} 118218885Sdim 119218885Sdim} 120218885Sdim 121218885Sdim#elif defined(LLVM_ON_UNIX) 122218885Sdim#include "Unix/Mutex.inc" 123218885Sdim#elif defined( LLVM_ON_WIN32) 124218885Sdim#include "Windows/Mutex.inc" 125218885Sdim#else 126226633Sdim#warning Neither LLVM_ON_UNIX nor LLVM_ON_WIN32 was set in Support/Mutex.cpp 127218885Sdim#endif 128218885Sdim#endif 129