diff --git a/Kernel/Locking/ContendedResource.h b/Kernel/Locking/ContendedResource.h new file mode 100644 index 0000000000..cf865a248f --- /dev/null +++ b/Kernel/Locking/ContendedResource.h @@ -0,0 +1,53 @@ +/* + * 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; +}; + +}