xref: /aosp_15_r20/external/llvm/lib/Support/RWMutex.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- RWMutex.cpp - Reader/Writer 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::RWMutex 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/RWMutex.h"
16*9880d681SAndroid Build Coastguard Worker #include <cstring>
17*9880d681SAndroid Build Coastguard Worker 
18*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
19*9880d681SAndroid Build Coastguard Worker //=== WARNING: Implementation here must contain only TRULY operating system
20*9880d681SAndroid Build Coastguard Worker //===          independent code.
21*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
22*9880d681SAndroid Build Coastguard Worker 
23*9880d681SAndroid Build Coastguard Worker #if !defined(LLVM_ENABLE_THREADS) || LLVM_ENABLE_THREADS == 0
24*9880d681SAndroid Build Coastguard Worker // Define all methods as no-ops if threading is explicitly disabled
25*9880d681SAndroid Build Coastguard Worker namespace llvm {
26*9880d681SAndroid Build Coastguard Worker using namespace sys;
RWMutexImpl()27*9880d681SAndroid Build Coastguard Worker RWMutexImpl::RWMutexImpl() { }
~RWMutexImpl()28*9880d681SAndroid Build Coastguard Worker RWMutexImpl::~RWMutexImpl() { }
reader_acquire()29*9880d681SAndroid Build Coastguard Worker bool RWMutexImpl::reader_acquire() { return true; }
reader_release()30*9880d681SAndroid Build Coastguard Worker bool RWMutexImpl::reader_release() { return true; }
writer_acquire()31*9880d681SAndroid Build Coastguard Worker bool RWMutexImpl::writer_acquire() { return true; }
writer_release()32*9880d681SAndroid Build Coastguard Worker bool RWMutexImpl::writer_release() { return true; }
33*9880d681SAndroid Build Coastguard Worker }
34*9880d681SAndroid Build Coastguard Worker #else
35*9880d681SAndroid Build Coastguard Worker 
36*9880d681SAndroid Build Coastguard Worker #if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_RWLOCK_INIT)
37*9880d681SAndroid Build Coastguard Worker 
38*9880d681SAndroid Build Coastguard Worker #include <cassert>
39*9880d681SAndroid Build Coastguard Worker #include <pthread.h>
40*9880d681SAndroid Build Coastguard Worker #include <stdlib.h>
41*9880d681SAndroid Build Coastguard Worker 
42*9880d681SAndroid Build Coastguard Worker namespace llvm {
43*9880d681SAndroid Build Coastguard Worker using namespace sys;
44*9880d681SAndroid Build Coastguard Worker 
45*9880d681SAndroid Build Coastguard Worker // Construct a RWMutex using pthread calls
RWMutexImpl()46*9880d681SAndroid Build Coastguard Worker RWMutexImpl::RWMutexImpl()
47*9880d681SAndroid Build Coastguard Worker   : data_(nullptr)
48*9880d681SAndroid Build Coastguard Worker {
49*9880d681SAndroid Build Coastguard Worker   // Declare the pthread_rwlock data structures
50*9880d681SAndroid Build Coastguard Worker   pthread_rwlock_t* rwlock =
51*9880d681SAndroid Build Coastguard Worker     static_cast<pthread_rwlock_t*>(malloc(sizeof(pthread_rwlock_t)));
52*9880d681SAndroid Build Coastguard Worker 
53*9880d681SAndroid Build Coastguard Worker #ifdef __APPLE__
54*9880d681SAndroid Build Coastguard Worker   // Workaround a bug/mis-feature in Darwin's pthread_rwlock_init.
55*9880d681SAndroid Build Coastguard Worker   bzero(rwlock, sizeof(pthread_rwlock_t));
56*9880d681SAndroid Build Coastguard Worker #endif
57*9880d681SAndroid Build Coastguard Worker 
58*9880d681SAndroid Build Coastguard Worker   // Initialize the rwlock
59*9880d681SAndroid Build Coastguard Worker   int errorcode = pthread_rwlock_init(rwlock, nullptr);
60*9880d681SAndroid Build Coastguard Worker   (void)errorcode;
61*9880d681SAndroid Build Coastguard Worker   assert(errorcode == 0);
62*9880d681SAndroid Build Coastguard Worker 
63*9880d681SAndroid Build Coastguard Worker   // Assign the data member
64*9880d681SAndroid Build Coastguard Worker   data_ = rwlock;
65*9880d681SAndroid Build Coastguard Worker }
66*9880d681SAndroid Build Coastguard Worker 
67*9880d681SAndroid Build Coastguard Worker // Destruct a RWMutex
~RWMutexImpl()68*9880d681SAndroid Build Coastguard Worker RWMutexImpl::~RWMutexImpl()
69*9880d681SAndroid Build Coastguard Worker {
70*9880d681SAndroid Build Coastguard Worker   pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_);
71*9880d681SAndroid Build Coastguard Worker   assert(rwlock != nullptr);
72*9880d681SAndroid Build Coastguard Worker   pthread_rwlock_destroy(rwlock);
73*9880d681SAndroid Build Coastguard Worker   free(rwlock);
74*9880d681SAndroid Build Coastguard Worker }
75*9880d681SAndroid Build Coastguard Worker 
76*9880d681SAndroid Build Coastguard Worker bool
reader_acquire()77*9880d681SAndroid Build Coastguard Worker RWMutexImpl::reader_acquire()
78*9880d681SAndroid Build Coastguard Worker {
79*9880d681SAndroid Build Coastguard Worker   pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_);
80*9880d681SAndroid Build Coastguard Worker   assert(rwlock != nullptr);
81*9880d681SAndroid Build Coastguard Worker 
82*9880d681SAndroid Build Coastguard Worker   int errorcode = pthread_rwlock_rdlock(rwlock);
83*9880d681SAndroid Build Coastguard Worker   return errorcode == 0;
84*9880d681SAndroid Build Coastguard Worker }
85*9880d681SAndroid Build Coastguard Worker 
86*9880d681SAndroid Build Coastguard Worker bool
reader_release()87*9880d681SAndroid Build Coastguard Worker RWMutexImpl::reader_release()
88*9880d681SAndroid Build Coastguard Worker {
89*9880d681SAndroid Build Coastguard Worker   pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_);
90*9880d681SAndroid Build Coastguard Worker   assert(rwlock != nullptr);
91*9880d681SAndroid Build Coastguard Worker 
92*9880d681SAndroid Build Coastguard Worker   int errorcode = pthread_rwlock_unlock(rwlock);
93*9880d681SAndroid Build Coastguard Worker   return errorcode == 0;
94*9880d681SAndroid Build Coastguard Worker }
95*9880d681SAndroid Build Coastguard Worker 
96*9880d681SAndroid Build Coastguard Worker bool
writer_acquire()97*9880d681SAndroid Build Coastguard Worker RWMutexImpl::writer_acquire()
98*9880d681SAndroid Build Coastguard Worker {
99*9880d681SAndroid Build Coastguard Worker   pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_);
100*9880d681SAndroid Build Coastguard Worker   assert(rwlock != nullptr);
101*9880d681SAndroid Build Coastguard Worker 
102*9880d681SAndroid Build Coastguard Worker   int errorcode = pthread_rwlock_wrlock(rwlock);
103*9880d681SAndroid Build Coastguard Worker   return errorcode == 0;
104*9880d681SAndroid Build Coastguard Worker }
105*9880d681SAndroid Build Coastguard Worker 
106*9880d681SAndroid Build Coastguard Worker bool
writer_release()107*9880d681SAndroid Build Coastguard Worker RWMutexImpl::writer_release()
108*9880d681SAndroid Build Coastguard Worker {
109*9880d681SAndroid Build Coastguard Worker   pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_);
110*9880d681SAndroid Build Coastguard Worker   assert(rwlock != nullptr);
111*9880d681SAndroid Build Coastguard Worker 
112*9880d681SAndroid Build Coastguard Worker   int errorcode = pthread_rwlock_unlock(rwlock);
113*9880d681SAndroid Build Coastguard Worker   return errorcode == 0;
114*9880d681SAndroid Build Coastguard Worker }
115*9880d681SAndroid Build Coastguard Worker 
116*9880d681SAndroid Build Coastguard Worker }
117*9880d681SAndroid Build Coastguard Worker 
118*9880d681SAndroid Build Coastguard Worker #elif defined(LLVM_ON_UNIX)
119*9880d681SAndroid Build Coastguard Worker #include "Unix/RWMutex.inc"
120*9880d681SAndroid Build Coastguard Worker #elif defined( LLVM_ON_WIN32)
121*9880d681SAndroid Build Coastguard Worker #include "Windows/RWMutex.inc"
122*9880d681SAndroid Build Coastguard Worker #else
123*9880d681SAndroid Build Coastguard Worker #warning Neither LLVM_ON_UNIX nor LLVM_ON_WIN32 was set in Support/Mutex.cpp
124*9880d681SAndroid Build Coastguard Worker #endif
125*9880d681SAndroid Build Coastguard Worker #endif
126