diff options
author | AlexSm <alex@ydb.tech> | 2024-03-05 10:40:59 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-05 12:40:59 +0300 |
commit | 1ac13c847b5358faba44dbb638a828e24369467b (patch) | |
tree | 07672b4dd3604ad3dee540a02c6494cb7d10dc3d /contrib/libs/cxxsupp/libcxx/src/shared_mutex.cpp | |
parent | ffcca3e7f7958ddc6487b91d3df8c01054bd0638 (diff) | |
download | ydb-1ac13c847b5358faba44dbb638a828e24369467b.tar.gz |
Library import 16 (#2433)
Co-authored-by: robot-piglet <robot-piglet@yandex-team.com>
Co-authored-by: deshevoy <deshevoy@yandex-team.com>
Co-authored-by: robot-contrib <robot-contrib@yandex-team.com>
Co-authored-by: thegeorg <thegeorg@yandex-team.com>
Co-authored-by: robot-ya-builder <robot-ya-builder@yandex-team.com>
Co-authored-by: svidyuk <svidyuk@yandex-team.com>
Co-authored-by: shadchin <shadchin@yandex-team.com>
Co-authored-by: robot-ratatosk <robot-ratatosk@yandex-team.com>
Co-authored-by: innokentii <innokentii@yandex-team.com>
Co-authored-by: arkady-e1ppa <arkady-e1ppa@yandex-team.com>
Co-authored-by: snermolaev <snermolaev@yandex-team.com>
Co-authored-by: dimdim11 <dimdim11@yandex-team.com>
Co-authored-by: kickbutt <kickbutt@yandex-team.com>
Co-authored-by: abdullinsaid <abdullinsaid@yandex-team.com>
Co-authored-by: korsunandrei <korsunandrei@yandex-team.com>
Co-authored-by: petrk <petrk@yandex-team.com>
Co-authored-by: miroslav2 <miroslav2@yandex-team.com>
Co-authored-by: serjflint <serjflint@yandex-team.com>
Co-authored-by: akhropov <akhropov@yandex-team.com>
Co-authored-by: prettyboy <prettyboy@yandex-team.com>
Co-authored-by: ilikepugs <ilikepugs@yandex-team.com>
Co-authored-by: hiddenpath <hiddenpath@yandex-team.com>
Co-authored-by: mikhnenko <mikhnenko@yandex-team.com>
Co-authored-by: spreis <spreis@yandex-team.com>
Co-authored-by: andreyshspb <andreyshspb@yandex-team.com>
Co-authored-by: dimaandreev <dimaandreev@yandex-team.com>
Co-authored-by: rashid <rashid@yandex-team.com>
Co-authored-by: robot-ydb-importer <robot-ydb-importer@yandex-team.com>
Co-authored-by: r-vetrov <r-vetrov@yandex-team.com>
Co-authored-by: ypodlesov <ypodlesov@yandex-team.com>
Co-authored-by: zaverden <zaverden@yandex-team.com>
Co-authored-by: vpozdyayev <vpozdyayev@yandex-team.com>
Co-authored-by: robot-cozmo <robot-cozmo@yandex-team.com>
Co-authored-by: v-korovin <v-korovin@yandex-team.com>
Co-authored-by: arikon <arikon@yandex-team.com>
Co-authored-by: khoden <khoden@yandex-team.com>
Co-authored-by: psydmm <psydmm@yandex-team.com>
Co-authored-by: robot-javacom <robot-javacom@yandex-team.com>
Co-authored-by: dtorilov <dtorilov@yandex-team.com>
Co-authored-by: sennikovmv <sennikovmv@yandex-team.com>
Co-authored-by: hcpp <hcpp@ydb.tech>
Diffstat (limited to 'contrib/libs/cxxsupp/libcxx/src/shared_mutex.cpp')
-rw-r--r-- | contrib/libs/cxxsupp/libcxx/src/shared_mutex.cpp | 128 |
1 files changed, 54 insertions, 74 deletions
diff --git a/contrib/libs/cxxsupp/libcxx/src/shared_mutex.cpp b/contrib/libs/cxxsupp/libcxx/src/shared_mutex.cpp index 73d4dc1c1c..49a51e0271 100644 --- a/contrib/libs/cxxsupp/libcxx/src/shared_mutex.cpp +++ b/contrib/libs/cxxsupp/libcxx/src/shared_mutex.cpp @@ -10,106 +10,86 @@ #ifndef _LIBCPP_HAS_NO_THREADS -#include <shared_mutex> -#if defined(__ELF__) && defined(_LIBCPP_LINK_PTHREAD_LIB) -# pragma comment(lib, "pthread") -#endif +# include <mutex> +# include <shared_mutex> +# if defined(__ELF__) && defined(_LIBCPP_LINK_PTHREAD_LIB) +# pragma comment(lib, "pthread") +# endif _LIBCPP_BEGIN_NAMESPACE_STD // Shared Mutex Base -__shared_mutex_base::__shared_mutex_base() - : __state_(0) -{ -} +__shared_mutex_base::__shared_mutex_base() : __state_(0) {} // Exclusive ownership -void -__shared_mutex_base::lock() -{ - unique_lock<mutex> lk(__mut_); - while (__state_ & __write_entered_) - __gate1_.wait(lk); - __state_ |= __write_entered_; - while (__state_ & __n_readers_) - __gate2_.wait(lk); +void __shared_mutex_base::lock() { + unique_lock<mutex> lk(__mut_); + while (__state_ & __write_entered_) + __gate1_.wait(lk); + __state_ |= __write_entered_; + while (__state_ & __n_readers_) + __gate2_.wait(lk); } -bool -__shared_mutex_base::try_lock() -{ - unique_lock<mutex> lk(__mut_); - if (__state_ == 0) - { - __state_ = __write_entered_; - return true; - } - return false; +bool __shared_mutex_base::try_lock() { + unique_lock<mutex> lk(__mut_); + if (__state_ == 0) { + __state_ = __write_entered_; + return true; + } + return false; } -void -__shared_mutex_base::unlock() -{ - lock_guard<mutex> _(__mut_); - __state_ = 0; - __gate1_.notify_all(); +void __shared_mutex_base::unlock() { + lock_guard<mutex> _(__mut_); + __state_ = 0; + __gate1_.notify_all(); } // Shared ownership -void -__shared_mutex_base::lock_shared() -{ - unique_lock<mutex> lk(__mut_); - while ((__state_ & __write_entered_) || (__state_ & __n_readers_) == __n_readers_) - __gate1_.wait(lk); - unsigned num_readers = (__state_ & __n_readers_) + 1; - __state_ &= ~__n_readers_; - __state_ |= num_readers; -} - -bool -__shared_mutex_base::try_lock_shared() -{ - unique_lock<mutex> lk(__mut_); - unsigned num_readers = __state_ & __n_readers_; - if (!(__state_ & __write_entered_) && num_readers != __n_readers_) - { - ++num_readers; - __state_ &= ~__n_readers_; - __state_ |= num_readers; - return true; - } - return false; +void __shared_mutex_base::lock_shared() { + unique_lock<mutex> lk(__mut_); + while ((__state_ & __write_entered_) || (__state_ & __n_readers_) == __n_readers_) + __gate1_.wait(lk); + unsigned num_readers = (__state_ & __n_readers_) + 1; + __state_ &= ~__n_readers_; + __state_ |= num_readers; } -void -__shared_mutex_base::unlock_shared() -{ - lock_guard<mutex> _(__mut_); - unsigned num_readers = (__state_ & __n_readers_) - 1; +bool __shared_mutex_base::try_lock_shared() { + unique_lock<mutex> lk(__mut_); + unsigned num_readers = __state_ & __n_readers_; + if (!(__state_ & __write_entered_) && num_readers != __n_readers_) { + ++num_readers; __state_ &= ~__n_readers_; __state_ |= num_readers; - if (__state_ & __write_entered_) - { - if (num_readers == 0) - __gate2_.notify_one(); - } - else - { - if (num_readers == __n_readers_ - 1) - __gate1_.notify_one(); - } + return true; + } + return false; } +void __shared_mutex_base::unlock_shared() { + lock_guard<mutex> _(__mut_); + unsigned num_readers = (__state_ & __n_readers_) - 1; + __state_ &= ~__n_readers_; + __state_ |= num_readers; + if (__state_ & __write_entered_) { + if (num_readers == 0) + __gate2_.notify_one(); + } else { + if (num_readers == __n_readers_ - 1) + __gate1_.notify_one(); + } +} // Shared Timed Mutex // These routines are here for ABI stability shared_timed_mutex::shared_timed_mutex() : __base_() {} -void shared_timed_mutex::lock() { return __base_.lock(); } +void shared_timed_mutex::lock() { return __base_.lock(); } bool shared_timed_mutex::try_lock() { return __base_.try_lock(); } -void shared_timed_mutex::unlock() { return __base_.unlock(); } +void shared_timed_mutex::unlock() { return __base_.unlock(); } void shared_timed_mutex::lock_shared() { return __base_.lock_shared(); } bool shared_timed_mutex::try_lock_shared() { return __base_.try_lock_shared(); } void shared_timed_mutex::unlock_shared() { return __base_.unlock_shared(); } |