| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef FLUTTER_FML_SYNCHRONIZATION_SHARED_MUTEX_H_ | |
| #define FLUTTER_FML_SYNCHRONIZATION_SHARED_MUTEX_H_ | |
| namespace fml { | |
| // Interface for a reader/writer lock. | |
| class SharedMutex { | |
| public: | |
| static SharedMutex* Create(); | |
| virtual ~SharedMutex() = default; | |
| virtual void Lock() = 0; | |
| virtual void LockShared() = 0; | |
| virtual void Unlock() = 0; | |
| virtual void UnlockShared() = 0; | |
| }; | |
| // RAII wrapper that does a shared acquire of a SharedMutex. | |
| class SharedLock { | |
| public: | |
| explicit SharedLock(SharedMutex& shared_mutex) : shared_mutex_(shared_mutex) { | |
| shared_mutex_.LockShared(); | |
| } | |
| ~SharedLock() { shared_mutex_.UnlockShared(); } | |
| private: | |
| SharedMutex& shared_mutex_; | |
| }; | |
| // RAII wrapper that does an exclusive acquire of a SharedMutex. | |
| class UniqueLock { | |
| public: | |
| explicit UniqueLock(SharedMutex& shared_mutex) : shared_mutex_(shared_mutex) { | |
| shared_mutex_.Lock(); | |
| } | |
| ~UniqueLock() { shared_mutex_.Unlock(); } | |
| private: | |
| SharedMutex& shared_mutex_; | |
| }; | |
| } // namespace fml | |
| #endif // FLUTTER_FML_SYNCHRONIZATION_SHARED_MUTEX_H_ |