diff options
author | Andreas Kling <kling@serenityos.org> | 2022-08-19 17:26:07 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-08-20 17:15:52 +0200 |
commit | e475263113387404e63cdc3666391934604eb6e7 (patch) | |
tree | 5d15d4f41a7811f58171b6e8bdd6ae014e2bea7d /Kernel | |
parent | 4889eb019a47478e50e1876f9584356e957e4ea4 (diff) | |
download | serenity-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')
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: |