diff options
author | Brotcrunsher <brotcrunsher@hotmail.de> | 2025-01-13 16:16:23 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-13 10:16:23 -0500 |
commit | ab6c89c220192159a66c1a91ad3dd892bad1c3b2 (patch) | |
tree | cdb6604e2e873aa0370043ec0648ac57a998d3e8 /libcxx/src | |
parent | 7378afd167860083eaaf0d8e411c91a28a6605d6 (diff) | |
download | llvm-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.cpp | 16 |
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(); + } } } |