diff options
author | Gunnar Beutner <gbeutner@serenityos.org> | 2021-06-03 01:12:09 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-06-03 08:06:51 +0200 |
commit | ed0068d04de48b6d3bfc14af3fc4d2dab375e2a5 (patch) | |
tree | 08fcb84053826e4fbd604a2a479e433615427ac7 | |
parent | ab4f4ddc3c7375a758925c3ff66a553a835f706d (diff) | |
download | serenity-ed0068d04de48b6d3bfc14af3fc4d2dab375e2a5.zip |
AK: Allow inlining ref-count functionality
Previously we'd incur the costs for a function call via the PLT even
for the most trivial ref-count actions like increasing/decreasing the
reference count.
By moving the code to the header file we allow the compiler to inline
this code into the caller's function.
-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 |