xref: /aosp_15_r20/external/llvm/lib/Support/Mutex.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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 Worker MutexImpl::MutexImpl( bool recursive) { }
~MutexImpl()27*9880d681SAndroid Build Coastguard Worker MutexImpl::~MutexImpl() { }
acquire()28*9880d681SAndroid Build Coastguard Worker bool MutexImpl::acquire() { return true; }
release()29*9880d681SAndroid Build Coastguard Worker bool MutexImpl::release() { return true; }
tryacquire()30*9880d681SAndroid Build Coastguard Worker bool 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 Worker MutexImpl::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 Worker MutexImpl::~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 Worker MutexImpl::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 Worker MutexImpl::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 Worker MutexImpl::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