annotate llvm/lib/Support/RWMutex.cpp @ 181:df311c476dd5

CreateIdentifierInfo in ParseCbC (not yet worked)
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 31 May 2020 12:30:11 +0900
parents 1d019706d866
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===- RWMutex.cpp - Reader/Writer Mutual Exclusion Lock --------*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This file implements the llvm::sys::RWMutex class.
anatofuz
parents:
diff changeset
10 //
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 #include "llvm/Support/Allocator.h"
anatofuz
parents:
diff changeset
14 #include "llvm/Support/RWMutex.h"
anatofuz
parents:
diff changeset
15 #include "llvm/Config/config.h"
anatofuz
parents:
diff changeset
16
anatofuz
parents:
diff changeset
17 #if defined(LLVM_USE_RW_MUTEX_IMPL)
anatofuz
parents:
diff changeset
18 using namespace llvm;
anatofuz
parents:
diff changeset
19 using namespace sys;
anatofuz
parents:
diff changeset
20
anatofuz
parents:
diff changeset
21 #if !defined(LLVM_ENABLE_THREADS) || LLVM_ENABLE_THREADS == 0
anatofuz
parents:
diff changeset
22 // Define all methods as no-ops if threading is explicitly disabled
anatofuz
parents:
diff changeset
23
anatofuz
parents:
diff changeset
24 RWMutexImpl::RWMutexImpl() = default;
anatofuz
parents:
diff changeset
25 RWMutexImpl::~RWMutexImpl() = default;
anatofuz
parents:
diff changeset
26
anatofuz
parents:
diff changeset
27 bool RWMutexImpl::lock_shared() { return true; }
anatofuz
parents:
diff changeset
28 bool RWMutexImpl::unlock_shared() { return true; }
anatofuz
parents:
diff changeset
29 bool RWMutexImpl::lock() { return true; }
anatofuz
parents:
diff changeset
30 bool RWMutexImpl::unlock() { return true; }
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 #else
anatofuz
parents:
diff changeset
33
anatofuz
parents:
diff changeset
34 #if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_RWLOCK_INIT)
anatofuz
parents:
diff changeset
35
anatofuz
parents:
diff changeset
36 #include <cassert>
anatofuz
parents:
diff changeset
37 #include <cstdlib>
anatofuz
parents:
diff changeset
38 #include <pthread.h>
anatofuz
parents:
diff changeset
39
anatofuz
parents:
diff changeset
40 // Construct a RWMutex using pthread calls
anatofuz
parents:
diff changeset
41 RWMutexImpl::RWMutexImpl()
anatofuz
parents:
diff changeset
42 {
anatofuz
parents:
diff changeset
43 // Declare the pthread_rwlock data structures
anatofuz
parents:
diff changeset
44 pthread_rwlock_t* rwlock =
anatofuz
parents:
diff changeset
45 static_cast<pthread_rwlock_t*>(safe_malloc(sizeof(pthread_rwlock_t)));
anatofuz
parents:
diff changeset
46
anatofuz
parents:
diff changeset
47 #ifdef __APPLE__
anatofuz
parents:
diff changeset
48 // Workaround a bug/mis-feature in Darwin's pthread_rwlock_init.
anatofuz
parents:
diff changeset
49 bzero(rwlock, sizeof(pthread_rwlock_t));
anatofuz
parents:
diff changeset
50 #endif
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 // Initialize the rwlock
anatofuz
parents:
diff changeset
53 int errorcode = pthread_rwlock_init(rwlock, nullptr);
anatofuz
parents:
diff changeset
54 (void)errorcode;
anatofuz
parents:
diff changeset
55 assert(errorcode == 0);
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 // Assign the data member
anatofuz
parents:
diff changeset
58 data_ = rwlock;
anatofuz
parents:
diff changeset
59 }
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 // Destruct a RWMutex
anatofuz
parents:
diff changeset
62 RWMutexImpl::~RWMutexImpl()
anatofuz
parents:
diff changeset
63 {
anatofuz
parents:
diff changeset
64 pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_);
anatofuz
parents:
diff changeset
65 assert(rwlock != nullptr);
anatofuz
parents:
diff changeset
66 pthread_rwlock_destroy(rwlock);
anatofuz
parents:
diff changeset
67 free(rwlock);
anatofuz
parents:
diff changeset
68 }
anatofuz
parents:
diff changeset
69
anatofuz
parents:
diff changeset
70 bool
anatofuz
parents:
diff changeset
71 RWMutexImpl::lock_shared()
anatofuz
parents:
diff changeset
72 {
anatofuz
parents:
diff changeset
73 pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_);
anatofuz
parents:
diff changeset
74 assert(rwlock != nullptr);
anatofuz
parents:
diff changeset
75
anatofuz
parents:
diff changeset
76 int errorcode = pthread_rwlock_rdlock(rwlock);
anatofuz
parents:
diff changeset
77 return errorcode == 0;
anatofuz
parents:
diff changeset
78 }
anatofuz
parents:
diff changeset
79
anatofuz
parents:
diff changeset
80 bool
anatofuz
parents:
diff changeset
81 RWMutexImpl::unlock_shared()
anatofuz
parents:
diff changeset
82 {
anatofuz
parents:
diff changeset
83 pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_);
anatofuz
parents:
diff changeset
84 assert(rwlock != nullptr);
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 int errorcode = pthread_rwlock_unlock(rwlock);
anatofuz
parents:
diff changeset
87 return errorcode == 0;
anatofuz
parents:
diff changeset
88 }
anatofuz
parents:
diff changeset
89
anatofuz
parents:
diff changeset
90 bool
anatofuz
parents:
diff changeset
91 RWMutexImpl::lock()
anatofuz
parents:
diff changeset
92 {
anatofuz
parents:
diff changeset
93 pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_);
anatofuz
parents:
diff changeset
94 assert(rwlock != nullptr);
anatofuz
parents:
diff changeset
95
anatofuz
parents:
diff changeset
96 int errorcode = pthread_rwlock_wrlock(rwlock);
anatofuz
parents:
diff changeset
97 return errorcode == 0;
anatofuz
parents:
diff changeset
98 }
anatofuz
parents:
diff changeset
99
anatofuz
parents:
diff changeset
100 bool
anatofuz
parents:
diff changeset
101 RWMutexImpl::unlock()
anatofuz
parents:
diff changeset
102 {
anatofuz
parents:
diff changeset
103 pthread_rwlock_t* rwlock = static_cast<pthread_rwlock_t*>(data_);
anatofuz
parents:
diff changeset
104 assert(rwlock != nullptr);
anatofuz
parents:
diff changeset
105
anatofuz
parents:
diff changeset
106 int errorcode = pthread_rwlock_unlock(rwlock);
anatofuz
parents:
diff changeset
107 return errorcode == 0;
anatofuz
parents:
diff changeset
108 }
anatofuz
parents:
diff changeset
109
anatofuz
parents:
diff changeset
110 #else
anatofuz
parents:
diff changeset
111
anatofuz
parents:
diff changeset
112 RWMutexImpl::RWMutexImpl() : data_(new MutexImpl(false)) { }
anatofuz
parents:
diff changeset
113
anatofuz
parents:
diff changeset
114 RWMutexImpl::~RWMutexImpl() {
anatofuz
parents:
diff changeset
115 delete static_cast<MutexImpl *>(data_);
anatofuz
parents:
diff changeset
116 }
anatofuz
parents:
diff changeset
117
anatofuz
parents:
diff changeset
118 bool RWMutexImpl::lock_shared() {
anatofuz
parents:
diff changeset
119 return static_cast<MutexImpl *>(data_)->acquire();
anatofuz
parents:
diff changeset
120 }
anatofuz
parents:
diff changeset
121
anatofuz
parents:
diff changeset
122 bool RWMutexImpl::unlock_shared() {
anatofuz
parents:
diff changeset
123 return static_cast<MutexImpl *>(data_)->release();
anatofuz
parents:
diff changeset
124 }
anatofuz
parents:
diff changeset
125
anatofuz
parents:
diff changeset
126 bool RWMutexImpl::lock() {
anatofuz
parents:
diff changeset
127 return static_cast<MutexImpl *>(data_)->acquire();
anatofuz
parents:
diff changeset
128 }
anatofuz
parents:
diff changeset
129
anatofuz
parents:
diff changeset
130 bool RWMutexImpl::unlock() {
anatofuz
parents:
diff changeset
131 return static_cast<MutexImpl *>(data_)->release();
anatofuz
parents:
diff changeset
132 }
anatofuz
parents:
diff changeset
133
anatofuz
parents:
diff changeset
134 #endif
anatofuz
parents:
diff changeset
135 #endif
anatofuz
parents:
diff changeset
136 #endif