blob: 73d4dc1c1c7a9dfb79f4aa2e2b1bf8c248d405c1 [file] [log] [blame]
Louis Dionneeb8650a2021-11-17 21:25:011//===----------------------------------------------------------------------===//
Howard Hinnantead6f162013-09-21 01:49:282//
Chandler Carruth57b08b02019-01-19 10:56:403// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantead6f162013-09-21 01:49:286//
7//===----------------------------------------------------------------------===//
8
Arthur O'Dwyerbbb0f2c2022-02-11 18:00:399#include <__config>
10
Jonathan Roelofsb3fcc672014-09-05 19:45:0511#ifndef _LIBCPP_HAS_NO_THREADS
12
Arthur O'Dwyerbbb0f2c2022-02-11 18:00:3913#include <shared_mutex>
Michał Górnya9b5fff2019-12-02 10:49:2014#if defined(__ELF__) && defined(_LIBCPP_LINK_PTHREAD_LIB)
Arthur O'Dwyerbbb0f2c2022-02-11 18:00:3915# pragma comment(lib, "pthread")
Petr Hosek996e62e2019-05-30 01:34:4116#endif
Howard Hinnantead6f162013-09-21 01:49:2817
18_LIBCPP_BEGIN_NAMESPACE_STD
19
Marshall Clowf69ae472015-06-30 14:04:1420// Shared Mutex Base
21__shared_mutex_base::__shared_mutex_base()
Howard Hinnantead6f162013-09-21 01:49:2822 : __state_(0)
23{
24}
25
26// Exclusive ownership
27
28void
Marshall Clowf69ae472015-06-30 14:04:1429__shared_mutex_base::lock()
Howard Hinnantead6f162013-09-21 01:49:2830{
31 unique_lock<mutex> lk(__mut_);
32 while (__state_ & __write_entered_)
33 __gate1_.wait(lk);
34 __state_ |= __write_entered_;
35 while (__state_ & __n_readers_)
36 __gate2_.wait(lk);
37}
38
39bool
Marshall Clowf69ae472015-06-30 14:04:1440__shared_mutex_base::try_lock()
Howard Hinnantead6f162013-09-21 01:49:2841{
42 unique_lock<mutex> lk(__mut_);
43 if (__state_ == 0)
44 {
45 __state_ = __write_entered_;
46 return true;
47 }
48 return false;
49}
50
51void
Marshall Clowf69ae472015-06-30 14:04:1452__shared_mutex_base::unlock()
Howard Hinnantead6f162013-09-21 01:49:2853{
54 lock_guard<mutex> _(__mut_);
55 __state_ = 0;
56 __gate1_.notify_all();
57}
58
59// Shared ownership
60
61void
Marshall Clowf69ae472015-06-30 14:04:1462__shared_mutex_base::lock_shared()
Howard Hinnantead6f162013-09-21 01:49:2863{
64 unique_lock<mutex> lk(__mut_);
65 while ((__state_ & __write_entered_) || (__state_ & __n_readers_) == __n_readers_)
66 __gate1_.wait(lk);
67 unsigned num_readers = (__state_ & __n_readers_) + 1;
68 __state_ &= ~__n_readers_;
69 __state_ |= num_readers;
70}
71
72bool
Marshall Clowf69ae472015-06-30 14:04:1473__shared_mutex_base::try_lock_shared()
Howard Hinnantead6f162013-09-21 01:49:2874{
75 unique_lock<mutex> lk(__mut_);
76 unsigned num_readers = __state_ & __n_readers_;
77 if (!(__state_ & __write_entered_) && num_readers != __n_readers_)
78 {
79 ++num_readers;
80 __state_ &= ~__n_readers_;
81 __state_ |= num_readers;
82 return true;
83 }
84 return false;
85}
86
87void
Marshall Clowf69ae472015-06-30 14:04:1488__shared_mutex_base::unlock_shared()
Howard Hinnantead6f162013-09-21 01:49:2889{
90 lock_guard<mutex> _(__mut_);
91 unsigned num_readers = (__state_ & __n_readers_) - 1;
92 __state_ &= ~__n_readers_;
93 __state_ |= num_readers;
94 if (__state_ & __write_entered_)
95 {
96 if (num_readers == 0)
97 __gate2_.notify_one();
98 }
99 else
100 {
101 if (num_readers == __n_readers_ - 1)
102 __gate1_.notify_one();
103 }
104}
105
106
Marshall Clowf69ae472015-06-30 14:04:14107// Shared Timed Mutex
108// These routines are here for ABI stability
Nikolas Klauser84fc2c32022-09-02 14:19:07109shared_timed_mutex::shared_timed_mutex() : __base_() {}
110void shared_timed_mutex::lock() { return __base_.lock(); }
111bool shared_timed_mutex::try_lock() { return __base_.try_lock(); }
112void shared_timed_mutex::unlock() { return __base_.unlock(); }
113void shared_timed_mutex::lock_shared() { return __base_.lock_shared(); }
114bool shared_timed_mutex::try_lock_shared() { return __base_.try_lock_shared(); }
115void shared_timed_mutex::unlock_shared() { return __base_.unlock_shared(); }
Marshall Clowf69ae472015-06-30 14:04:14116
Howard Hinnantead6f162013-09-21 01:49:28117_LIBCPP_END_NAMESPACE_STD
Jonathan Roelofsb3fcc672014-09-05 19:45:05118
119#endif // !_LIBCPP_HAS_NO_THREADS