/* * Copyright (c) 2021, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace Kernel { template class LockedResource { AK_MAKE_NONCOPYABLE(LockedResource); public: LockedResource(T* value, Mutex& mutex) : m_value(value) , m_mutex_locker(mutex, LockingMode) { } ALWAYS_INLINE T const* operator->() const { return m_value; } ALWAYS_INLINE T const& operator*() const { return *m_value; } ALWAYS_INLINE T* operator->() requires(!IsConst) { return m_value; } ALWAYS_INLINE T& operator*() requires(!IsConst) { return *m_value; } ALWAYS_INLINE T const* get() const { return m_value; } ALWAYS_INLINE T* get() requires(!IsConst) { return m_value; } private: T* m_value; MutexLocker m_mutex_locker; }; class ContendedResource { template friend class LockedResource; AK_MAKE_NONCOPYABLE(ContendedResource); AK_MAKE_NONMOVABLE(ContendedResource); public: ContendedResource() = default; protected: mutable Mutex m_mutex; }; }