summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGunnar Beutner <gbeutner@serenityos.org>2021-06-03 01:12:09 +0200
committerAndreas Kling <kling@serenityos.org>2021-06-03 08:06:51 +0200
commited0068d04de48b6d3bfc14af3fc4d2dab375e2a5 (patch)
tree08fcb84053826e4fbd604a2a479e433615427ac7
parentab4f4ddc3c7375a758925c3ff66a553a835f706d (diff)
downloadserenity-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.cpp47
-rw-r--r--AK/RefCounted.h38
-rw-r--r--Kernel/CMakeLists.txt1
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