// 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_