// Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef EASYMEDIA_LOCK_H_ #define EASYMEDIA_LOCK_H_ #include #include #include #include #include namespace easymedia { class LockMutex { public: LockMutex(); virtual ~LockMutex(); virtual void lock() = 0; virtual void unlock() = 0; virtual void wait(){}; virtual void notify(){}; void locktimeinc(); void locktimedec(); #ifndef NDEBUG protected: std::atomic_int lock_times; #endif }; class NonLockMutex : public LockMutex { public: virtual ~NonLockMutex() = default; virtual void lock() { } virtual void unlock() { } }; class ConditionLockMutex : public LockMutex { public: virtual ~ConditionLockMutex() = default; virtual void lock() override; virtual void unlock() override; virtual void wait() override; virtual void notify() override; private: std::mutex mtx; std::condition_variable_any cond; }; class ReadWriteLockMutex : public LockMutex { public: ReadWriteLockMutex(); virtual ~ReadWriteLockMutex(); virtual void lock() override; virtual void unlock() override; void read_lock(); bool valid; private: // if c++17, std::shared_mutex pthread_rwlock_t rwlock; }; class SpinLockMutex : public LockMutex { public: SpinLockMutex(); virtual ~SpinLockMutex() = default; SpinLockMutex(const SpinLockMutex&) = delete; SpinLockMutex& operator=(const SpinLockMutex&) = delete; virtual void lock() override; virtual void unlock() override; private: std::atomic_flag flag; }; class AutoLockMutex { public: AutoLockMutex(LockMutex& lm) : m_lm(lm) { m_lm.lock(); } ~AutoLockMutex() { m_lm.unlock(); } private: LockMutex& m_lm; }; } // namespace easymedia #endif // #ifndef EASYMEDIA_LOCK_H_