diff --git a/Kernel/Mutex.h b/Kernel/Mutex.h index 4bb30b6264..28373416c0 100644 --- a/Kernel/Mutex.h +++ b/Kernel/Mutex.h @@ -106,18 +106,26 @@ private: }; class MutexLocker { + AK_MAKE_NONCOPYABLE(MutexLocker); + public: + ALWAYS_INLINE explicit MutexLocker() + : m_lock(nullptr) + , m_locked(false) + { + } + #if LOCK_DEBUG ALWAYS_INLINE explicit MutexLocker(Mutex& l, Mutex::Mode mode = Mutex::Mode::Exclusive, const SourceLocation& location = SourceLocation::current()) #else ALWAYS_INLINE explicit MutexLocker(Mutex& l, Mutex::Mode mode = Mutex::Mode::Exclusive) #endif - : m_lock(l) + : m_lock(&l) { #if LOCK_DEBUG - m_lock.lock(mode, location); + m_lock->lock(mode, location); #else - m_lock.lock(mode); + m_lock->lock(mode); #endif } @@ -126,11 +134,30 @@ public: if (m_locked) unlock(); } + ALWAYS_INLINE void unlock() { + VERIFY(m_lock); VERIFY(m_locked); m_locked = false; - m_lock.unlock(); + m_lock->unlock(); + } + +#if LOCK_DEBUG + ALWAYS_INLINE void attach_and_lock(Mutex& lock, Mutex::Mode mode = Mutex::Mode::Exclusive, const SourceLocation& location = SourceLocation::current()) +#else + ALWAYS_INLINE void attach_and_lock(Mutex& lock, Mutex::Mode mode = Mutex::Mode::Exclusive) +#endif + { + VERIFY(!m_locked); + m_lock = &lock; + m_locked = true; + +#if LOCK_DEBUG + m_lock->lock(mode, location); +#else + m_lock->lock(mode); +#endif } #if LOCK_DEBUG @@ -139,21 +166,19 @@ public: ALWAYS_INLINE void lock(Mutex::Mode mode = Mutex::Mode::Exclusive) #endif { + VERIFY(m_lock); VERIFY(!m_locked); m_locked = true; #if LOCK_DEBUG - m_lock.lock(mode, location); + m_lock->lock(mode, location); #else - m_lock.lock(mode); + m_lock->lock(mode); #endif } - Mutex& get_lock() { return m_lock; } - const Mutex& get_lock() const { return m_lock; } - private: - Mutex& m_lock; + Mutex* m_lock; bool m_locked { true }; };