Path: blob/main/contrib/llvm-project/libcxx/src/shared_mutex.cpp
35147 views
//===----------------------------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include <mutex>9#include <shared_mutex>10#if defined(__ELF__) && defined(_LIBCPP_LINK_PTHREAD_LIB)11# pragma comment(lib, "pthread")12#endif1314_LIBCPP_BEGIN_NAMESPACE_STD1516// Shared Mutex Base17__shared_mutex_base::__shared_mutex_base() : __state_(0) {}1819// Exclusive ownership2021void __shared_mutex_base::lock() {22unique_lock<mutex> lk(__mut_);23while (__state_ & __write_entered_)24__gate1_.wait(lk);25__state_ |= __write_entered_;26while (__state_ & __n_readers_)27__gate2_.wait(lk);28}2930bool __shared_mutex_base::try_lock() {31unique_lock<mutex> lk(__mut_);32if (__state_ == 0) {33__state_ = __write_entered_;34return true;35}36return false;37}3839void __shared_mutex_base::unlock() {40lock_guard<mutex> _(__mut_);41__state_ = 0;42__gate1_.notify_all();43}4445// Shared ownership4647void __shared_mutex_base::lock_shared() {48unique_lock<mutex> lk(__mut_);49while ((__state_ & __write_entered_) || (__state_ & __n_readers_) == __n_readers_)50__gate1_.wait(lk);51unsigned num_readers = (__state_ & __n_readers_) + 1;52__state_ &= ~__n_readers_;53__state_ |= num_readers;54}5556bool __shared_mutex_base::try_lock_shared() {57unique_lock<mutex> lk(__mut_);58unsigned num_readers = __state_ & __n_readers_;59if (!(__state_ & __write_entered_) && num_readers != __n_readers_) {60++num_readers;61__state_ &= ~__n_readers_;62__state_ |= num_readers;63return true;64}65return false;66}6768void __shared_mutex_base::unlock_shared() {69lock_guard<mutex> _(__mut_);70unsigned num_readers = (__state_ & __n_readers_) - 1;71__state_ &= ~__n_readers_;72__state_ |= num_readers;73if (__state_ & __write_entered_) {74if (num_readers == 0)75__gate2_.notify_one();76} else {77if (num_readers == __n_readers_ - 1)78__gate1_.notify_one();79}80}8182// Shared Timed Mutex83// These routines are here for ABI stability84shared_timed_mutex::shared_timed_mutex() : __base_() {}85void shared_timed_mutex::lock() { return __base_.lock(); }86bool shared_timed_mutex::try_lock() { return __base_.try_lock(); }87void shared_timed_mutex::unlock() { return __base_.unlock(); }88void shared_timed_mutex::lock_shared() { return __base_.lock_shared(); }89bool shared_timed_mutex::try_lock_shared() { return __base_.try_lock_shared(); }90void shared_timed_mutex::unlock_shared() { return __base_.unlock_shared(); }9192_LIBCPP_END_NAMESPACE_STD939495