X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=folly%2FSharedMutex.h;h=571af4a7e2749342c5b1a9ea811271bc550ac6a7;hb=3a7cbbe49433606c07f53a32cca05d7cb221e433;hp=48041c118896765ffe0ff2383488fe2a45b8a061;hpb=c532329ad0c24fa6ed9f119201ade738a5d623f4;p=folly.git diff --git a/folly/SharedMutex.h b/folly/SharedMutex.h index 48041c11..571af4a7 100644 --- a/folly/SharedMutex.h +++ b/folly/SharedMutex.h @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2017 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -765,7 +765,7 @@ class SharedMutexImpl { } uint32_t after = (state & kMayDefer) == 0 ? 0 : kPrevDefer; - if (!ReaderPriority || (state & (kMayDefer | kHasS)) == 0) { + if (!kReaderPriority || (state & (kMayDefer | kHasS)) == 0) { // Block readers immediately, either because we are in write // priority mode or because we can acquire the lock in one // step. Note that if state has kHasU, then we are doing an @@ -806,7 +806,7 @@ class SharedMutexImpl { return false; } - if (ReaderPriority && (state & kHasE) == 0) { + if (kReaderPriority && (state & kHasE) == 0) { assert((state & kBegunE) != 0); if (!state_.compare_exchange_strong(state, (state & ~kBegunE) | kHasE)) { @@ -1133,10 +1133,15 @@ class SharedMutexImpl { public: class ReadHolder { - public: ReadHolder() : lock_(nullptr) {} - explicit ReadHolder(const SharedMutexImpl* lock) : ReadHolder(*lock) {} + public: + explicit ReadHolder(const SharedMutexImpl* lock) + : lock_(const_cast(lock)) { + if (lock_) { + lock_->lock_shared(token_); + } + } explicit ReadHolder(const SharedMutexImpl& lock) : lock_(const_cast(&lock)) { @@ -1190,10 +1195,14 @@ class SharedMutexImpl { }; class UpgradeHolder { - public: UpgradeHolder() : lock_(nullptr) {} - explicit UpgradeHolder(SharedMutexImpl* lock) : UpgradeHolder(*lock) {} + public: + explicit UpgradeHolder(SharedMutexImpl* lock) : lock_(lock) { + if (lock_) { + lock_->lock_upgrade(); + } + } explicit UpgradeHolder(SharedMutexImpl& lock) : lock_(&lock) { lock_->lock_upgrade(); @@ -1236,10 +1245,14 @@ class SharedMutexImpl { }; class WriteHolder { - public: WriteHolder() : lock_(nullptr) {} - explicit WriteHolder(SharedMutexImpl* lock) : WriteHolder(*lock) {} + public: + explicit WriteHolder(SharedMutexImpl* lock) : lock_(lock) { + if (lock_) { + lock_->lock(); + } + } explicit WriteHolder(SharedMutexImpl& lock) : lock_(&lock) { lock_->lock();