aboutsummaryrefslogtreecommitdiff
path: root/libcxx/src
diff options
context:
space:
mode:
authorBrotcrunsher <brotcrunsher@hotmail.de>2025-01-13 16:16:23 +0100
committerGitHub <noreply@github.com>2025-01-13 10:16:23 -0500
commitab6c89c220192159a66c1a91ad3dd892bad1c3b2 (patch)
treecdb6604e2e873aa0370043ec0648ac57a998d3e8 /libcxx/src
parent7378afd167860083eaaf0d8e411c91a28a6605d6 (diff)
downloadllvm-ab6c89c220192159a66c1a91ad3dd892bad1c3b2.zip
llvm-ab6c89c220192159a66c1a91ad3dd892bad1c3b2.tar.gz
llvm-ab6c89c220192159a66c1a91ad3dd892bad1c3b2.tar.bz2
[libcxx] Don't hold the lock when calling notify_* on gates in std::shared_mutex (#107876)
Holding the associated lock while calling notify_* on a condition_variable is generally considered a pessimization, as the notified thread might "instantly" wake up, notice that it can't acquire the lock, and then goes back to sleep.
Diffstat (limited to 'libcxx/src')
-rw-r--r--libcxx/src/shared_mutex.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/libcxx/src/shared_mutex.cpp b/libcxx/src/shared_mutex.cpp
index 1a346dd..6180833 100644
--- a/libcxx/src/shared_mutex.cpp
+++ b/libcxx/src/shared_mutex.cpp
@@ -38,8 +38,10 @@ bool __shared_mutex_base::try_lock() {
}
void __shared_mutex_base::unlock() {
- lock_guard<mutex> _(__mut_);
- __state_ = 0;
+ {
+ lock_guard<mutex> _(__mut_);
+ __state_ = 0;
+ }
__gate1_.notify_all();
}
@@ -67,16 +69,20 @@ bool __shared_mutex_base::try_lock_shared() {
}
void __shared_mutex_base::unlock_shared() {
- lock_guard<mutex> _(__mut_);
+ unique_lock<mutex> lk(__mut_);
unsigned num_readers = (__state_ & __n_readers_) - 1;
__state_ &= ~__n_readers_;
__state_ |= num_readers;
if (__state_ & __write_entered_) {
- if (num_readers == 0)
+ if (num_readers == 0) {
+ lk.unlock();
__gate2_.notify_one();
+ }
} else {
- if (num_readers == __n_readers_ - 1)
+ if (num_readers == __n_readers_ - 1) {
+ lk.unlock();
__gate1_.notify_one();
+ }
}
}