diff options
-rw-r--r-- | AK/RefCounted.cpp | 47 | ||||
-rw-r--r-- | AK/RefCounted.h | 38 | ||||
-rw-r--r-- | Kernel/CMakeLists.txt | 1 |
3 files changed, 33 insertions, 53 deletions
diff --git a/AK/RefCounted.cpp b/AK/RefCounted.cpp deleted file mode 100644 index 9201c69120..0000000000 --- a/AK/RefCounted.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include <AK/RefCounted.h> - -namespace AK { - -RefCountedBase::~RefCountedBase() -{ - VERIFY(m_ref_count.load(AK::MemoryOrder::memory_order_relaxed) == 0); -} - -void RefCountedBase::ref() const -{ - auto old_ref_count = m_ref_count.fetch_add(1, AK::MemoryOrder::memory_order_relaxed); - VERIFY(old_ref_count > 0); - VERIFY(!Checked<RefCountType>::addition_would_overflow(old_ref_count, 1)); -} - -[[nodiscard]] bool RefCountedBase::try_ref() const -{ - RefCountType expected = m_ref_count.load(AK::MemoryOrder::memory_order_relaxed); - for (;;) { - if (expected == 0) - return false; - VERIFY(!Checked<RefCountType>::addition_would_overflow(expected, 1)); - if (m_ref_count.compare_exchange_strong(expected, expected + 1, AK::MemoryOrder::memory_order_acquire)) - return true; - } -} - -RefCountedBase::RefCountType RefCountedBase::ref_count() const -{ - return m_ref_count.load(AK::MemoryOrder::memory_order_relaxed); -} - -RefCountedBase::RefCountType RefCountedBase::deref_base() const -{ - auto old_ref_count = m_ref_count.fetch_sub(1, AK::MemoryOrder::memory_order_acq_rel); - VERIFY(old_ref_count > 0); - return old_ref_count - 1; -} - -} diff --git a/AK/RefCounted.h b/AK/RefCounted.h index 63ab493a8c..f99e40445e 100644 --- a/AK/RefCounted.h +++ b/AK/RefCounted.h @@ -47,15 +47,43 @@ public: using RefCountType = unsigned int; using AllowOwnPtr = FalseType; - void ref() const; - [[nodiscard]] bool try_ref() const; - [[nodiscard]] RefCountType ref_count() const; + void ref() const + { + auto old_ref_count = m_ref_count.fetch_add(1, AK::MemoryOrder::memory_order_relaxed); + VERIFY(old_ref_count > 0); + VERIFY(!Checked<RefCountType>::addition_would_overflow(old_ref_count, 1)); + } + + [[nodiscard]] bool try_ref() const + { + RefCountType expected = m_ref_count.load(AK::MemoryOrder::memory_order_relaxed); + for (;;) { + if (expected == 0) + return false; + VERIFY(!Checked<RefCountType>::addition_would_overflow(expected, 1)); + if (m_ref_count.compare_exchange_strong(expected, expected + 1, AK::MemoryOrder::memory_order_acquire)) + return true; + } + } + + [[nodiscard]] RefCountType ref_count() const + { + return m_ref_count.load(AK::MemoryOrder::memory_order_relaxed); + } protected: RefCountedBase() = default; - ~RefCountedBase(); + ~RefCountedBase() + { + VERIFY(m_ref_count.load(AK::MemoryOrder::memory_order_relaxed) == 0); + } - RefCountType deref_base() const; + RefCountType deref_base() const + { + auto old_ref_count = m_ref_count.fetch_sub(1, AK::MemoryOrder::memory_order_acq_rel); + VERIFY(old_ref_count > 0); + return old_ref_count - 1; + } mutable Atomic<RefCountType> m_ref_count { 1 }; }; diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 7dd9e70424..023ab811fe 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -277,7 +277,6 @@ set(AK_SOURCES ../AK/JsonParser.cpp ../AK/JsonValue.cpp ../AK/LexicalPath.cpp - ../AK/RefCounted.cpp ../AK/String.cpp ../AK/StringBuilder.cpp ../AK/StringImpl.cpp |