#ifndef FLUTTER_FML_SYNCHRONIZATION_SHARED_MUTEX_H_
#define FLUTTER_FML_SYNCHRONIZATION_SHARED_MUTEX_H_
namespace fml {
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;
};
class SharedLock {
public:
explicit SharedLock(SharedMutex& shared_mutex) : shared_mutex_(shared_mutex) {
shared_mutex_.LockShared();
}
~SharedLock() { shared_mutex_.UnlockShared(); }
private:
SharedMutex& shared_mutex_;
};
class UniqueLock {
public:
explicit UniqueLock(SharedMutex& shared_mutex) : shared_mutex_(shared_mutex) {
shared_mutex_.Lock();
}
~UniqueLock() { shared_mutex_.Unlock(); }
private:
SharedMutex& shared_mutex_;
};
}
#endif