17 #include <glog/logging.h> 24 CHECK_EQ(pthread_rwlock_init(&lock_,
nullptr), 0);
30 CHECK_EQ(pthread_rwlock_destroy(&lock_), 0);
32 DCHECK(!is_exclusive_) <<
"Trying to destroy a locked mutex";
33 DCHECK_EQ(0, shared_count_) <<
"Trying to destroy a locked mutex";
39 CHECK_EQ(pthread_rwlock_unlock(&lock_), 0);
42 std::unique_lock<std::mutex>
lock(mutex_);
43 DCHECK(is_exclusive_) <<
"Trying to unlock an already unlocked mutex";
44 DCHECK_EQ(shared_count_, 0) <<
"Cannot have shared locks in exclusive mode";
45 is_exclusive_ =
false;
53 CHECK_EQ(pthread_rwlock_unlock(&lock_), 0);
56 std::unique_lock<std::mutex>
lock(mutex_);
57 DCHECK(!is_exclusive_) <<
"Cannot hold unique lock with shared lock";
58 DCHECK_GT(shared_count_, 0) <<
"Trying to unlock an already unlocked mutex";
65 bool shared_mutex::maybe_try_lock(
bool only_try) {
67 const int code = only_try ? pthread_rwlock_trywrlock(&lock_)
68 : pthread_rwlock_wrlock(&lock_);
69 CHECK(code == 0 || code == EBUSY);
73 std::unique_lock<std::mutex>
lock(mutex_);
74 while (is_exclusive_ || shared_count_ > 0) {
77 is_exclusive_waiting_ =
true;
81 is_exclusive_waiting_ =
false;
86 bool shared_mutex::maybe_try_lock_shared(
bool only_try) {
88 const int code = only_try ? pthread_rwlock_tryrdlock(&lock_)
89 : pthread_rwlock_rdlock(&lock_);
90 CHECK(code == 0 || code == EBUSY);
94 std::unique_lock<std::mutex>
lock(mutex_);
98 while (is_exclusive_ || is_exclusive_waiting_) {