From 66f3ec687b2b562205e91ef587e771aef33fada9 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 29 May 2021 16:04:58 +0200 Subject: [PATCH] AK: Move RefCountedBase definitions out-of-line This dramatically reduces code size since we no longer inline all these VERIFY() checks everywhere. Appears to be performance neutral. --- AK/RefCounted.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++ AK/RefCounted.h | 38 +++++----------------------------- Kernel/CMakeLists.txt | 1 + 3 files changed, 53 insertions(+), 33 deletions(-) create mode 100644 AK/RefCounted.cpp diff --git a/AK/RefCounted.cpp b/AK/RefCounted.cpp new file mode 100644 index 0000000000..9201c69120 --- /dev/null +++ b/AK/RefCounted.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018-2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +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::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::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 072819e534..63ab493a8c 100644 --- a/AK/RefCounted.h +++ b/AK/RefCounted.h @@ -47,43 +47,15 @@ public: using RefCountType = unsigned int; using AllowOwnPtr = FalseType; - ALWAYS_INLINE 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::addition_would_overflow(old_ref_count, 1)); - } - - [[nodiscard]] ALWAYS_INLINE bool try_ref() const - { - RefCountType expected = m_ref_count.load(AK::MemoryOrder::memory_order_relaxed); - for (;;) { - if (expected == 0) - return false; - VERIFY(!Checked::addition_would_overflow(expected, 1)); - if (m_ref_count.compare_exchange_strong(expected, expected + 1, AK::MemoryOrder::memory_order_acquire)) - return true; - } - } - - ALWAYS_INLINE RefCountType ref_count() const - { - return m_ref_count.load(AK::MemoryOrder::memory_order_relaxed); - } + void ref() const; + [[nodiscard]] bool try_ref() const; + [[nodiscard]] RefCountType ref_count() const; protected: RefCountedBase() = default; - ALWAYS_INLINE ~RefCountedBase() - { - VERIFY(m_ref_count.load(AK::MemoryOrder::memory_order_relaxed) == 0); - } + ~RefCountedBase(); - ALWAYS_INLINE 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; - } + RefCountType deref_base() const; mutable Atomic m_ref_count { 1 }; }; diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 023ab811fe..7dd9e70424 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -277,6 +277,7 @@ set(AK_SOURCES ../AK/JsonParser.cpp ../AK/JsonValue.cpp ../AK/LexicalPath.cpp + ../AK/RefCounted.cpp ../AK/String.cpp ../AK/StringBuilder.cpp ../AK/StringImpl.cpp