summaryrefslogtreecommitdiff
path: root/Kernel
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-08-19 17:26:07 +0200
committerAndreas Kling <kling@serenityos.org>2022-08-20 17:15:52 +0200
commite475263113387404e63cdc3666391934604eb6e7 (patch)
tree5d15d4f41a7811f58171b6e8bdd6ae014e2bea7d /Kernel
parent4889eb019a47478e50e1876f9584356e957e4ea4 (diff)
downloadserenity-e475263113387404e63cdc3666391934604eb6e7.zip
AK+Kernel: Add AK::AtomicRefCounted and use everywhere in the kernel
Instead of having two separate implementations of AK::RefCounted, one for userspace and one for kernelspace, there is now RefCounted and AtomicRefCounted.
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/Arch/aarch64/IRQController.h4
-rw-r--r--Kernel/Arch/x86/IRQController.h4
-rw-r--r--Kernel/Arch/x86/InterruptManagement.h1
-rw-r--r--Kernel/Bus/USB/USBController.h4
-rw-r--r--Kernel/Bus/USB/USBDevice.h2
-rw-r--r--Kernel/Bus/USB/USBHub.h1
-rw-r--r--Kernel/Bus/USB/USBTransfer.h3
-rw-r--r--Kernel/Bus/VirtIO/Console.h2
-rw-r--r--Kernel/Bus/VirtIO/RNG.h4
-rw-r--r--Kernel/Devices/AsyncDeviceRequest.h2
-rw-r--r--Kernel/Devices/Audio/Controller.h2
-rw-r--r--Kernel/Devices/HID/I8042Controller.h4
-rw-r--r--Kernel/FileSystem/File.h6
-rw-r--r--Kernel/FileSystem/FileSystem.h4
-rw-r--r--Kernel/FileSystem/ISO9660FileSystem.h2
-rw-r--r--Kernel/FileSystem/OpenFileDescription.h4
-rw-r--r--Kernel/FileSystem/Plan9FileSystem.h2
-rw-r--r--Kernel/FileSystem/SysFS/Component.h4
-rw-r--r--Kernel/Firmware/ACPI/Definitions.h2
-rw-r--r--Kernel/FutexQueue.h6
-rw-r--r--Kernel/Graphics/Console/Console.h4
-rw-r--r--Kernel/Graphics/Console/GenericFramebufferConsole.h1
-rw-r--r--Kernel/Graphics/Console/VGATextModeConsole.h1
-rw-r--r--Kernel/Graphics/GenericGraphicsAdapter.h2
-rw-r--r--Kernel/Graphics/VirtIOGPU/GPU3DDevice.h2
-rw-r--r--Kernel/Library/ListedRefCounted.h4
-rw-r--r--Kernel/Library/ThreadSafeRefCounted.h87
-rw-r--r--Kernel/Library/ThreadSafeWeakPtr.h4
-rw-r--r--Kernel/Library/ThreadSafeWeakable.h6
-rw-r--r--Kernel/Memory/AnonymousVMObject.h2
-rw-r--r--Kernel/Memory/PageDirectory.h4
-rw-r--r--Kernel/Memory/ScatterGatherList.h3
-rw-r--r--Kernel/Net/NetworkAdapter.h6
-rw-r--r--Kernel/Net/Routing.h2
-rw-r--r--Kernel/Net/Socket.h1
-rw-r--r--Kernel/ProcessExposed.h4
-rw-r--r--Kernel/ProcessGroup.h4
-rw-r--r--Kernel/Storage/ATA/AHCI/Port.h2
-rw-r--r--Kernel/Storage/ATA/ATAPort.h2
-rw-r--r--Kernel/Storage/NVMe/NVMeNameSpace.h1
-rw-r--r--Kernel/Storage/NVMe/NVMeQueue.h10
-rw-r--r--Kernel/Storage/StorageController.h2
-rw-r--r--Kernel/Time/HardwareTimer.h5
-rw-r--r--Kernel/TimerQueue.h4
44 files changed, 66 insertions, 160 deletions
diff --git a/Kernel/Arch/aarch64/IRQController.h b/Kernel/Arch/aarch64/IRQController.h
index 20e6b6b712..e0e7b1de2c 100644
--- a/Kernel/Arch/aarch64/IRQController.h
+++ b/Kernel/Arch/aarch64/IRQController.h
@@ -6,14 +6,14 @@
#pragma once
-#include <AK/RefCounted.h>
+#include <AK/AtomicRefCounted.h>
#include <AK/Types.h>
namespace Kernel {
class GenericInterruptHandler;
-class IRQController : public RefCounted<IRQController> {
+class IRQController : public AtomicRefCounted<IRQController> {
public:
virtual ~IRQController() = default;
diff --git a/Kernel/Arch/x86/IRQController.h b/Kernel/Arch/x86/IRQController.h
index 82afa739b4..64e969033c 100644
--- a/Kernel/Arch/x86/IRQController.h
+++ b/Kernel/Arch/x86/IRQController.h
@@ -6,7 +6,7 @@
#pragma once
-#include <AK/RefCounted.h>
+#include <AK/AtomicRefCounted.h>
#include <AK/Types.h>
#include <Kernel/Interrupts/GenericInterruptHandler.h>
@@ -19,7 +19,7 @@ enum class IRQControllerType {
i82093AA = 2 /* Intel 82093AA I/O ADVANCED PROGRAMMABLE INTERRUPT CONTROLLER (IOAPIC) */
};
-class IRQController : public RefCounted<IRQController> {
+class IRQController : public AtomicRefCounted<IRQController> {
public:
virtual ~IRQController() = default;
diff --git a/Kernel/Arch/x86/InterruptManagement.h b/Kernel/Arch/x86/InterruptManagement.h
index b6fa990812..0c3a2848e4 100644
--- a/Kernel/Arch/x86/InterruptManagement.h
+++ b/Kernel/Arch/x86/InterruptManagement.h
@@ -9,7 +9,6 @@
#include <AK/Function.h>
#include <AK/NonnullOwnPtr.h>
#include <AK/OwnPtr.h>
-#include <AK/RefCounted.h>
#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Arch/x86/IRQController.h>
diff --git a/Kernel/Bus/USB/USBController.h b/Kernel/Bus/USB/USBController.h
index 7ff30819e3..0f8c38dddb 100644
--- a/Kernel/Bus/USB/USBController.h
+++ b/Kernel/Bus/USB/USBController.h
@@ -6,14 +6,14 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/Error.h>
-#include <AK/RefCounted.h>
#include <Kernel/Bus/USB/USBDevice.h>
#include <Kernel/Bus/USB/USBTransfer.h>
namespace Kernel::USB {
-class USBController : public RefCounted<USBController> {
+class USBController : public AtomicRefCounted<USBController> {
public:
virtual ~USBController() = default;
diff --git a/Kernel/Bus/USB/USBDevice.h b/Kernel/Bus/USB/USBDevice.h
index bde5a1bf22..f74c3316b4 100644
--- a/Kernel/Bus/USB/USBDevice.h
+++ b/Kernel/Bus/USB/USBDevice.h
@@ -27,7 +27,7 @@ class USBConfiguration;
//
// https://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_113_Simplified%20Description%20of%20USB%20Device%20Enumeration.pdf
class Hub;
-class Device : public RefCounted<Device> {
+class Device : public AtomicRefCounted<Device> {
public:
enum class DeviceSpeed : u8 {
FullSpeed = 0,
diff --git a/Kernel/Bus/USB/USBHub.h b/Kernel/Bus/USB/USBHub.h
index 0d4da8ee6c..d4b7de4e44 100644
--- a/Kernel/Bus/USB/USBHub.h
+++ b/Kernel/Bus/USB/USBHub.h
@@ -6,7 +6,6 @@
#pragma once
-#include <AK/RefCounted.h>
#include <AK/Types.h>
#include <Kernel/Bus/USB/USBDevice.h>
diff --git a/Kernel/Bus/USB/USBTransfer.h b/Kernel/Bus/USB/USBTransfer.h
index fe8e7d6713..92fa48e1af 100644
--- a/Kernel/Bus/USB/USBTransfer.h
+++ b/Kernel/Bus/USB/USBTransfer.h
@@ -6,6 +6,7 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/OwnPtr.h>
#include <AK/RefPtr.h>
#include <Kernel/Bus/USB/PacketTypes.h>
@@ -17,7 +18,7 @@
// TODO: Callback stuff in this class please!
namespace Kernel::USB {
-class Transfer : public RefCounted<Transfer> {
+class Transfer final : public AtomicRefCounted<Transfer> {
public:
static ErrorOr<NonnullRefPtr<Transfer>> try_create(Pipe&, u16 length, Memory::Region& dma_buffer);
diff --git a/Kernel/Bus/VirtIO/Console.h b/Kernel/Bus/VirtIO/Console.h
index 0d059d290c..2fd1203ffe 100644
--- a/Kernel/Bus/VirtIO/Console.h
+++ b/Kernel/Bus/VirtIO/Console.h
@@ -14,7 +14,7 @@
namespace Kernel::VirtIO {
class Console
: public VirtIO::Device
- , public RefCounted<Console> {
+ , public AtomicRefCounted<Console> {
friend VirtIO::ConsolePort;
public:
diff --git a/Kernel/Bus/VirtIO/RNG.h b/Kernel/Bus/VirtIO/RNG.h
index 1135aa3292..f7c1d35c8f 100644
--- a/Kernel/Bus/VirtIO/RNG.h
+++ b/Kernel/Bus/VirtIO/RNG.h
@@ -6,7 +6,7 @@
#pragma once
-#include <AK/RefCounted.h>
+#include <AK/AtomicRefCounted.h>
#include <Kernel/Bus/VirtIO/Device.h>
#include <Kernel/Devices/CharacterDevice.h>
#include <Kernel/Random.h>
@@ -16,7 +16,7 @@ namespace Kernel::VirtIO {
#define REQUESTQ 0
class RNG final
- : public RefCounted<RNG>
+ : public AtomicRefCounted<RNG>
, public VirtIO::Device {
public:
static NonnullRefPtr<RNG> must_create(PCI::DeviceIdentifier const&);
diff --git a/Kernel/Devices/AsyncDeviceRequest.h b/Kernel/Devices/AsyncDeviceRequest.h
index 47d5aacc93..c42f36189a 100644
--- a/Kernel/Devices/AsyncDeviceRequest.h
+++ b/Kernel/Devices/AsyncDeviceRequest.h
@@ -20,7 +20,7 @@ class Device;
extern WorkQueue* g_io_work;
-class AsyncDeviceRequest : public RefCounted<AsyncDeviceRequest> {
+class AsyncDeviceRequest : public AtomicRefCounted<AsyncDeviceRequest> {
AK_MAKE_NONCOPYABLE(AsyncDeviceRequest);
AK_MAKE_NONMOVABLE(AsyncDeviceRequest);
diff --git a/Kernel/Devices/Audio/Controller.h b/Kernel/Devices/Audio/Controller.h
index 0b63c50eb6..a8aecd84c9 100644
--- a/Kernel/Devices/Audio/Controller.h
+++ b/Kernel/Devices/Audio/Controller.h
@@ -23,7 +23,7 @@ namespace Kernel {
class AudioManagement;
class AudioController
- : public RefCounted<AudioController>
+ : public AtomicRefCounted<AudioController>
, public Weakable<AudioController> {
friend class AudioManagement;
diff --git a/Kernel/Devices/HID/I8042Controller.h b/Kernel/Devices/HID/I8042Controller.h
index c09a2a32c0..65b8c35fbe 100644
--- a/Kernel/Devices/HID/I8042Controller.h
+++ b/Kernel/Devices/HID/I8042Controller.h
@@ -6,7 +6,7 @@
#pragma once
-#include <AK/RefCounted.h>
+#include <AK/AtomicRefCounted.h>
#include <Kernel/Devices/HID/KeyboardDevice.h>
#include <Kernel/Devices/HID/MouseDevice.h>
#include <Kernel/Locking/Spinlock.h>
@@ -83,7 +83,7 @@ protected:
class PS2KeyboardDevice;
class PS2MouseDevice;
class HIDManagement;
-class I8042Controller : public RefCounted<I8042Controller> {
+class I8042Controller final : public AtomicRefCounted<I8042Controller> {
friend class PS2KeyboardDevice;
friend class PS2MouseDevice;
diff --git a/Kernel/FileSystem/File.h b/Kernel/FileSystem/File.h
index bb9065a8a7..ccbe6b579a 100644
--- a/Kernel/FileSystem/File.h
+++ b/Kernel/FileSystem/File.h
@@ -6,9 +6,9 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/Error.h>
#include <AK/NonnullRefPtr.h>
-#include <AK/RefCounted.h>
#include <AK/StringView.h>
#include <AK/Types.h>
#include <AK/Weakable.h>
@@ -71,10 +71,10 @@ public:
// - Should create a Region in the Process and return it if successful.
class File
- : public RefCounted<File>
+ : public AtomicRefCounted<File>
, public Weakable<File> {
public:
- virtual bool unref() const { return RefCounted<File>::unref(); }
+ virtual bool unref() const { return AtomicRefCounted<File>::unref(); }
virtual void will_be_destroyed() { }
virtual ~File();
diff --git a/Kernel/FileSystem/FileSystem.h b/Kernel/FileSystem/FileSystem.h
index e504244874..40655cfe1d 100644
--- a/Kernel/FileSystem/FileSystem.h
+++ b/Kernel/FileSystem/FileSystem.h
@@ -6,8 +6,8 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/Error.h>
-#include <AK/RefCounted.h>
#include <AK/RefPtr.h>
#include <AK/StringView.h>
#include <Kernel/FileSystem/InodeIdentifier.h>
@@ -18,7 +18,7 @@
namespace Kernel {
-class FileSystem : public RefCounted<FileSystem> {
+class FileSystem : public AtomicRefCounted<FileSystem> {
friend class Inode;
public:
diff --git a/Kernel/FileSystem/ISO9660FileSystem.h b/Kernel/FileSystem/ISO9660FileSystem.h
index 99f9683d09..93de3e8476 100644
--- a/Kernel/FileSystem/ISO9660FileSystem.h
+++ b/Kernel/FileSystem/ISO9660FileSystem.h
@@ -283,7 +283,7 @@ class ISO9660FS final : public BlockBasedFileSystem {
friend ISO9660DirectoryIterator;
public:
- struct DirectoryEntry : public RefCounted<DirectoryEntry> {
+ struct DirectoryEntry final : public AtomicRefCounted<DirectoryEntry> {
u32 extent { 0 };
u32 length { 0 };
diff --git a/Kernel/FileSystem/OpenFileDescription.h b/Kernel/FileSystem/OpenFileDescription.h
index a1315f907c..cb265b5abd 100644
--- a/Kernel/FileSystem/OpenFileDescription.h
+++ b/Kernel/FileSystem/OpenFileDescription.h
@@ -6,8 +6,8 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/Badge.h>
-#include <AK/RefCounted.h>
#include <Kernel/FileSystem/FIFO.h>
#include <Kernel/FileSystem/Inode.h>
#include <Kernel/FileSystem/InodeMetadata.h>
@@ -22,7 +22,7 @@ public:
virtual ~OpenFileDescriptionData() = default;
};
-class OpenFileDescription : public RefCounted<OpenFileDescription> {
+class OpenFileDescription final : public AtomicRefCounted<OpenFileDescription> {
public:
static ErrorOr<NonnullRefPtr<OpenFileDescription>> try_create(Custody&);
static ErrorOr<NonnullRefPtr<OpenFileDescription>> try_create(File&);
diff --git a/Kernel/FileSystem/Plan9FileSystem.h b/Kernel/FileSystem/Plan9FileSystem.h
index 78af118ff5..892407f91b 100644
--- a/Kernel/FileSystem/Plan9FileSystem.h
+++ b/Kernel/FileSystem/Plan9FileSystem.h
@@ -69,7 +69,7 @@ private:
mutable Spinlock m_lock { LockRank::None };
};
- struct ReceiveCompletion : public RefCounted<ReceiveCompletion> {
+ struct ReceiveCompletion final : public AtomicRefCounted<ReceiveCompletion> {
mutable Spinlock lock { LockRank::None };
bool completed { false };
const u16 tag;
diff --git a/Kernel/FileSystem/SysFS/Component.h b/Kernel/FileSystem/SysFS/Component.h
index 6aee4a4e4e..8ecbee5f87 100644
--- a/Kernel/FileSystem/SysFS/Component.h
+++ b/Kernel/FileSystem/SysFS/Component.h
@@ -6,9 +6,9 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/Error.h>
#include <AK/Function.h>
-#include <AK/RefCounted.h>
#include <AK/RefPtr.h>
#include <AK/StringView.h>
#include <AK/Types.h>
@@ -24,7 +24,7 @@ struct SysFSInodeData : public OpenFileDescriptionData {
};
class SysFSDirectory;
-class SysFSComponent : public RefCounted<SysFSComponent> {
+class SysFSComponent : public AtomicRefCounted<SysFSComponent> {
friend class SysFSDirectory;
public:
diff --git a/Kernel/Firmware/ACPI/Definitions.h b/Kernel/Firmware/ACPI/Definitions.h
index 1531644e32..4375651ca1 100644
--- a/Kernel/Firmware/ACPI/Definitions.h
+++ b/Kernel/Firmware/ACPI/Definitions.h
@@ -6,9 +6,7 @@
#pragma once
-#include <AK/RefCounted.h>
#include <AK/Types.h>
-#include <AK/Vector.h>
#include <Kernel/PhysicalAddress.h>
namespace Kernel::ACPI {
diff --git a/Kernel/FutexQueue.h b/Kernel/FutexQueue.h
index c2c3c2c138..4ea51ac579 100644
--- a/Kernel/FutexQueue.h
+++ b/Kernel/FutexQueue.h
@@ -6,16 +6,14 @@
#pragma once
-#include <AK/Atomic.h>
-#include <AK/RefCounted.h>
+#include <AK/AtomicRefCounted.h>
#include <Kernel/Locking/Spinlock.h>
-#include <Kernel/Memory/VMObject.h>
#include <Kernel/Thread.h>
namespace Kernel {
class FutexQueue final
- : public RefCounted<FutexQueue>
+ : public AtomicRefCounted<FutexQueue>
, public Thread::BlockerSet {
public:
FutexQueue();
diff --git a/Kernel/Graphics/Console/Console.h b/Kernel/Graphics/Console/Console.h
index ef10643b8f..afaef18e55 100644
--- a/Kernel/Graphics/Console/Console.h
+++ b/Kernel/Graphics/Console/Console.h
@@ -6,13 +6,13 @@
#pragma once
-#include <AK/RefCounted.h>
+#include <AK/AtomicRefCounted.h>
#include <AK/Types.h>
#include <Kernel/Graphics/GenericGraphicsAdapter.h>
namespace Kernel::Graphics {
-class Console : public RefCounted<Console> {
+class Console : public AtomicRefCounted<Console> {
public:
// Stanadard VGA text mode colors
enum Color : u8 {
diff --git a/Kernel/Graphics/Console/GenericFramebufferConsole.h b/Kernel/Graphics/Console/GenericFramebufferConsole.h
index 533e64a6b6..953f694b67 100644
--- a/Kernel/Graphics/Console/GenericFramebufferConsole.h
+++ b/Kernel/Graphics/Console/GenericFramebufferConsole.h
@@ -6,7 +6,6 @@
#pragma once
-#include <AK/RefCounted.h>
#include <AK/Types.h>
#include <Kernel/Graphics/Console/Console.h>
#include <Kernel/PhysicalAddress.h>
diff --git a/Kernel/Graphics/Console/VGATextModeConsole.h b/Kernel/Graphics/Console/VGATextModeConsole.h
index cb5671da46..2cc08a9861 100644
--- a/Kernel/Graphics/Console/VGATextModeConsole.h
+++ b/Kernel/Graphics/Console/VGATextModeConsole.h
@@ -6,7 +6,6 @@
#pragma once
-#include <AK/RefCounted.h>
#include <AK/Types.h>
#include <Kernel/Graphics/Console/Console.h>
#include <Kernel/Locking/Spinlock.h>
diff --git a/Kernel/Graphics/GenericGraphicsAdapter.h b/Kernel/Graphics/GenericGraphicsAdapter.h
index 8a5e13731c..13944ca106 100644
--- a/Kernel/Graphics/GenericGraphicsAdapter.h
+++ b/Kernel/Graphics/GenericGraphicsAdapter.h
@@ -14,7 +14,7 @@
namespace Kernel {
class GenericGraphicsAdapter
- : public RefCounted<GenericGraphicsAdapter>
+ : public AtomicRefCounted<GenericGraphicsAdapter>
, public Weakable<GenericGraphicsAdapter> {
public:
virtual ~GenericGraphicsAdapter() = default;
diff --git a/Kernel/Graphics/VirtIOGPU/GPU3DDevice.h b/Kernel/Graphics/VirtIOGPU/GPU3DDevice.h
index a59641a79e..20b75d9c1c 100644
--- a/Kernel/Graphics/VirtIOGPU/GPU3DDevice.h
+++ b/Kernel/Graphics/VirtIOGPU/GPU3DDevice.h
@@ -100,7 +100,7 @@ public:
private:
VirtIOGPU3DDevice(VirtIOGraphicsAdapter const& graphics_adapter, NonnullOwnPtr<Memory::Region> transfer_buffer_region);
- class PerContextState : public RefCounted<PerContextState> {
+ class PerContextState final : public AtomicRefCounted<PerContextState> {
public:
static ErrorOr<RefPtr<PerContextState>> try_create(Graphics::VirtIOGPU::ContextID context_id)
{
diff --git a/Kernel/Library/ListedRefCounted.h b/Kernel/Library/ListedRefCounted.h
index ea95f18ad3..9374516264 100644
--- a/Kernel/Library/ListedRefCounted.h
+++ b/Kernel/Library/ListedRefCounted.h
@@ -6,7 +6,7 @@
#pragma once
-#include <AK/RefCounted.h>
+#include <AK/AtomicRefCounted.h>
namespace Kernel {
@@ -21,7 +21,7 @@ enum class LockType {
};
template<typename T, LockType Lock>
-class ListedRefCounted : public RefCountedBase {
+class ListedRefCounted : public AtomicRefCountedBase {
public:
bool unref() const
{
diff --git a/Kernel/Library/ThreadSafeRefCounted.h b/Kernel/Library/ThreadSafeRefCounted.h
deleted file mode 100644
index 18ebc5db27..0000000000
--- a/Kernel/Library/ThreadSafeRefCounted.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
- *
- * SPDX-License-Identifier: BSD-2-Clause
- */
-
-#pragma once
-
-#include <AK/Assertions.h>
-#include <AK/Atomic.h>
-#include <AK/Checked.h>
-#include <AK/Noncopyable.h>
-#include <AK/Platform.h>
-#include <AK/StdLibExtras.h>
-
-namespace AK {
-
-class RefCountedBase {
- AK_MAKE_NONCOPYABLE(RefCountedBase);
- AK_MAKE_NONMOVABLE(RefCountedBase);
-
-public:
- using RefCountType = unsigned int;
- using AllowOwnPtr = FalseType;
-
- 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()
- {
- VERIFY(m_ref_count.load(AK::MemoryOrder::memory_order_relaxed) == 0);
- }
-
- 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 };
-};
-
-template<typename T>
-class RefCounted : public RefCountedBase {
-public:
- bool unref() const
- {
- auto* that = const_cast<T*>(static_cast<T const*>(this));
- auto new_ref_count = deref_base();
- if (new_ref_count == 0) {
- if constexpr (requires { that->will_be_destroyed(); })
- that->will_be_destroyed();
- delete that;
- return true;
- }
- return false;
- }
-};
-
-}
-
-using AK::RefCounted;
-using AK::RefCountedBase;
diff --git a/Kernel/Library/ThreadSafeWeakPtr.h b/Kernel/Library/ThreadSafeWeakPtr.h
index cd25b8e558..c50bab3651 100644
--- a/Kernel/Library/ThreadSafeWeakPtr.h
+++ b/Kernel/Library/ThreadSafeWeakPtr.h
@@ -168,7 +168,7 @@ template<typename T>
template<typename U>
inline ErrorOr<WeakPtr<U>> Weakable<T>::try_make_weak_ptr() const
{
- if constexpr (IsBaseOf<RefCountedBase, T>) {
+ if constexpr (IsBaseOf<AtomicRefCountedBase, T>) {
// Checking m_being_destroyed isn't sufficient when dealing with
// a RefCounted type.The reference count will drop to 0 before the
// destructor is invoked and revoke_weak_ptrs is called. So, try
@@ -192,7 +192,7 @@ inline ErrorOr<WeakPtr<U>> Weakable<T>::try_make_weak_ptr() const
WeakPtr<U> weak_ptr(m_link);
- if constexpr (IsBaseOf<RefCountedBase, T>) {
+ if constexpr (IsBaseOf<AtomicRefCountedBase, T>) {
// Now drop the reference we temporarily added
if (static_cast<const T*>(this)->unref()) {
// We just dropped the last reference, which should have called
diff --git a/Kernel/Library/ThreadSafeWeakable.h b/Kernel/Library/ThreadSafeWeakable.h
index 3abbcea2d1..d97a064a19 100644
--- a/Kernel/Library/ThreadSafeWeakable.h
+++ b/Kernel/Library/ThreadSafeWeakable.h
@@ -8,7 +8,7 @@
#include <AK/Assertions.h>
#include <AK/Atomic.h>
-#include <AK/RefCounted.h>
+#include <AK/AtomicRefCounted.h>
#include <AK/RefPtr.h>
#include <AK/StdLibExtras.h>
#include <Kernel/Arch/Processor.h>
@@ -21,7 +21,7 @@ class Weakable;
template<typename T>
class WeakPtr;
-class WeakLink : public RefCounted<WeakLink> {
+class WeakLink final : public AtomicRefCounted<WeakLink> {
template<typename T>
friend class Weakable;
template<typename T>
@@ -30,7 +30,7 @@ class WeakLink : public RefCounted<WeakLink> {
public:
template<typename T, typename PtrTraits = RefPtrTraits<T>>
RefPtr<T, PtrTraits> strong_ref() const
- requires(IsBaseOf<RefCountedBase, T>)
+ requires(IsBaseOf<AtomicRefCountedBase, T>)
{
RefPtr<T, PtrTraits> ref;
diff --git a/Kernel/Memory/AnonymousVMObject.h b/Kernel/Memory/AnonymousVMObject.h
index 5733235ce9..71f1ef0663 100644
--- a/Kernel/Memory/AnonymousVMObject.h
+++ b/Kernel/Memory/AnonymousVMObject.h
@@ -63,7 +63,7 @@ private:
Bitmap m_cow_map;
// AnonymousVMObject shares committed COW pages with cloned children (happens on fork)
- class SharedCommittedCowPages : public RefCounted<SharedCommittedCowPages> {
+ class SharedCommittedCowPages final : public AtomicRefCounted<SharedCommittedCowPages> {
AK_MAKE_NONCOPYABLE(SharedCommittedCowPages);
public:
diff --git a/Kernel/Memory/PageDirectory.h b/Kernel/Memory/PageDirectory.h
index 842519dd0f..84450e665b 100644
--- a/Kernel/Memory/PageDirectory.h
+++ b/Kernel/Memory/PageDirectory.h
@@ -6,10 +6,10 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/Badge.h>
#include <AK/HashMap.h>
#include <AK/IntrusiveRedBlackTree.h>
-#include <AK/RefCounted.h>
#include <AK/RefPtr.h>
#include <Kernel/Forward.h>
#include <Kernel/Locking/Spinlock.h>
@@ -17,7 +17,7 @@
namespace Kernel::Memory {
-class PageDirectory : public RefCounted<PageDirectory> {
+class PageDirectory final : public AtomicRefCounted<PageDirectory> {
friend class MemoryManager;
public:
diff --git a/Kernel/Memory/ScatterGatherList.h b/Kernel/Memory/ScatterGatherList.h
index 6fedb75cad..1c57b6a2eb 100644
--- a/Kernel/Memory/ScatterGatherList.h
+++ b/Kernel/Memory/ScatterGatherList.h
@@ -6,6 +6,7 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/Vector.h>
#include <Kernel/Devices/BlockDevice.h>
#include <Kernel/Memory/AnonymousVMObject.h>
@@ -16,7 +17,7 @@ namespace Kernel::Memory {
// A Scatter-Gather List type that owns its buffers
-class ScatterGatherList : public RefCounted<ScatterGatherList> {
+class ScatterGatherList final : public AtomicRefCounted<ScatterGatherList> {
public:
static RefPtr<ScatterGatherList> try_create(AsyncBlockDeviceRequest&, Span<NonnullRefPtr<PhysicalPage>> allocated_pages, size_t device_block_size);
VMObject const& vmobject() const { return m_vm_object; }
diff --git a/Kernel/Net/NetworkAdapter.h b/Kernel/Net/NetworkAdapter.h
index 3f39274d3c..d465e378ec 100644
--- a/Kernel/Net/NetworkAdapter.h
+++ b/Kernel/Net/NetworkAdapter.h
@@ -6,6 +6,7 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/ByteBuffer.h>
#include <AK/Function.h>
#include <AK/IntrusiveList.h>
@@ -27,7 +28,7 @@ class NetworkAdapter;
using NetworkByteBuffer = AK::Detail::ByteBuffer<1500>;
-struct PacketWithTimestamp : public RefCounted<PacketWithTimestamp> {
+struct PacketWithTimestamp final : public AtomicRefCounted<PacketWithTimestamp> {
PacketWithTimestamp(NonnullOwnPtr<KBuffer> buffer, Time timestamp)
: buffer(move(buffer))
, timestamp(timestamp)
@@ -41,7 +42,8 @@ struct PacketWithTimestamp : public RefCounted<PacketWithTimestamp> {
IntrusiveListNode<PacketWithTimestamp, RefPtr<PacketWithTimestamp>> packet_node;
};
-class NetworkAdapter : public RefCounted<NetworkAdapter>
+class NetworkAdapter
+ : public AtomicRefCounted<NetworkAdapter>
, public Weakable<NetworkAdapter> {
public:
static constexpr i32 LINKSPEED_INVALID = -1;
diff --git a/Kernel/Net/Routing.h b/Kernel/Net/Routing.h
index ba7f06f2d2..fc3d4402cf 100644
--- a/Kernel/Net/Routing.h
+++ b/Kernel/Net/Routing.h
@@ -14,7 +14,7 @@
namespace Kernel {
-struct Route : public RefCounted<Route> {
+struct Route final : public AtomicRefCounted<Route> {
Route(IPv4Address const& destination, IPv4Address const& gateway, IPv4Address const& netmask, u16 flags, NonnullRefPtr<NetworkAdapter> adapter)
: destination(destination)
, gateway(gateway)
diff --git a/Kernel/Net/Socket.h b/Kernel/Net/Socket.h
index 281d530e9b..8622d52af4 100644
--- a/Kernel/Net/Socket.h
+++ b/Kernel/Net/Socket.h
@@ -8,7 +8,6 @@
#include <AK/Error.h>
#include <AK/NonnullRefPtrVector.h>
-#include <AK/RefCounted.h>
#include <AK/RefPtr.h>
#include <AK/Time.h>
#include <Kernel/FileSystem/File.h>
diff --git a/Kernel/ProcessExposed.h b/Kernel/ProcessExposed.h
index 6a51aafa07..e4779c7339 100644
--- a/Kernel/ProcessExposed.h
+++ b/Kernel/ProcessExposed.h
@@ -6,9 +6,9 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/Error.h>
#include <AK/Function.h>
-#include <AK/RefCounted.h>
#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/FileSystem/File.h>
@@ -66,7 +66,7 @@ private:
NonnullRefPtr<ProcFSRootDirectory> m_root_directory;
};
-class ProcFSExposedComponent : public RefCounted<ProcFSExposedComponent> {
+class ProcFSExposedComponent : public AtomicRefCounted<ProcFSExposedComponent> {
public:
StringView name() const { return m_name->view(); }
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const { VERIFY_NOT_REACHED(); }
diff --git a/Kernel/ProcessGroup.h b/Kernel/ProcessGroup.h
index 901e4986ea..37b0e0a1a2 100644
--- a/Kernel/ProcessGroup.h
+++ b/Kernel/ProcessGroup.h
@@ -6,8 +6,8 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/IntrusiveList.h>
-#include <AK/RefCounted.h>
#include <AK/Weakable.h>
#include <Kernel/Locking/SpinlockProtected.h>
#include <Kernel/UnixTypes.h>
@@ -15,7 +15,7 @@
namespace Kernel {
class ProcessGroup
- : public RefCounted<ProcessGroup>
+ : public AtomicRefCounted<ProcessGroup>
, public Weakable<ProcessGroup> {
AK_MAKE_NONMOVABLE(ProcessGroup);
diff --git a/Kernel/Storage/ATA/AHCI/Port.h b/Kernel/Storage/ATA/AHCI/Port.h
index f551fb13c4..26c0939ec2 100644
--- a/Kernel/Storage/ATA/AHCI/Port.h
+++ b/Kernel/Storage/ATA/AHCI/Port.h
@@ -32,7 +32,7 @@ class AsyncBlockDeviceRequest;
class AHCIInterruptHandler;
class AHCIPort
- : public RefCounted<AHCIPort>
+ : public AtomicRefCounted<AHCIPort>
, public Weakable<AHCIPort> {
friend class AHCIController;
diff --git a/Kernel/Storage/ATA/ATAPort.h b/Kernel/Storage/ATA/ATAPort.h
index c8d9db2882..88d133b43f 100644
--- a/Kernel/Storage/ATA/ATAPort.h
+++ b/Kernel/Storage/ATA/ATAPort.h
@@ -13,7 +13,7 @@ namespace Kernel {
class AsyncBlockDeviceRequest;
class ATAPort
- : public RefCounted<ATAPort>
+ : public AtomicRefCounted<ATAPort>
, public Weakable<ATAPort> {
friend class ATAPortInterruptDisabler;
diff --git a/Kernel/Storage/NVMe/NVMeNameSpace.h b/Kernel/Storage/NVMe/NVMeNameSpace.h
index e96c6f9805..b6df088a62 100644
--- a/Kernel/Storage/NVMe/NVMeNameSpace.h
+++ b/Kernel/Storage/NVMe/NVMeNameSpace.h
@@ -10,7 +10,6 @@
#include <AK/NonnullRefPtr.h>
#include <AK/NonnullRefPtrVector.h>
#include <AK/OwnPtr.h>
-#include <AK/RefCounted.h>
#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Locking/Spinlock.h>
diff --git a/Kernel/Storage/NVMe/NVMeQueue.h b/Kernel/Storage/NVMe/NVMeQueue.h
index 49c2e9ec9a..aa0e3727dc 100644
--- a/Kernel/Storage/NVMe/NVMeQueue.h
+++ b/Kernel/Storage/NVMe/NVMeQueue.h
@@ -6,10 +6,10 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/NonnullRefPtr.h>
#include <AK/NonnullRefPtrVector.h>
#include <AK/OwnPtr.h>
-#include <AK/RefCounted.h>
#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Bus/PCI/Device.h>
@@ -27,9 +27,9 @@ struct DoorbellRegister {
};
class AsyncBlockDeviceRequest;
-class NVMeQueue : public RefCounted<NVMeQueue> {
+class NVMeQueue : public AtomicRefCounted<NVMeQueue> {
public:
- static ErrorOr<NonnullRefPtr<NVMeQueue>> try_create(u16 qid, Optional<u8> irq, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> db_regs);
+ static ErrorOr<NonnullRefPtr<NVMeQueue>> try_create(u16 qid, Optional<u8> irq, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<DoorbellRegister volatile> db_regs);
bool is_admin_queue() { return m_admin_queue; };
u16 submit_sync_sqe(NVMeSubmission&);
void read(AsyncBlockDeviceRequest& request, u16 nsid, u64 index, u32 count);
@@ -43,7 +43,7 @@ protected:
{
m_db_regs->sq_tail = m_sq_tail;
}
- NVMeQueue(NonnullOwnPtr<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> db_regs);
+ NVMeQueue(NonnullOwnPtr<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<DoorbellRegister volatile> db_regs);
private:
bool cqe_available();
@@ -75,7 +75,7 @@ private:
OwnPtr<Memory::Region> m_sq_dma_region;
NonnullRefPtrVector<Memory::PhysicalPage> m_sq_dma_page;
Span<NVMeCompletion> m_cqe_array;
- Memory::TypedMapping<volatile DoorbellRegister> m_db_regs;
+ Memory::TypedMapping<DoorbellRegister volatile> m_db_regs;
NonnullRefPtr<Memory::PhysicalPage> m_rw_dma_page;
};
}
diff --git a/Kernel/Storage/StorageController.h b/Kernel/Storage/StorageController.h
index 769441adda..f89b41317a 100644
--- a/Kernel/Storage/StorageController.h
+++ b/Kernel/Storage/StorageController.h
@@ -21,7 +21,7 @@ namespace Kernel {
class AsyncBlockDeviceRequest;
class StorageDevice;
-class StorageController : public RefCounted<StorageController> {
+class StorageController : public AtomicRefCounted<StorageController> {
public:
virtual ~StorageController() = default;
diff --git a/Kernel/Time/HardwareTimer.h b/Kernel/Time/HardwareTimer.h
index ed1e0851ec..a3a3d75d60 100644
--- a/Kernel/Time/HardwareTimer.h
+++ b/Kernel/Time/HardwareTimer.h
@@ -6,8 +6,8 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/Function.h>
-#include <AK/RefCounted.h>
#include <Kernel/Interrupts/IRQHandler.h>
#include <Kernel/Time/TimeManagement.h>
@@ -23,8 +23,7 @@ enum class HardwareTimerType {
template<typename InterruptHandlerType>
class HardwareTimer;
-class HardwareTimerBase
- : public RefCounted<HardwareTimerBase> {
+class HardwareTimerBase : public AtomicRefCounted<HardwareTimerBase> {
public:
virtual ~HardwareTimerBase() = default;
diff --git a/Kernel/TimerQueue.h b/Kernel/TimerQueue.h
index 9b982e4669..9163957961 100644
--- a/Kernel/TimerQueue.h
+++ b/Kernel/TimerQueue.h
@@ -6,11 +6,11 @@
#pragma once
+#include <AK/AtomicRefCounted.h>
#include <AK/Function.h>
#include <AK/IntrusiveList.h>
#include <AK/NonnullRefPtr.h>
#include <AK/OwnPtr.h>
-#include <AK/RefCounted.h>
#include <AK/Time.h>
#include <Kernel/Time/TimeManagement.h>
@@ -18,7 +18,7 @@ namespace Kernel {
AK_TYPEDEF_DISTINCT_ORDERED_ID(u64, TimerId);
-class Timer : public RefCounted<Timer> {
+class Timer final : public AtomicRefCounted<Timer> {
friend class TimerQueue;
public: