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