From 11eee67b8510767d76fb4793e3b62ac1793dd723 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 19 Aug 2022 20:53:40 +0200 Subject: [PATCH] Kernel: Make self-contained locking smart pointers their own classes Until now, our kernel has reimplemented a number of AK classes to provide automatic internal locking: - RefPtr - NonnullRefPtr - WeakPtr - Weakable This patch renames the Kernel classes so that they can coexist with the original AK classes: - RefPtr => LockRefPtr - NonnullRefPtr => NonnullLockRefPtr - WeakPtr => LockWeakPtr - Weakable => LockWeakable The goal here is to eventually get rid of the Lock* classes in favor of using external locking. --- AK/Forward.h | 29 +++- AK/IntrusiveDetails.h | 10 ++ AK/IntrusiveList.h | 46 +++-- AK/NonnullRefPtr.h | 35 ++-- AK/RefPtr.h | 48 +++--- AK/WeakPtr.h | 7 +- AK/Weakable.h | 17 +- Kernel/Arch/aarch64/Dummy.cpp | 4 +- Kernel/Arch/aarch64/InterruptManagement.cpp | 4 +- Kernel/Arch/aarch64/InterruptManagement.h | 8 +- Kernel/Arch/aarch64/PageDirectory.cpp | 2 +- Kernel/Arch/aarch64/init.cpp | 2 +- Kernel/Arch/x86/InterruptManagement.h | 8 +- .../Arch/x86/common/InterruptManagement.cpp | 10 +- Kernel/Arch/x86/common/Interrupts.cpp | 17 +- Kernel/Arch/x86/common/PageDirectory.cpp | 2 +- Kernel/Bus/USB/UHCI/UHCIController.cpp | 6 +- Kernel/Bus/USB/UHCI/UHCIController.h | 2 +- Kernel/Bus/USB/UHCI/UHCIRootHub.cpp | 4 +- Kernel/Bus/USB/UHCI/UHCIRootHub.h | 10 +- Kernel/Bus/USB/USBController.h | 2 +- Kernel/Bus/USB/USBDevice.cpp | 6 +- Kernel/Bus/USB/USBDevice.h | 10 +- Kernel/Bus/USB/USBHub.cpp | 12 +- Kernel/Bus/USB/USBHub.h | 6 +- Kernel/Bus/USB/USBManagement.h | 4 +- Kernel/Bus/USB/USBPipe.h | 2 +- Kernel/Bus/USB/USBTransfer.cpp | 4 +- Kernel/Bus/USB/USBTransfer.h | 4 +- Kernel/Bus/VirtIO/Console.cpp | 4 +- Kernel/Bus/VirtIO/Console.h | 4 +- Kernel/Bus/VirtIO/ConsolePort.cpp | 6 +- Kernel/Bus/VirtIO/ConsolePort.h | 4 +- Kernel/Bus/VirtIO/RNG.cpp | 4 +- Kernel/Bus/VirtIO/RNG.h | 2 +- Kernel/Coredump.cpp | 6 +- Kernel/Coredump.h | 12 +- Kernel/Devices/AsyncDeviceRequest.cpp | 2 +- Kernel/Devices/AsyncDeviceRequest.h | 8 +- Kernel/Devices/Audio/AC97.cpp | 6 +- Kernel/Devices/Audio/AC97.h | 6 +- Kernel/Devices/Audio/Channel.cpp | 2 +- Kernel/Devices/Audio/Channel.h | 4 +- Kernel/Devices/Audio/Controller.h | 10 +- Kernel/Devices/Audio/Management.h | 2 +- Kernel/Devices/BlockDevice.h | 2 +- Kernel/Devices/ConsoleDevice.cpp | 2 +- Kernel/Devices/ConsoleDevice.h | 2 +- Kernel/Devices/Device.h | 14 +- Kernel/Devices/DeviceControlDevice.cpp | 2 +- Kernel/Devices/DeviceControlDevice.h | 2 +- Kernel/Devices/DeviceManagement.h | 16 +- Kernel/Devices/FullDevice.cpp | 2 +- Kernel/Devices/FullDevice.h | 2 +- Kernel/Devices/HID/HIDManagement.h | 8 +- Kernel/Devices/HID/I8042Controller.cpp | 8 +- Kernel/Devices/HID/I8042Controller.h | 12 +- Kernel/Devices/HID/PS2KeyboardDevice.cpp | 2 +- Kernel/Devices/HID/PS2KeyboardDevice.h | 2 +- Kernel/Devices/HID/PS2MouseDevice.cpp | 2 +- Kernel/Devices/HID/PS2MouseDevice.h | 2 +- Kernel/Devices/HID/VMWareMouseDevice.cpp | 2 +- Kernel/Devices/HID/VMWareMouseDevice.h | 2 +- Kernel/Devices/KCOVDevice.cpp | 4 +- Kernel/Devices/KCOVDevice.h | 4 +- Kernel/Devices/KCOVInstance.h | 2 +- Kernel/Devices/MemoryDevice.cpp | 2 +- Kernel/Devices/MemoryDevice.h | 2 +- Kernel/Devices/NullDevice.cpp | 2 +- Kernel/Devices/NullDevice.h | 2 +- Kernel/Devices/RandomDevice.cpp | 2 +- Kernel/Devices/RandomDevice.h | 2 +- Kernel/Devices/SelfTTYDevice.cpp | 6 +- Kernel/Devices/SelfTTYDevice.h | 4 +- Kernel/Devices/SerialDevice.cpp | 4 +- Kernel/Devices/SerialDevice.h | 2 +- Kernel/Devices/ZeroDevice.cpp | 2 +- Kernel/Devices/ZeroDevice.h | 2 +- Kernel/FileSystem/AnonymousFile.cpp | 2 +- Kernel/FileSystem/AnonymousFile.h | 8 +- Kernel/FileSystem/Custody.cpp | 8 +- Kernel/FileSystem/Custody.h | 8 +- Kernel/FileSystem/DevPtsFS.cpp | 16 +- Kernel/FileSystem/DevPtsFS.h | 12 +- Kernel/FileSystem/DevTmpFS.cpp | 24 +-- Kernel/FileSystem/DevTmpFS.h | 14 +- Kernel/FileSystem/Ext2FileSystem.cpp | 20 +-- Kernel/FileSystem/Ext2FileSystem.h | 16 +- Kernel/FileSystem/FIFO.cpp | 8 +- Kernel/FileSystem/FIFO.h | 6 +- Kernel/FileSystem/File.cpp | 2 +- Kernel/FileSystem/File.h | 8 +- Kernel/FileSystem/FileBackedFileSystem.h | 2 +- Kernel/FileSystem/FileSystem.cpp | 2 +- Kernel/FileSystem/FileSystem.h | 2 +- Kernel/FileSystem/ISO9660FileSystem.cpp | 22 +-- Kernel/FileSystem/ISO9660FileSystem.h | 20 +-- Kernel/FileSystem/Inode.cpp | 14 +- Kernel/FileSystem/Inode.h | 22 +-- Kernel/FileSystem/InodeFile.cpp | 4 +- Kernel/FileSystem/InodeFile.h | 8 +- Kernel/FileSystem/InodeWatcher.cpp | 4 +- Kernel/FileSystem/InodeWatcher.h | 2 +- Kernel/FileSystem/Mount.h | 8 +- Kernel/FileSystem/OpenFileDescription.cpp | 8 +- Kernel/FileSystem/OpenFileDescription.h | 12 +- Kernel/FileSystem/Plan9FileSystem.cpp | 16 +- Kernel/FileSystem/Plan9FileSystem.h | 22 +-- Kernel/FileSystem/ProcFS.cpp | 52 +++--- Kernel/FileSystem/ProcFS.h | 36 ++-- Kernel/FileSystem/SysFS.cpp | 22 +-- Kernel/FileSystem/SysFS.h | 18 +- Kernel/FileSystem/SysFS/Component.cpp | 10 +- Kernel/FileSystem/SysFS/Component.h | 18 +- Kernel/FileSystem/SysFS/Registry.h | 2 +- Kernel/FileSystem/SysFS/RootDirectory.cpp | 4 +- Kernel/FileSystem/SysFS/RootDirectory.h | 4 +- .../SysFS/Subsystems/Bus/Directory.cpp | 4 +- .../SysFS/Subsystems/Bus/Directory.h | 2 +- .../SysFS/Subsystems/Bus/PCI/BusDirectory.cpp | 2 +- .../Subsystems/Bus/PCI/DeviceAttribute.cpp | 4 +- .../Subsystems/Bus/PCI/DeviceAttribute.h | 4 +- .../Subsystems/Bus/PCI/DeviceDirectory.cpp | 4 +- .../Subsystems/Bus/PCI/DeviceDirectory.h | 2 +- .../SysFS/Subsystems/Bus/USB/BusDirectory.cpp | 2 +- .../Subsystems/Bus/USB/DeviceInformation.cpp | 4 +- .../Subsystems/Bus/USB/DeviceInformation.h | 4 +- .../BlockDevicesDirectory.cpp | 4 +- .../DeviceIdentifiers/BlockDevicesDirectory.h | 2 +- .../CharacterDevicesDirectory.cpp | 4 +- .../CharacterDevicesDirectory.h | 2 +- .../DeviceIdentifiers/DeviceComponent.cpp | 4 +- .../DeviceIdentifiers/DeviceComponent.h | 4 +- .../DeviceIdentifiers/Directory.cpp | 4 +- .../Subsystems/DeviceIdentifiers/Directory.h | 2 +- .../SymbolicLinkDeviceComponent.cpp | 8 +- .../SymbolicLinkDeviceComponent.h | 8 +- .../SysFS/Subsystems/Devices/Directory.cpp | 4 +- .../SysFS/Subsystems/Devices/Directory.h | 2 +- .../Subsystems/Devices/Graphics/Directory.cpp | 4 +- .../Subsystems/Devices/Graphics/Directory.h | 2 +- .../DisplayConnector/DeviceAttribute.cpp | 4 +- .../DisplayConnector/DeviceAttribute.h | 4 +- .../DisplayConnector/DeviceDirectory.cpp | 4 +- .../DisplayConnector/DeviceDirectory.h | 4 +- .../Graphics/DisplayConnector/Directory.cpp | 4 +- .../Graphics/DisplayConnector/Directory.h | 2 +- .../Devices/Storage/DeviceAttribute.cpp | 4 +- .../Devices/Storage/DeviceAttribute.h | 4 +- .../Devices/Storage/DeviceDirectory.cpp | 4 +- .../Devices/Storage/DeviceDirectory.h | 4 +- .../Subsystems/Devices/Storage/Directory.cpp | 4 +- .../Subsystems/Devices/Storage/Directory.h | 2 +- .../Subsystems/Firmware/BIOS/Component.cpp | 4 +- .../Subsystems/Firmware/BIOS/Component.h | 4 +- .../Subsystems/Firmware/BIOS/Directory.cpp | 4 +- .../Subsystems/Firmware/BIOS/Directory.h | 4 +- .../SysFS/Subsystems/Firmware/Directory.cpp | 2 +- .../Subsystems/Firmware/PowerStateSwitch.cpp | 4 +- .../Subsystems/Firmware/PowerStateSwitch.h | 4 +- Kernel/FileSystem/TmpFS.cpp | 16 +- Kernel/FileSystem/TmpFS.h | 18 +- Kernel/FileSystem/VirtualFileSystem.cpp | 30 ++-- Kernel/FileSystem/VirtualFileSystem.h | 16 +- Kernel/Firmware/ACPI/Parser.cpp | 8 +- Kernel/Firmware/ACPI/Parser.h | 6 +- Kernel/GlobalProcessExposed.cpp | 162 +++++++++--------- Kernel/Graphics/Bochs/DisplayConnector.cpp | 2 +- Kernel/Graphics/Bochs/DisplayConnector.h | 6 +- Kernel/Graphics/Bochs/GraphicsAdapter.cpp | 4 +- Kernel/Graphics/Bochs/GraphicsAdapter.h | 4 +- .../Graphics/Bochs/QEMUDisplayConnector.cpp | 2 +- Kernel/Graphics/Bochs/QEMUDisplayConnector.h | 4 +- .../Console/ContiguousFramebufferConsole.cpp | 4 +- .../Console/ContiguousFramebufferConsole.h | 2 +- .../Graphics/Console/VGATextModeConsole.cpp | 4 +- Kernel/Graphics/Console/VGATextModeConsole.h | 2 +- Kernel/Graphics/DisplayConnector.h | 6 +- Kernel/Graphics/Generic/DisplayConnector.cpp | 2 +- Kernel/Graphics/Generic/DisplayConnector.h | 6 +- Kernel/Graphics/GenericGraphicsAdapter.h | 4 +- Kernel/Graphics/GraphicsManagement.cpp | 2 +- Kernel/Graphics/GraphicsManagement.h | 12 +- .../Graphics/Intel/NativeDisplayConnector.cpp | 2 +- .../Graphics/Intel/NativeDisplayConnector.h | 6 +- .../Graphics/Intel/NativeGraphicsAdapter.cpp | 4 +- Kernel/Graphics/Intel/NativeGraphicsAdapter.h | 4 +- Kernel/Graphics/VMWare/Console.cpp | 6 +- Kernel/Graphics/VMWare/Console.h | 4 +- Kernel/Graphics/VMWare/DisplayConnector.cpp | 2 +- Kernel/Graphics/VMWare/DisplayConnector.h | 8 +- Kernel/Graphics/VMWare/GraphicsAdapter.cpp | 4 +- Kernel/Graphics/VMWare/GraphicsAdapter.h | 4 +- Kernel/Graphics/VirtIOGPU/Console.cpp | 6 +- Kernel/Graphics/VirtIOGPU/Console.h | 4 +- .../Graphics/VirtIOGPU/DisplayConnector.cpp | 2 +- Kernel/Graphics/VirtIOGPU/DisplayConnector.h | 6 +- Kernel/Graphics/VirtIOGPU/GPU3DDevice.cpp | 6 +- Kernel/Graphics/VirtIOGPU/GPU3DDevice.h | 12 +- Kernel/Graphics/VirtIOGPU/GraphicsAdapter.cpp | 4 +- Kernel/Graphics/VirtIOGPU/GraphicsAdapter.h | 6 +- Kernel/Interrupts/IRQHandler.h | 4 +- Kernel/Interrupts/SharedIRQHandler.h | 4 +- Kernel/Interrupts/SpuriousInterruptHandler.h | 2 +- .../{ThreadSafeRefPtr.h => LockRefPtr.h} | 142 +++++++-------- .../{ThreadSafeWeakPtr.h => LockWeakPtr.h} | 70 ++++---- .../{ThreadSafeWeakable.h => LockWeakable.h} | 30 ++-- ...afeNonnullRefPtr.h => NonnullLockRefPtr.h} | 111 ++++++------ Kernel/Library/NonnullLockRefPtrVector.h | 21 +++ Kernel/Locking/Mutex.h | 2 +- Kernel/Memory/AddressSpace.cpp | 6 +- Kernel/Memory/AddressSpace.h | 10 +- Kernel/Memory/AnonymousVMObject.cpp | 46 ++--- Kernel/Memory/AnonymousVMObject.h | 30 ++-- Kernel/Memory/InodeVMObject.cpp | 4 +- Kernel/Memory/InodeVMObject.h | 6 +- Kernel/Memory/MemoryManager.cpp | 22 +-- Kernel/Memory/MemoryManager.h | 22 +-- Kernel/Memory/PageDirectory.cpp | 8 +- Kernel/Memory/PageDirectory.h | 16 +- Kernel/Memory/PhysicalPage.cpp | 4 +- Kernel/Memory/PhysicalPage.h | 4 +- Kernel/Memory/PhysicalRegion.cpp | 10 +- Kernel/Memory/PhysicalRegion.h | 4 +- Kernel/Memory/PrivateInodeVMObject.cpp | 12 +- Kernel/Memory/PrivateInodeVMObject.h | 8 +- Kernel/Memory/Region.cpp | 22 +-- Kernel/Memory/Region.h | 26 +-- Kernel/Memory/ScatterGatherList.cpp | 6 +- Kernel/Memory/ScatterGatherList.h | 6 +- Kernel/Memory/SharedFramebufferVMObject.cpp | 30 ++-- Kernel/Memory/SharedFramebufferVMObject.h | 50 +++--- Kernel/Memory/SharedInodeVMObject.cpp | 12 +- Kernel/Memory/SharedInodeVMObject.h | 8 +- Kernel/Memory/VMObject.cpp | 8 +- Kernel/Memory/VMObject.h | 20 +-- Kernel/Net/IPv4Socket.cpp | 4 +- Kernel/Net/IPv4Socket.h | 2 +- Kernel/Net/Intel/E1000ENetworkAdapter.cpp | 4 +- Kernel/Net/Intel/E1000ENetworkAdapter.h | 2 +- Kernel/Net/Intel/E1000NetworkAdapter.cpp | 4 +- Kernel/Net/Intel/E1000NetworkAdapter.h | 2 +- Kernel/Net/LocalSocket.cpp | 12 +- Kernel/Net/LocalSocket.h | 20 +-- Kernel/Net/LoopbackAdapter.cpp | 4 +- Kernel/Net/LoopbackAdapter.h | 2 +- Kernel/Net/NE2000/NetworkAdapter.cpp | 4 +- Kernel/Net/NE2000/NetworkAdapter.h | 2 +- Kernel/Net/NetworkAdapter.cpp | 6 +- Kernel/Net/NetworkAdapter.h | 10 +- Kernel/Net/NetworkTask.cpp | 20 +-- Kernel/Net/NetworkingManagement.cpp | 12 +- Kernel/Net/NetworkingManagement.h | 16 +- Kernel/Net/Realtek/RTL8139NetworkAdapter.cpp | 4 +- Kernel/Net/Realtek/RTL8139NetworkAdapter.h | 2 +- Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp | 4 +- Kernel/Net/Realtek/RTL8168NetworkAdapter.h | 2 +- Kernel/Net/Routing.cpp | 12 +- Kernel/Net/Routing.h | 14 +- Kernel/Net/Socket.cpp | 6 +- Kernel/Net/Socket.h | 16 +- Kernel/Net/TCPSocket.cpp | 18 +- Kernel/Net/TCPSocket.h | 22 +-- Kernel/Net/UDPSocket.cpp | 8 +- Kernel/Net/UDPSocket.h | 4 +- Kernel/Process.cpp | 34 ++-- Kernel/Process.h | 80 ++++----- Kernel/ProcessExposed.cpp | 8 +- Kernel/ProcessExposed.h | 24 +-- Kernel/ProcessGroup.cpp | 14 +- Kernel/ProcessGroup.h | 10 +- Kernel/ProcessProcFSTraits.cpp | 2 +- Kernel/ProcessSpecificExposed.cpp | 10 +- Kernel/Scheduler.cpp | 2 +- Kernel/Storage/ATA/AHCI/Controller.cpp | 12 +- Kernel/Storage/ATA/AHCI/Controller.h | 10 +- Kernel/Storage/ATA/AHCI/InterruptHandler.h | 4 +- Kernel/Storage/ATA/AHCI/Port.cpp | 14 +- Kernel/Storage/ATA/AHCI/Port.h | 32 ++-- Kernel/Storage/ATA/ATAController.h | 4 +- Kernel/Storage/ATA/ATADevice.h | 2 +- Kernel/Storage/ATA/ATADiskDevice.cpp | 2 +- Kernel/Storage/ATA/ATADiskDevice.h | 2 +- Kernel/Storage/ATA/ATAPort.cpp | 6 +- Kernel/Storage/ATA/ATAPort.h | 14 +- Kernel/Storage/ATA/GenericIDE/Channel.cpp | 8 +- Kernel/Storage/ATA/GenericIDE/Channel.h | 6 +- Kernel/Storage/ATA/GenericIDE/Controller.cpp | 12 +- Kernel/Storage/ATA/GenericIDE/Controller.h | 10 +- .../Storage/ATA/GenericIDE/ISAController.cpp | 6 +- Kernel/Storage/ATA/GenericIDE/ISAController.h | 6 +- .../Storage/ATA/GenericIDE/PCIController.cpp | 6 +- Kernel/Storage/ATA/GenericIDE/PCIController.h | 6 +- Kernel/Storage/DiskPartition.cpp | 2 +- Kernel/Storage/DiskPartition.h | 8 +- Kernel/Storage/NVMe/NVMeController.cpp | 24 +-- Kernel/Storage/NVMe/NVMeController.h | 18 +- Kernel/Storage/NVMe/NVMeInterruptQueue.cpp | 2 +- Kernel/Storage/NVMe/NVMeInterruptQueue.h | 2 +- Kernel/Storage/NVMe/NVMeNameSpace.cpp | 4 +- Kernel/Storage/NVMe/NVMeNameSpace.h | 12 +- Kernel/Storage/NVMe/NVMePollQueue.cpp | 2 +- Kernel/Storage/NVMe/NVMePollQueue.h | 2 +- Kernel/Storage/NVMe/NVMeQueue.cpp | 10 +- Kernel/Storage/NVMe/NVMeQueue.h | 18 +- Kernel/Storage/Ramdisk/Controller.cpp | 8 +- Kernel/Storage/Ramdisk/Controller.h | 8 +- Kernel/Storage/Ramdisk/Device.cpp | 2 +- Kernel/Storage/Ramdisk/Device.h | 2 +- Kernel/Storage/StorageController.h | 4 +- Kernel/Storage/StorageDevice.h | 8 +- Kernel/Storage/StorageManagement.cpp | 4 +- Kernel/Storage/StorageManagement.h | 12 +- Kernel/Syscalls/alarm.cpp | 2 +- Kernel/Syscalls/chdir.cpp | 4 +- Kernel/Syscalls/chmod.cpp | 2 +- Kernel/Syscalls/chown.cpp | 4 +- Kernel/Syscalls/execve.cpp | 16 +- Kernel/Syscalls/fork.cpp | 2 +- Kernel/Syscalls/futex.cpp | 12 +- Kernel/Syscalls/mmap.cpp | 4 +- Kernel/Syscalls/mount.cpp | 12 +- Kernel/Syscalls/open.cpp | 2 +- Kernel/Syscalls/poll.cpp | 2 +- Kernel/Syscalls/purge.cpp | 6 +- Kernel/Syscalls/read.cpp | 2 +- Kernel/Syscalls/socket.cpp | 6 +- Kernel/Syscalls/stat.cpp | 4 +- Kernel/Syscalls/unlink.cpp | 2 +- Kernel/Syscalls/unveil.cpp | 2 +- Kernel/Syscalls/utimensat.cpp | 4 +- Kernel/Syscalls/waitid.cpp | 4 +- Kernel/TTY/ConsoleManagement.h | 10 +- Kernel/TTY/MasterPTY.cpp | 6 +- Kernel/TTY/MasterPTY.h | 4 +- Kernel/TTY/PTYMultiplexer.cpp | 4 +- Kernel/TTY/PTYMultiplexer.h | 2 +- Kernel/TTY/SlavePTY.h | 2 +- Kernel/TTY/TTY.h | 6 +- Kernel/TTY/VirtualConsole.cpp | 4 +- Kernel/TTY/VirtualConsole.h | 4 +- Kernel/Tasks/FinalizerTask.cpp | 2 +- Kernel/Tasks/SyncTask.cpp | 2 +- Kernel/Thread.cpp | 16 +- Kernel/Thread.h | 38 ++-- Kernel/ThreadBlockers.cpp | 10 +- Kernel/Time/APICTimer.cpp | 2 +- Kernel/Time/HPET.h | 6 +- Kernel/Time/HPETComparator.cpp | 4 +- Kernel/Time/HPETComparator.h | 2 +- Kernel/Time/PIT.cpp | 4 +- Kernel/Time/PIT.h | 4 +- Kernel/Time/RTC.cpp | 4 +- Kernel/Time/RTC.h | 4 +- Kernel/Time/TimeManagement.h | 12 +- Kernel/TimerQueue.cpp | 8 +- Kernel/TimerQueue.h | 8 +- Kernel/WorkQueue.cpp | 2 +- Kernel/WorkQueue.h | 2 +- Kernel/init.cpp | 6 +- 360 files changed, 1703 insertions(+), 1672 deletions(-) rename Kernel/Library/{ThreadSafeRefPtr.h => LockRefPtr.h} (71%) rename Kernel/Library/{ThreadSafeWeakPtr.h => LockWeakPtr.h} (71%) rename Kernel/Library/{ThreadSafeWeakable.h => LockWeakable.h} (84%) rename Kernel/Library/{ThreadSafeNonnullRefPtr.h => NonnullLockRefPtr.h} (67%) create mode 100644 Kernel/Library/NonnullLockRefPtrVector.h diff --git a/AK/Forward.h b/AK/Forward.h index cced16c5bf..558a8a8028 100644 --- a/AK/Forward.h +++ b/AK/Forward.h @@ -55,7 +55,7 @@ struct Array; template class SimpleIterator; -using ReadonlyBytes = Span; +using ReadonlyBytes = Span; using Bytes = Span; template @@ -107,24 +107,30 @@ template class NonnullOwnPtr; template -class NonnullRefPtrVector; +class NonnullOwnPtrVector; template -class NonnullOwnPtrVector; +class NonnullRefPtrVector; template class Optional; #ifdef KERNEL template -struct RefPtrTraits; +class NonnullLockRefPtr; + +template +class NonnullLockRefPtrVector; + +template +struct LockRefPtrTraits; + +template> +class LockRefPtr; +#endif -template> -class RefPtr; -#else template class RefPtr; -#endif template class OwnPtr; @@ -192,3 +198,10 @@ using AK::Utf32View; using AK::Utf8CodePointIterator; using AK::Utf8View; using AK::Vector; + +#ifdef KERNEL +using AK::LockRefPtr; +using AK::LockRefPtrTraits; +using AK::NonnullLockRefPtr; +using AK::NonnullLockRefPtrVector; +#endif diff --git a/AK/IntrusiveDetails.h b/AK/IntrusiveDetails.h index 180979b373..1a86543693 100644 --- a/AK/IntrusiveDetails.h +++ b/AK/IntrusiveDetails.h @@ -8,6 +8,9 @@ #include +#ifdef KERNEL +# include +#endif namespace AK::Detail { template @@ -20,6 +23,13 @@ struct SubstituteIntrusiveContainerType> { using Type = RefPtr; }; +#ifdef KERNEL +template +struct SubstituteIntrusiveContainerType> { + using Type = LockRefPtr; +}; +#endif + template struct SelfReferenceIfNeeded { Container reference = nullptr; diff --git a/AK/IntrusiveList.h b/AK/IntrusiveList.h index f946a5f527..5f06579bb3 100644 --- a/AK/IntrusiveList.h +++ b/AK/IntrusiveList.h @@ -13,6 +13,10 @@ #include #include +#ifdef KERNEL +# include +#endif + namespace AK::Detail { template> @@ -56,7 +60,7 @@ public: void prepend(T& n); void insert_before(T&, T&); void remove(T& n); - [[nodiscard]] bool contains(const T&) const; + [[nodiscard]] bool contains(T const&) const; [[nodiscard]] Container first() const; [[nodiscard]] Container last() const; @@ -71,7 +75,7 @@ public: { } - const T& operator*() const { return *m_value; } + T const& operator*() const { return *m_value; } auto operator->() const { return m_value; } T& operator*() { return *m_value; } auto operator->() { return m_value; } @@ -99,7 +103,7 @@ public: { } - const T& operator*() const { return *m_value; } + T const& operator*() const { return *m_value; } auto operator->() const { return m_value; } T& operator*() { return *m_value; } auto operator->() { return m_value; } @@ -122,12 +126,12 @@ public: class ConstIterator { public: ConstIterator() = default; - ConstIterator(const T* value) + ConstIterator(T const* value) : m_value(value) { } - const T& operator*() const { return *m_value; } + T const& operator*() const { return *m_value; } auto operator->() const { return m_value; } bool operator==(ConstIterator const& other) const { return other.m_value == m_value; } bool operator!=(ConstIterator const& other) const { return !(*this == other); } @@ -138,7 +142,7 @@ public: } private: - const T* m_value { nullptr }; + T const* m_value { nullptr }; }; ConstIterator begin() const; @@ -147,8 +151,8 @@ public: private: static T* next(T* current); static T* prev(T* current); - static const T* next(const T* current); - static const T* prev(const T* current); + static T const* next(T const* current); + static T const* prev(T const* current); static T* node_to_value(SubstitutedIntrusiveListNode& node); IntrusiveListStorage m_storage; }; @@ -284,7 +288,7 @@ inline void IntrusiveList::remove(T& n) } template T::*member> -inline bool IntrusiveList::contains(const T& n) const +inline bool IntrusiveList::contains(T const& n) const { auto& nnode = n.*member; return nnode.m_storage == &m_storage; @@ -323,18 +327,18 @@ inline Container IntrusiveList::last() const } template T::*member> -inline const T* IntrusiveList::next(const T* current) +inline T const* IntrusiveList::next(T const* current) { auto& nextnode = (current->*member).m_next; - const T* nextstruct = nextnode ? node_to_value(*nextnode) : nullptr; + T const* nextstruct = nextnode ? node_to_value(*nextnode) : nullptr; return nextstruct; } template T::*member> -inline const T* IntrusiveList::prev(const T* current) +inline T const* IntrusiveList::prev(T const* current) { auto& prevnode = (current->*member).m_prev; - const T* prevstruct = prevnode ? node_to_value(*prevnode) : nullptr; + T const* prevstruct = prevnode ? node_to_value(*prevnode) : nullptr; return prevstruct; } @@ -429,6 +433,22 @@ public: [[nodiscard]] NonnullRefPtr take_last() { return *IntrusiveList, member>::take_last(); } }; +#ifdef KERNEL +// Specialise IntrusiveList for NonnullLockRefPtr +// By default, intrusive lists cannot contain null entries anyway, so switch to LockRefPtr +// and just make the user-facing functions deref the pointers. + +template> T::*member> +class IntrusiveList, member> : public IntrusiveList, member> { +public: + [[nodiscard]] NonnullLockRefPtr first() const { return *IntrusiveList, member>::first(); } + [[nodiscard]] NonnullLockRefPtr last() const { return *IntrusiveList, member>::last(); } + + [[nodiscard]] NonnullLockRefPtr take_first() { return *IntrusiveList, member>::take_first(); } + [[nodiscard]] NonnullLockRefPtr take_last() { return *IntrusiveList, member>::take_last(); } +}; +#endif + } namespace AK { diff --git a/AK/NonnullRefPtr.h b/AK/NonnullRefPtr.h index fa107b35a7..990dd55692 100644 --- a/AK/NonnullRefPtr.h +++ b/AK/NonnullRefPtr.h @@ -8,14 +8,11 @@ #define NONNULLREFPTR_SCRUB_BYTE 0xe1 -#ifdef KERNEL -# include -#else -# include -# include -# include -# include -# include +#include +#include +#include +#include +#include namespace AK { @@ -98,9 +95,9 @@ public: { unref_if_not_null(m_ptr); m_ptr = nullptr; -# ifdef SANITIZE_PTRS +#ifdef SANITIZE_PTRS m_ptr = reinterpret_cast(explode_byte(NONNULLREFPTR_SCRUB_BYTE)); -# endif +#endif } template @@ -163,7 +160,7 @@ public: { return as_nonnull_ptr(); } - ALWAYS_INLINE RETURNS_NONNULL const T* ptr() const + ALWAYS_INLINE RETURNS_NONNULL T const* ptr() const { return as_nonnull_ptr(); } @@ -172,7 +169,7 @@ public: { return as_nonnull_ptr(); } - ALWAYS_INLINE RETURNS_NONNULL const T* operator->() const + ALWAYS_INLINE RETURNS_NONNULL T const* operator->() const { return as_nonnull_ptr(); } @@ -181,7 +178,7 @@ public: { return *as_nonnull_ptr(); } - ALWAYS_INLINE const T& operator*() const + ALWAYS_INLINE T const& operator*() const { return *as_nonnull_ptr(); } @@ -190,7 +187,7 @@ public: { return as_nonnull_ptr(); } - ALWAYS_INLINE RETURNS_NONNULL operator const T*() const + ALWAYS_INLINE RETURNS_NONNULL operator T const*() const { return as_nonnull_ptr(); } @@ -199,7 +196,7 @@ public: { return *as_nonnull_ptr(); } - ALWAYS_INLINE operator const T&() const + ALWAYS_INLINE operator T const&() const { return *as_nonnull_ptr(); } @@ -245,10 +242,10 @@ inline NonnullRefPtr adopt_ref(T& object) } template -struct Formatter> : Formatter { +struct Formatter> : Formatter { ErrorOr format(FormatBuilder& builder, NonnullRefPtr const& value) { - return Formatter::format(builder, value.ptr()); + return Formatter::format(builder, value.ptr()); } }; @@ -275,7 +272,7 @@ inline NonnullRefPtr make_ref_counted(Args&&... args) template struct Traits> : public GenericTraits> { using PeekType = T*; - using ConstPeekType = const T*; + using ConstPeekType = T const*; static unsigned hash(NonnullRefPtr const& p) { return ptr_hash(p.ptr()); } static bool equals(NonnullRefPtr const& a, NonnullRefPtr const& b) { return a.ptr() == b.ptr(); } }; @@ -283,5 +280,3 @@ struct Traits> : public GenericTraits> { using AK::adopt_ref; using AK::make_ref_counted; using AK::NonnullRefPtr; - -#endif diff --git a/AK/RefPtr.h b/AK/RefPtr.h index 11e27a2c1c..9e06c900b9 100644 --- a/AK/RefPtr.h +++ b/AK/RefPtr.h @@ -8,18 +8,14 @@ #define REFPTR_SCRUB_BYTE 0xe0 -#ifdef KERNEL -# include -#else - -# include -# include -# include -# include -# include -# include -# include -# include +#include +#include +#include +#include +#include +#include +#include +#include namespace AK { @@ -104,9 +100,9 @@ public: ALWAYS_INLINE ~RefPtr() { clear(); -# ifdef SANITIZE_PTRS +#ifdef SANITIZE_PTRS m_ptr = reinterpret_cast(explode_byte(REFPTR_SCRUB_BYTE)); -# endif +#endif } template @@ -236,14 +232,14 @@ public: } ALWAYS_INLINE T* ptr() { return as_ptr(); } - ALWAYS_INLINE const T* ptr() const { return as_ptr(); } + ALWAYS_INLINE T const* ptr() const { return as_ptr(); } ALWAYS_INLINE T* operator->() { return as_nonnull_ptr(); } - ALWAYS_INLINE const T* operator->() const + ALWAYS_INLINE T const* operator->() const { return as_nonnull_ptr(); } @@ -253,12 +249,12 @@ public: return *as_nonnull_ptr(); } - ALWAYS_INLINE const T& operator*() const + ALWAYS_INLINE T const& operator*() const { return *as_nonnull_ptr(); } - ALWAYS_INLINE operator const T*() const { return as_ptr(); } + ALWAYS_INLINE operator T const*() const { return as_ptr(); } ALWAYS_INLINE operator T*() { return as_ptr(); } ALWAYS_INLINE operator bool() { return !is_null(); } @@ -282,8 +278,8 @@ public: template bool operator!=(NonnullRefPtr& other) { return as_ptr() != other.m_ptr; } - bool operator==(const T* other) const { return as_ptr() == other; } - bool operator!=(const T* other) const { return as_ptr() != other; } + bool operator==(T const* other) const { return as_ptr() == other; } + bool operator!=(T const* other) const { return as_ptr() != other; } bool operator==(T* other) { return as_ptr() == other; } bool operator!=(T* other) { return as_ptr() != other; } @@ -306,17 +302,17 @@ private: }; template -struct Formatter> : Formatter { +struct Formatter> : Formatter { ErrorOr format(FormatBuilder& builder, RefPtr const& value) { - return Formatter::format(builder, value.ptr()); + return Formatter::format(builder, value.ptr()); } }; template struct Traits> : public GenericTraits> { using PeekType = T*; - using ConstPeekType = const T*; + using ConstPeekType = T const*; static unsigned hash(RefPtr const& p) { return ptr_hash(p.ptr()); } static bool equals(RefPtr const& a, RefPtr const& b) { return a.ptr() == b.ptr(); } }; @@ -324,13 +320,13 @@ struct Traits> : public GenericTraits> { template inline NonnullRefPtr static_ptr_cast(NonnullRefPtr const& ptr) { - return NonnullRefPtr(static_cast(*ptr)); + return NonnullRefPtr(static_cast(*ptr)); } template inline RefPtr static_ptr_cast(RefPtr const& ptr) { - return RefPtr(static_cast(ptr.ptr())); + return RefPtr(static_cast(ptr.ptr())); } template @@ -375,5 +371,3 @@ using AK::adopt_ref_if_nonnull; using AK::RefPtr; using AK::static_ptr_cast; using AK::try_make_ref_counted; - -#endif diff --git a/AK/WeakPtr.h b/AK/WeakPtr.h index a6efeb8103..97fc920964 100644 --- a/AK/WeakPtr.h +++ b/AK/WeakPtr.h @@ -6,11 +6,7 @@ #pragma once -#ifdef KERNEL -# include -#else - -# include +#include namespace AK { @@ -185,4 +181,3 @@ WeakPtr make_weak_ptr_if_nonnull(T const* ptr) } using AK::WeakPtr; -#endif diff --git a/AK/Weakable.h b/AK/Weakable.h index af9469ca4e..4dd3d8d813 100644 --- a/AK/Weakable.h +++ b/AK/Weakable.h @@ -6,15 +6,12 @@ #pragma once -#ifdef KERNEL -# include -#else -# include -# include -# include -# include -# include -# include +#include +#include +#include +#include +#include +#include namespace AK { @@ -125,5 +122,3 @@ private: } using AK::Weakable; - -#endif diff --git a/Kernel/Arch/aarch64/Dummy.cpp b/Kernel/Arch/aarch64/Dummy.cpp index ec9a1b117e..3b02fde363 100644 --- a/Kernel/Arch/aarch64/Dummy.cpp +++ b/Kernel/Arch/aarch64/Dummy.cpp @@ -45,10 +45,10 @@ SpinlockProtected& Inode::all_instances() return s_all_instances; } -RefPtr Inode::shared_vmobject() const +LockRefPtr Inode::shared_vmobject() const { VERIFY_NOT_REACHED(); - return RefPtr(nullptr); + return LockRefPtr(nullptr); } void Inode::will_be_destroyed() diff --git a/Kernel/Arch/aarch64/InterruptManagement.cpp b/Kernel/Arch/aarch64/InterruptManagement.cpp index 500d90fda9..e3496893aa 100644 --- a/Kernel/Arch/aarch64/InterruptManagement.cpp +++ b/Kernel/Arch/aarch64/InterruptManagement.cpp @@ -42,12 +42,12 @@ u8 InterruptManagement::acquire_mapped_interrupt_number(u8 interrupt_number) return interrupt_number; } -Vector> const& InterruptManagement::controllers() +Vector> const& InterruptManagement::controllers() { return m_interrupt_controllers; } -RefPtr InterruptManagement::get_responsible_irq_controller(u8) +LockRefPtr InterruptManagement::get_responsible_irq_controller(u8) { // TODO: Support more interrupt controllers VERIFY(m_interrupt_controllers.size() == 1); diff --git a/Kernel/Arch/aarch64/InterruptManagement.h b/Kernel/Arch/aarch64/InterruptManagement.h index 775d8464b0..ecb8c39bd6 100644 --- a/Kernel/Arch/aarch64/InterruptManagement.h +++ b/Kernel/Arch/aarch64/InterruptManagement.h @@ -6,9 +6,9 @@ #pragma once -#include #include #include +#include namespace Kernel { @@ -20,14 +20,14 @@ public: static u8 acquire_mapped_interrupt_number(u8 original_irq); - Vector> const& controllers(); - RefPtr get_responsible_irq_controller(u8 interrupt_vector); + Vector> const& controllers(); + LockRefPtr get_responsible_irq_controller(u8 interrupt_vector); private: InterruptManagement() = default; void find_controllers(); - Vector> m_interrupt_controllers; + Vector> m_interrupt_controllers; }; } diff --git a/Kernel/Arch/aarch64/PageDirectory.cpp b/Kernel/Arch/aarch64/PageDirectory.cpp index 4f23a9dca1..7709fb9ec8 100644 --- a/Kernel/Arch/aarch64/PageDirectory.cpp +++ b/Kernel/Arch/aarch64/PageDirectory.cpp @@ -19,7 +19,7 @@ void PageDirectory::deregister_page_directory(PageDirectory*) VERIFY_NOT_REACHED(); } -RefPtr PageDirectory::find_current() +LockRefPtr PageDirectory::find_current() { VERIFY_NOT_REACHED(); return nullptr; diff --git a/Kernel/Arch/aarch64/init.cpp b/Kernel/Arch/aarch64/init.cpp index 0fc521342b..60edf6f204 100644 --- a/Kernel/Arch/aarch64/init.cpp +++ b/Kernel/Arch/aarch64/init.cpp @@ -107,7 +107,7 @@ extern "C" [[noreturn]] void init() auto& framebuffer = RPi::Framebuffer::the(); if (framebuffer.initialized()) { - g_boot_console = &try_make_ref_counted(framebuffer.gpu_buffer(), framebuffer.width(), framebuffer.width(), framebuffer.pitch()).value().leak_ref(); + g_boot_console = &try_make_lock_ref_counted(framebuffer.gpu_buffer(), framebuffer.width(), framebuffer.width(), framebuffer.pitch()).value().leak_ref(); draw_logo(); } dmesgln("Starting SerenityOS..."); diff --git a/Kernel/Arch/x86/InterruptManagement.h b/Kernel/Arch/x86/InterruptManagement.h index 0c3a2848e4..597bd3e4bc 100644 --- a/Kernel/Arch/x86/InterruptManagement.h +++ b/Kernel/Arch/x86/InterruptManagement.h @@ -9,12 +9,12 @@ #include #include #include -#include #include #include #include #include #include +#include namespace Kernel { @@ -52,8 +52,8 @@ public: virtual void switch_to_ioapic_mode(); bool smp_enabled() const { return m_smp_enabled; } - RefPtr get_responsible_irq_controller(u8 interrupt_vector); - RefPtr get_responsible_irq_controller(IRQControllerType controller_type, u8 interrupt_vector); + LockRefPtr get_responsible_irq_controller(u8 interrupt_vector); + LockRefPtr get_responsible_irq_controller(IRQControllerType controller_type, u8 interrupt_vector); Vector const& isa_overrides() const { return m_isa_interrupt_overrides; } @@ -71,7 +71,7 @@ private: PhysicalAddress search_for_madt(); void locate_apic_data(); bool m_smp_enabled { false }; - Vector> m_interrupt_controllers; + Vector> m_interrupt_controllers; Vector m_isa_interrupt_overrides; Vector m_pci_interrupt_overrides; PhysicalAddress m_madt; diff --git a/Kernel/Arch/x86/common/InterruptManagement.cpp b/Kernel/Arch/x86/common/InterruptManagement.cpp index 5a137c38e1..6d47dcfd2a 100644 --- a/Kernel/Arch/x86/common/InterruptManagement.cpp +++ b/Kernel/Arch/x86/common/InterruptManagement.cpp @@ -98,7 +98,7 @@ u8 InterruptManagement::get_irq_vector(u8 mapped_interrupt_vector) return mapped_interrupt_vector; } -RefPtr InterruptManagement::get_responsible_irq_controller(IRQControllerType controller_type, u8 interrupt_vector) +LockRefPtr InterruptManagement::get_responsible_irq_controller(IRQControllerType controller_type, u8 interrupt_vector) { for (auto& irq_controller : m_interrupt_controllers) { if (irq_controller->gsi_base() <= interrupt_vector && irq_controller->type() == controller_type) @@ -107,7 +107,7 @@ RefPtr InterruptManagement::get_responsible_irq_controller(IRQCon VERIFY_NOT_REACHED(); } -RefPtr InterruptManagement::get_responsible_irq_controller(u8 interrupt_vector) +LockRefPtr InterruptManagement::get_responsible_irq_controller(u8 interrupt_vector) { if (m_interrupt_controllers.size() == 1 && m_interrupt_controllers[0]->type() == IRQControllerType::i8259) { return m_interrupt_controllers[0]; @@ -143,7 +143,7 @@ UNMAP_AFTER_INIT void InterruptManagement::switch_to_pic_mode() dmesgln("Interrupts: Switch to Legacy PIC mode"); InterruptDisabler disabler; m_smp_enabled = false; - m_interrupt_controllers[0] = adopt_ref(*new PIC()); + m_interrupt_controllers[0] = adopt_lock_ref(*new PIC()); SpuriousInterruptHandler::initialize(7); SpuriousInterruptHandler::initialize(15); for (auto& irq_controller : m_interrupt_controllers) { @@ -204,7 +204,7 @@ UNMAP_AFTER_INIT void InterruptManagement::locate_apic_data() int irq_controller_count = 0; if (madt->flags & PCAT_COMPAT_FLAG) { - m_interrupt_controllers[0] = adopt_ref(*new PIC()); + m_interrupt_controllers[0] = adopt_lock_ref(*new PIC()); irq_controller_count++; } size_t entry_index = 0; @@ -216,7 +216,7 @@ UNMAP_AFTER_INIT void InterruptManagement::locate_apic_data() auto* ioapic_entry = (const ACPI::Structures::MADTEntries::IOAPIC*)madt_entry; dbgln("IOAPIC found @ MADT entry {}, MMIO Registers @ {}", entry_index, PhysicalAddress(ioapic_entry->ioapic_address)); m_interrupt_controllers.resize(1 + irq_controller_count); - m_interrupt_controllers[irq_controller_count] = adopt_ref(*new IOAPIC(PhysicalAddress(ioapic_entry->ioapic_address), ioapic_entry->gsi_base)); + m_interrupt_controllers[irq_controller_count] = adopt_lock_ref(*new IOAPIC(PhysicalAddress(ioapic_entry->ioapic_address), ioapic_entry->gsi_base)); irq_controller_count++; } if (madt_entry->type == (u8)ACPI::Structures::MADTEntryType::InterruptSourceOverride) { diff --git a/Kernel/Arch/x86/common/Interrupts.cpp b/Kernel/Arch/x86/common/Interrupts.cpp index 5a128532b7..e91de65693 100644 --- a/Kernel/Arch/x86/common/Interrupts.cpp +++ b/Kernel/Arch/x86/common/Interrupts.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include @@ -349,21 +350,21 @@ void page_fault_handler(TrapFrame* trap) constexpr FlatPtr nonnullrefptr_scrub_pattern = explode_byte(NONNULLREFPTR_SCRUB_BYTE); constexpr FlatPtr ownptr_scrub_pattern = explode_byte(OWNPTR_SCRUB_BYTE); constexpr FlatPtr nonnullownptr_scrub_pattern = explode_byte(NONNULLOWNPTR_SCRUB_BYTE); - constexpr FlatPtr threadsaferefptr_scrub_pattern = explode_byte(THREADSAFEREFPTR_SCRUB_BYTE); - constexpr FlatPtr threadsafenonnullrefptr_scrub_pattern = explode_byte(THREADSAFENONNULLREFPTR_SCRUB_BYTE); + constexpr FlatPtr lockrefptr_scrub_pattern = explode_byte(LOCKREFPTR_SCRUB_BYTE); + constexpr FlatPtr nonnulllockrefptr_scrub_pattern = explode_byte(NONNULLLOCKREFPTR_SCRUB_BYTE); if ((fault_address & 0xffff0000) == (refptr_scrub_pattern & 0xffff0000)) { - dbgln("Note: Address {} looks like it may be a recently destroyed RefPtr", VirtualAddress(fault_address)); + dbgln("Note: Address {} looks like it may be a recently destroyed LockRefPtr", VirtualAddress(fault_address)); } else if ((fault_address & 0xffff0000) == (nonnullrefptr_scrub_pattern & 0xffff0000)) { - dbgln("Note: Address {} looks like it may be a recently destroyed NonnullRefPtr", VirtualAddress(fault_address)); + dbgln("Note: Address {} looks like it may be a recently destroyed NonnullLockRefPtr", VirtualAddress(fault_address)); } else if ((fault_address & 0xffff0000) == (ownptr_scrub_pattern & 0xffff0000)) { dbgln("Note: Address {} looks like it may be a recently destroyed OwnPtr", VirtualAddress(fault_address)); } else if ((fault_address & 0xffff0000) == (nonnullownptr_scrub_pattern & 0xffff0000)) { dbgln("Note: Address {} looks like it may be a recently destroyed NonnullOwnPtr", VirtualAddress(fault_address)); - } else if ((fault_address & 0xffff0000) == (threadsaferefptr_scrub_pattern & 0xffff0000)) { - dbgln("Note: Address {} looks like it may be a recently destroyed ThreadSafeRefPtr", VirtualAddress(fault_address)); - } else if ((fault_address & 0xffff0000) == (threadsafenonnullrefptr_scrub_pattern & 0xffff0000)) { - dbgln("Note: Address {} looks like it may be a recently destroyed ThreadSafeNonnullRefPtr", VirtualAddress(fault_address)); + } else if ((fault_address & 0xffff0000) == (lockrefptr_scrub_pattern & 0xffff0000)) { + dbgln("Note: Address {} looks like it may be a recently destroyed LockRefPtr", VirtualAddress(fault_address)); + } else if ((fault_address & 0xffff0000) == (nonnulllockrefptr_scrub_pattern & 0xffff0000)) { + dbgln("Note: Address {} looks like it may be a recently destroyed NonnullLockRefPtr", VirtualAddress(fault_address)); } } diff --git a/Kernel/Arch/x86/common/PageDirectory.cpp b/Kernel/Arch/x86/common/PageDirectory.cpp index 4b93dfce53..80824cbf7d 100644 --- a/Kernel/Arch/x86/common/PageDirectory.cpp +++ b/Kernel/Arch/x86/common/PageDirectory.cpp @@ -30,7 +30,7 @@ void PageDirectory::deregister_page_directory(PageDirectory* directory) cr3_map().remove(directory->cr3()); } -RefPtr PageDirectory::find_current() +LockRefPtr PageDirectory::find_current() { SpinlockLocker lock(s_mm_lock); return cr3_map().find(read_cr3()); diff --git a/Kernel/Bus/USB/UHCI/UHCIController.cpp b/Kernel/Bus/USB/UHCI/UHCIController.cpp index 7fa405f000..b8b9062f80 100644 --- a/Kernel/Bus/USB/UHCI/UHCIController.cpp +++ b/Kernel/Bus/USB/UHCI/UHCIController.cpp @@ -62,10 +62,10 @@ static constexpr u16 UHCI_PORTSC_NON_WRITE_CLEAR_BIT_MASK = 0x1FF5; // This is u static constexpr u8 UHCI_NUMBER_OF_ISOCHRONOUS_TDS = 128; static constexpr u16 UHCI_NUMBER_OF_FRAMES = 1024; -ErrorOr> UHCIController::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier) +ErrorOr> UHCIController::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier) { // NOTE: This assumes that address is pointing to a valid UHCI controller. - auto controller = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) UHCIController(pci_device_identifier))); + auto controller = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) UHCIController(pci_device_identifier))); TRY(controller->initialize()); return controller; } @@ -510,7 +510,7 @@ size_t UHCIController::poll_transfer_queue(QueueHead& transfer_queue) ErrorOr UHCIController::spawn_port_process() { - RefPtr usb_hotplug_thread; + LockRefPtr usb_hotplug_thread; (void)Process::create_kernel_process(usb_hotplug_thread, TRY(KString::try_create("UHCI Hot Plug Task"sv)), [&] { for (;;) { if (m_root_hub) diff --git a/Kernel/Bus/USB/UHCI/UHCIController.h b/Kernel/Bus/USB/UHCI/UHCIController.h index a0d2dec5c6..7735bf4e53 100644 --- a/Kernel/Bus/USB/UHCI/UHCIController.h +++ b/Kernel/Bus/USB/UHCI/UHCIController.h @@ -33,7 +33,7 @@ class UHCIController final public: static constexpr u8 NUMBER_OF_ROOT_PORTS = 2; - static ErrorOr> try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier); + static ErrorOr> try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier); virtual ~UHCIController() override; virtual StringView purpose() const override { return "UHCI"sv; } diff --git a/Kernel/Bus/USB/UHCI/UHCIRootHub.cpp b/Kernel/Bus/USB/UHCI/UHCIRootHub.cpp index 2f3632c178..222ca93e2b 100644 --- a/Kernel/Bus/USB/UHCI/UHCIRootHub.cpp +++ b/Kernel/Bus/USB/UHCI/UHCIRootHub.cpp @@ -83,12 +83,12 @@ static USBHubDescriptor uhci_root_hub_hub_descriptor = { 0x0, // Self-powered }; -ErrorOr> UHCIRootHub::try_create(NonnullRefPtr uhci_controller) +ErrorOr> UHCIRootHub::try_create(NonnullLockRefPtr uhci_controller) { return adopt_nonnull_own_or_enomem(new (nothrow) UHCIRootHub(move(uhci_controller))); } -UHCIRootHub::UHCIRootHub(NonnullRefPtr uhci_controller) +UHCIRootHub::UHCIRootHub(NonnullLockRefPtr uhci_controller) : m_uhci_controller(move(uhci_controller)) { } diff --git a/Kernel/Bus/USB/UHCI/UHCIRootHub.h b/Kernel/Bus/USB/UHCI/UHCIRootHub.h index bcfd8ba850..3bce1d54e9 100644 --- a/Kernel/Bus/USB/UHCI/UHCIRootHub.h +++ b/Kernel/Bus/USB/UHCI/UHCIRootHub.h @@ -8,9 +8,9 @@ #include #include -#include #include #include +#include namespace Kernel::USB { @@ -18,9 +18,9 @@ class UHCIController; class UHCIRootHub { public: - static ErrorOr> try_create(NonnullRefPtr); + static ErrorOr> try_create(NonnullLockRefPtr); - UHCIRootHub(NonnullRefPtr); + UHCIRootHub(NonnullLockRefPtr); ~UHCIRootHub() = default; ErrorOr setup(Badge); @@ -32,8 +32,8 @@ public: void check_for_port_updates() { m_hub->check_for_port_updates(); } private: - NonnullRefPtr m_uhci_controller; - RefPtr m_hub; + NonnullLockRefPtr m_uhci_controller; + LockRefPtr m_hub; }; } diff --git a/Kernel/Bus/USB/USBController.h b/Kernel/Bus/USB/USBController.h index 0f8c38dddb..47fc1d1d6d 100644 --- a/Kernel/Bus/USB/USBController.h +++ b/Kernel/Bus/USB/USBController.h @@ -31,7 +31,7 @@ public: private: u8 m_next_device_index { 1 }; - IntrusiveListNode> m_controller_list_node; + IntrusiveListNode> m_controller_list_node; public: using List = IntrusiveList<&USBController::m_controller_list_node>; diff --git a/Kernel/Bus/USB/USBDevice.cpp b/Kernel/Bus/USB/USBDevice.cpp index 1aa049dd50..955da88ae7 100644 --- a/Kernel/Bus/USB/USBDevice.cpp +++ b/Kernel/Bus/USB/USBDevice.cpp @@ -16,10 +16,10 @@ namespace Kernel::USB { -ErrorOr> Device::try_create(USBController const& controller, u8 port, DeviceSpeed speed) +ErrorOr> Device::try_create(USBController const& controller, u8 port, DeviceSpeed speed) { auto pipe = TRY(Pipe::try_create_pipe(controller, Pipe::Type::Control, Pipe::Direction::Bidirectional, 0, 8, 0)); - auto device = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) Device(controller, port, speed, move(pipe)))); + auto device = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) Device(controller, port, speed, move(pipe)))); auto sysfs_node = TRY(SysFSUSBDeviceInformation::create(*device)); device->m_sysfs_device_info_node = move(sysfs_node); TRY(device->enumerate_device()); @@ -35,7 +35,7 @@ Device::Device(USBController const& controller, u8 port, DeviceSpeed speed, Nonn { } -Device::Device(NonnullRefPtr controller, u8 address, u8 port, DeviceSpeed speed, NonnullOwnPtr default_pipe) +Device::Device(NonnullLockRefPtr controller, u8 address, u8 port, DeviceSpeed speed, NonnullOwnPtr default_pipe) : m_device_port(port) , m_device_speed(speed) , m_address(address) diff --git a/Kernel/Bus/USB/USBDevice.h b/Kernel/Bus/USB/USBDevice.h index f74c3316b4..0eb5b20718 100644 --- a/Kernel/Bus/USB/USBDevice.h +++ b/Kernel/Bus/USB/USBDevice.h @@ -34,7 +34,7 @@ public: LowSpeed }; - static ErrorOr> try_create(USBController const&, u8, DeviceSpeed); + static ErrorOr> try_create(USBController const&, u8, DeviceSpeed); Device(USBController const&, u8, DeviceSpeed, NonnullOwnPtr default_pipe); Device(Device const& device, NonnullOwnPtr default_pipe); @@ -59,7 +59,7 @@ public: SysFSUSBDeviceInformation& sysfs_device_info_node(Badge) { return *m_sysfs_device_info_node; } protected: - Device(NonnullRefPtr controller, u8 address, u8 port, DeviceSpeed speed, NonnullOwnPtr default_pipe); + Device(NonnullLockRefPtr controller, u8 address, u8 port, DeviceSpeed speed, NonnullOwnPtr default_pipe); u8 m_device_port { 0 }; // What port is this device attached to. NOTE: This is 1-based. DeviceSpeed m_device_speed; // What speed is this device running at @@ -71,14 +71,14 @@ protected: USBDeviceDescriptor m_device_descriptor {}; // Device Descriptor obtained from USB Device Vector m_configurations; // Configurations for this device - NonnullRefPtr m_controller; + NonnullLockRefPtr m_controller; NonnullOwnPtr m_default_pipe; // Default communication pipe (endpoint0) used during enumeration private: - IntrusiveListNode> m_hub_child_node; + IntrusiveListNode> m_hub_child_node; protected: - RefPtr m_sysfs_device_info_node; + LockRefPtr m_sysfs_device_info_node; public: using List = IntrusiveList<&Device::m_hub_child_node>; diff --git a/Kernel/Bus/USB/USBHub.cpp b/Kernel/Bus/USB/USBHub.cpp index 8c0bf5e701..1a7e19e4e2 100644 --- a/Kernel/Bus/USB/USBHub.cpp +++ b/Kernel/Bus/USB/USBHub.cpp @@ -14,23 +14,23 @@ namespace Kernel::USB { -ErrorOr> Hub::try_create_root_hub(NonnullRefPtr controller, DeviceSpeed device_speed) +ErrorOr> Hub::try_create_root_hub(NonnullLockRefPtr controller, DeviceSpeed device_speed) { // NOTE: Enumeration does not happen here, as the controller must know what the device address is at all times during enumeration to intercept requests. auto pipe = TRY(Pipe::try_create_pipe(controller, Pipe::Type::Control, Pipe::Direction::Bidirectional, 0, 8, 0)); - auto hub = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) Hub(controller, device_speed, move(pipe)))); + auto hub = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) Hub(controller, device_speed, move(pipe)))); return hub; } -ErrorOr> Hub::try_create_from_device(Device const& device) +ErrorOr> Hub::try_create_from_device(Device const& device) { auto pipe = TRY(Pipe::try_create_pipe(device.controller(), Pipe::Type::Control, Pipe::Direction::Bidirectional, 0, device.device_descriptor().max_packet_size, device.address())); - auto hub = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) Hub(device, move(pipe)))); + auto hub = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) Hub(device, move(pipe)))); TRY(hub->enumerate_and_power_on_hub()); return hub; } -Hub::Hub(NonnullRefPtr controller, DeviceSpeed device_speed, NonnullOwnPtr default_pipe) +Hub::Hub(NonnullLockRefPtr controller, DeviceSpeed device_speed, NonnullOwnPtr default_pipe) : Device(move(controller), 1 /* Port 1 */, device_speed, move(default_pipe)) { } @@ -266,7 +266,7 @@ void Hub::check_for_port_updates() } else { dbgln("USB Hub: Device detached on port {}!", port_number); - RefPtr device_to_remove = nullptr; + LockRefPtr device_to_remove = nullptr; for (auto& child : m_children) { if (port_number == child.port()) { device_to_remove = &child; diff --git a/Kernel/Bus/USB/USBHub.h b/Kernel/Bus/USB/USBHub.h index d4b7de4e44..aaefe513d4 100644 --- a/Kernel/Bus/USB/USBHub.h +++ b/Kernel/Bus/USB/USBHub.h @@ -79,8 +79,8 @@ static constexpr u16 PORT_STATUS_RESET_CHANGED = (1 << 4); class Hub : public Device { public: - static ErrorOr> try_create_root_hub(NonnullRefPtr, DeviceSpeed); - static ErrorOr> try_create_from_device(Device const&); + static ErrorOr> try_create_root_hub(NonnullLockRefPtr, DeviceSpeed); + static ErrorOr> try_create_from_device(Device const&); virtual ~Hub() override = default; @@ -96,7 +96,7 @@ public: private: // Root Hub constructor - Hub(NonnullRefPtr, DeviceSpeed, NonnullOwnPtr default_pipe); + Hub(NonnullLockRefPtr, DeviceSpeed, NonnullOwnPtr default_pipe); Hub(Device const&, NonnullOwnPtr default_pipe); diff --git a/Kernel/Bus/USB/USBManagement.h b/Kernel/Bus/USB/USBManagement.h index b275facc8e..9d8da80afe 100644 --- a/Kernel/Bus/USB/USBManagement.h +++ b/Kernel/Bus/USB/USBManagement.h @@ -6,9 +6,9 @@ #pragma once -#include -#include #include +#include +#include namespace Kernel::USB { diff --git a/Kernel/Bus/USB/USBPipe.h b/Kernel/Bus/USB/USBPipe.h index eb01d34177..a91de384ab 100644 --- a/Kernel/Bus/USB/USBPipe.h +++ b/Kernel/Bus/USB/USBPipe.h @@ -67,7 +67,7 @@ public: private: friend class Device; - NonnullRefPtr m_controller; + NonnullLockRefPtr m_controller; Type m_type; Direction m_direction; diff --git a/Kernel/Bus/USB/USBTransfer.cpp b/Kernel/Bus/USB/USBTransfer.cpp index 4f489389f2..e3a0e75d3b 100644 --- a/Kernel/Bus/USB/USBTransfer.cpp +++ b/Kernel/Bus/USB/USBTransfer.cpp @@ -9,9 +9,9 @@ namespace Kernel::USB { -ErrorOr> Transfer::try_create(Pipe& pipe, u16 length, Memory::Region& dma_buffer) +ErrorOr> Transfer::try_create(Pipe& pipe, u16 length, Memory::Region& dma_buffer) { - return adopt_nonnull_ref_or_enomem(new (nothrow) Transfer(pipe, length, dma_buffer)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) Transfer(pipe, length, dma_buffer)); } Transfer::Transfer(Pipe& pipe, u16 len, Memory::Region& dma_buffer) diff --git a/Kernel/Bus/USB/USBTransfer.h b/Kernel/Bus/USB/USBTransfer.h index 92fa48e1af..5923542d6c 100644 --- a/Kernel/Bus/USB/USBTransfer.h +++ b/Kernel/Bus/USB/USBTransfer.h @@ -8,9 +8,9 @@ #include #include -#include #include #include +#include #include #include #include @@ -20,7 +20,7 @@ namespace Kernel::USB { class Transfer final : public AtomicRefCounted { public: - static ErrorOr> try_create(Pipe&, u16 length, Memory::Region& dma_buffer); + static ErrorOr> try_create(Pipe&, u16 length, Memory::Region& dma_buffer); Transfer() = delete; ~Transfer(); diff --git a/Kernel/Bus/VirtIO/Console.cpp b/Kernel/Bus/VirtIO/Console.cpp index cc20d43bef..8b8818de76 100644 --- a/Kernel/Bus/VirtIO/Console.cpp +++ b/Kernel/Bus/VirtIO/Console.cpp @@ -14,9 +14,9 @@ namespace Kernel::VirtIO { unsigned Console::next_device_id = 0; -UNMAP_AFTER_INIT NonnullRefPtr Console::must_create(PCI::DeviceIdentifier const& pci_device_identifier) +UNMAP_AFTER_INIT NonnullLockRefPtr Console::must_create(PCI::DeviceIdentifier const& pci_device_identifier) { - return adopt_ref_if_nonnull(new Console(pci_device_identifier)).release_nonnull(); + return adopt_lock_ref_if_nonnull(new Console(pci_device_identifier)).release_nonnull(); } UNMAP_AFTER_INIT void Console::initialize() diff --git a/Kernel/Bus/VirtIO/Console.h b/Kernel/Bus/VirtIO/Console.h index 2fd1203ffe..9694fa0a3c 100644 --- a/Kernel/Bus/VirtIO/Console.h +++ b/Kernel/Bus/VirtIO/Console.h @@ -18,7 +18,7 @@ class Console friend VirtIO::ConsolePort; public: - static NonnullRefPtr must_create(PCI::DeviceIdentifier const&); + static NonnullLockRefPtr must_create(PCI::DeviceIdentifier const&); virtual ~Console() override = default; virtual StringView purpose() const override { return class_name(); } @@ -64,7 +64,7 @@ private: virtual bool handle_device_config_change() override; virtual void handle_queue_update(u16 queue_index) override; - Vector> m_ports; + Vector> m_ports; void setup_multiport(); void process_control_message(ControlMessage message); void write_control_message(ControlMessage message); diff --git a/Kernel/Bus/VirtIO/ConsolePort.cpp b/Kernel/Bus/VirtIO/ConsolePort.cpp index 1908f117af..0676a7a8b8 100644 --- a/Kernel/Bus/VirtIO/ConsolePort.cpp +++ b/Kernel/Bus/VirtIO/ConsolePort.cpp @@ -12,11 +12,11 @@ namespace Kernel::VirtIO { unsigned ConsolePort::next_device_id = 0; -ErrorOr> ConsolePort::try_create(unsigned port, Console& console) +ErrorOr> ConsolePort::try_create(unsigned port, Console& console) { auto receive_buffer = TRY(Memory::RingBuffer::try_create("VirtIO::ConsolePort Receive"sv, RINGBUFFER_SIZE)); auto transmit_buffer = TRY(Memory::RingBuffer::try_create("VirtIO::ConsolePort Transmit"sv, RINGBUFFER_SIZE)); - return adopt_nonnull_ref_or_enomem(new (nothrow) ConsolePort(port, console, move(receive_buffer), move(transmit_buffer))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ConsolePort(port, console, move(receive_buffer), move(transmit_buffer))); } ConsolePort::ConsolePort(unsigned port, VirtIO::Console& console, NonnullOwnPtr receive_buffer, NonnullOwnPtr transmit_buffer) @@ -161,7 +161,7 @@ ErrorOr ConsolePort::write(OpenFileDescription& desc, u64, UserOrKernelB return total_bytes_copied; } -ErrorOr> ConsolePort::open(int options) +ErrorOr> ConsolePort::open(int options) { if (!m_open) m_console.send_open_control_message(m_port, true); diff --git a/Kernel/Bus/VirtIO/ConsolePort.h b/Kernel/Bus/VirtIO/ConsolePort.h index f5c9088ced..b738eb82cc 100644 --- a/Kernel/Bus/VirtIO/ConsolePort.h +++ b/Kernel/Bus/VirtIO/ConsolePort.h @@ -24,7 +24,7 @@ class Console; class ConsolePort : public CharacterDevice { public: - static ErrorOr> try_create(unsigned port, VirtIO::Console&); + static ErrorOr> try_create(unsigned port, VirtIO::Console&); void handle_queue_update(Badge, u16 queue_index); @@ -44,7 +44,7 @@ private: virtual ErrorOr read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override; virtual bool can_write(OpenFileDescription const&, u64) const override; virtual ErrorOr write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override; - virtual ErrorOr> open(int options) override; + virtual ErrorOr> open(int options) override; static unsigned next_device_id; u16 m_receive_queue {}; diff --git a/Kernel/Bus/VirtIO/RNG.cpp b/Kernel/Bus/VirtIO/RNG.cpp index 8bcae54b25..0f19be3497 100644 --- a/Kernel/Bus/VirtIO/RNG.cpp +++ b/Kernel/Bus/VirtIO/RNG.cpp @@ -9,9 +9,9 @@ namespace Kernel::VirtIO { -UNMAP_AFTER_INIT NonnullRefPtr RNG::must_create(PCI::DeviceIdentifier const& device_identifier) +UNMAP_AFTER_INIT NonnullLockRefPtr RNG::must_create(PCI::DeviceIdentifier const& device_identifier) { - return adopt_ref_if_nonnull(new RNG(device_identifier)).release_nonnull(); + return adopt_lock_ref_if_nonnull(new RNG(device_identifier)).release_nonnull(); } UNMAP_AFTER_INIT void RNG::initialize() diff --git a/Kernel/Bus/VirtIO/RNG.h b/Kernel/Bus/VirtIO/RNG.h index f7c1d35c8f..f7ddef9b83 100644 --- a/Kernel/Bus/VirtIO/RNG.h +++ b/Kernel/Bus/VirtIO/RNG.h @@ -19,7 +19,7 @@ class RNG final : public AtomicRefCounted , public VirtIO::Device { public: - static NonnullRefPtr must_create(PCI::DeviceIdentifier const&); + static NonnullLockRefPtr must_create(PCI::DeviceIdentifier const&); virtual StringView purpose() const override { return class_name(); } virtual ~RNG() override = default; diff --git a/Kernel/Coredump.cpp b/Kernel/Coredump.cpp index f245578473..0cee94ba20 100644 --- a/Kernel/Coredump.cpp +++ b/Kernel/Coredump.cpp @@ -30,7 +30,7 @@ namespace Kernel { return region.name().starts_with("LibJS:"sv) || region.name().starts_with("malloc:"sv); } -ErrorOr> Coredump::try_create(NonnullRefPtr process, StringView output_path) +ErrorOr> Coredump::try_create(NonnullLockRefPtr process, StringView output_path) { if (!process->is_dumpable()) { dbgln("Refusing to generate coredump for non-dumpable process {}", process->pid().value()); @@ -41,7 +41,7 @@ ErrorOr> Coredump::try_create(NonnullRefPtr pro return adopt_nonnull_own_or_enomem(new (nothrow) Coredump(move(process), move(description))); } -Coredump::Coredump(NonnullRefPtr process, NonnullRefPtr description) +Coredump::Coredump(NonnullLockRefPtr process, NonnullLockRefPtr description) : m_process(move(process)) , m_description(move(description)) { @@ -59,7 +59,7 @@ Coredump::Coredump(NonnullRefPtr process, NonnullRefPtr> Coredump::try_create_target_file(Process const& process, StringView output_path) +ErrorOr> Coredump::try_create_target_file(Process const& process, StringView output_path) { auto output_directory = KLexicalPath::dirname(output_path); auto dump_directory = TRY(VirtualFileSystem::the().open_directory(output_directory, VirtualFileSystem::the().root_custody())); diff --git a/Kernel/Coredump.h b/Kernel/Coredump.h index 3be53ffe0a..fa1c66d98c 100644 --- a/Kernel/Coredump.h +++ b/Kernel/Coredump.h @@ -7,22 +7,22 @@ #pragma once -#include #include #include +#include namespace Kernel { class Coredump { public: - static ErrorOr> try_create(NonnullRefPtr, StringView output_path); + static ErrorOr> try_create(NonnullLockRefPtr, StringView output_path); ~Coredump() = default; ErrorOr write(); private: - Coredump(NonnullRefPtr, NonnullRefPtr); - static ErrorOr> try_create_target_file(Process const&, StringView output_path); + Coredump(NonnullLockRefPtr, NonnullLockRefPtr); + static ErrorOr> try_create_target_file(Process const&, StringView output_path); ErrorOr write_elf_header(); ErrorOr write_program_headers(size_t notes_size); @@ -35,8 +35,8 @@ private: ErrorOr create_notes_regions_data(auto&) const; ErrorOr create_notes_metadata_data(auto&) const; - NonnullRefPtr m_process; - NonnullRefPtr m_description; + NonnullLockRefPtr m_process; + NonnullLockRefPtr m_description; size_t m_num_program_headers { 0 }; }; diff --git a/Kernel/Devices/AsyncDeviceRequest.cpp b/Kernel/Devices/AsyncDeviceRequest.cpp index 89f699d04d..2a70a28b28 100644 --- a/Kernel/Devices/AsyncDeviceRequest.cpp +++ b/Kernel/Devices/AsyncDeviceRequest.cpp @@ -67,7 +67,7 @@ auto AsyncDeviceRequest::get_request_result() const -> RequestResult return m_result; } -void AsyncDeviceRequest::add_sub_request(NonnullRefPtr sub_request) +void AsyncDeviceRequest::add_sub_request(NonnullLockRefPtr sub_request) { // Sub-requests cannot be for the same device VERIFY(&m_device != &sub_request->m_device); diff --git a/Kernel/Devices/AsyncDeviceRequest.h b/Kernel/Devices/AsyncDeviceRequest.h index c42f36189a..79c94f2e86 100644 --- a/Kernel/Devices/AsyncDeviceRequest.h +++ b/Kernel/Devices/AsyncDeviceRequest.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include #include #include @@ -58,7 +58,7 @@ public: virtual StringView name() const = 0; virtual void start() = 0; - void add_sub_request(NonnullRefPtr); + void add_sub_request(NonnullLockRefPtr); [[nodiscard]] RequestWaitResult wait(Time* = nullptr); @@ -142,14 +142,14 @@ private: AsyncDeviceRequest* m_parent_request { nullptr }; RequestResult m_result { Pending }; - IntrusiveListNode> m_list_node; + IntrusiveListNode> m_list_node; using AsyncDeviceSubRequestList = IntrusiveList<&AsyncDeviceRequest::m_list_node>; AsyncDeviceSubRequestList m_sub_requests_pending; AsyncDeviceSubRequestList m_sub_requests_complete; WaitQueue m_queue; - NonnullRefPtr m_process; + NonnullLockRefPtr m_process; void* m_private { nullptr }; mutable Spinlock m_lock { LockRank::None }; }; diff --git a/Kernel/Devices/Audio/AC97.cpp b/Kernel/Devices/Audio/AC97.cpp index 85c5dda52b..bf617e000c 100644 --- a/Kernel/Devices/Audio/AC97.cpp +++ b/Kernel/Devices/Audio/AC97.cpp @@ -20,9 +20,9 @@ static constexpr u16 pcm_fixed_sample_rate = 48000; static constexpr u16 pcm_sample_rate_minimum = 8000; static constexpr u16 pcm_sample_rate_maximum = 48000; -UNMAP_AFTER_INIT ErrorOr> AC97::try_create(PCI::DeviceIdentifier const& pci_device_identifier) +UNMAP_AFTER_INIT ErrorOr> AC97::try_create(PCI::DeviceIdentifier const& pci_device_identifier) { - auto ac97 = adopt_nonnull_ref_or_enomem(new (nothrow) AC97(pci_device_identifier)); + auto ac97 = adopt_nonnull_lock_ref_or_enomem(new (nothrow) AC97(pci_device_identifier)); if (!ac97.is_error()) TRY(ac97.value()->initialize()); return ac97; @@ -166,7 +166,7 @@ void AC97::set_pcm_output_volume(u8 left_channel, u8 right_channel, Muted mute) m_io_mixer_base.offset(NativeAudioMixerRegister::SetPCMOutputVolume).out(volume_value); } -RefPtr AC97::audio_channel(u32 index) const +LockRefPtr AC97::audio_channel(u32 index) const { if (index == 0) return m_audio_channel; diff --git a/Kernel/Devices/Audio/AC97.h b/Kernel/Devices/Audio/AC97.h index f904d5b72c..31655ecd45 100644 --- a/Kernel/Devices/Audio/AC97.h +++ b/Kernel/Devices/Audio/AC97.h @@ -26,7 +26,7 @@ class AC97 final , public IRQHandler { public: - static ErrorOr> try_create(PCI::DeviceIdentifier const&); + static ErrorOr> try_create(PCI::DeviceIdentifier const&); virtual ~AC97() override; @@ -161,7 +161,7 @@ private: ErrorOr write_single_buffer(UserOrKernelBuffer const&, size_t, size_t); // ^AudioController - virtual RefPtr audio_channel(u32 index) const override; + virtual LockRefPtr audio_channel(u32 index) const override; virtual ErrorOr write(size_t channel_index, UserOrKernelBuffer const& data, size_t length) override; virtual void detect_hardware_audio_channels(Badge) override; virtual ErrorOr set_pcm_output_sample_rate(size_t channel_index, u32 samples_per_second_rate) override; @@ -180,7 +180,7 @@ private: AC97Channel m_pcm_out_channel; u32 m_sample_rate { 0 }; bool m_variable_rate_pcm_supported { false }; - RefPtr m_audio_channel; + LockRefPtr m_audio_channel; }; } diff --git a/Kernel/Devices/Audio/Channel.cpp b/Kernel/Devices/Audio/Channel.cpp index a0585b4759..729170df74 100644 --- a/Kernel/Devices/Audio/Channel.cpp +++ b/Kernel/Devices/Audio/Channel.cpp @@ -13,7 +13,7 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr AudioChannel::must_create(AudioController const& controller, size_t channel_index) +UNMAP_AFTER_INIT NonnullLockRefPtr AudioChannel::must_create(AudioController const& controller, size_t channel_index) { auto audio_device_or_error = DeviceManagement::try_create_device(controller, channel_index); // FIXME: Find a way to propagate errors diff --git a/Kernel/Devices/Audio/Channel.h b/Kernel/Devices/Audio/Channel.h index 6ef85eee72..7106bd9ae2 100644 --- a/Kernel/Devices/Audio/Channel.h +++ b/Kernel/Devices/Audio/Channel.h @@ -20,7 +20,7 @@ class AudioChannel final friend class DeviceManagement; public: - static NonnullRefPtr must_create(AudioController const&, size_t channel_index); + static NonnullLockRefPtr must_create(AudioController const&, size_t channel_index); virtual ~AudioChannel() override = default; // ^CharacterDevice @@ -37,7 +37,7 @@ private: // ^CharacterDevice virtual StringView class_name() const override { return "AudioChannel"sv; } - WeakPtr m_controller; + LockWeakPtr m_controller; const size_t m_channel_index; }; } diff --git a/Kernel/Devices/Audio/Controller.h b/Kernel/Devices/Audio/Controller.h index a8aecd84c9..64782d138b 100644 --- a/Kernel/Devices/Audio/Controller.h +++ b/Kernel/Devices/Audio/Controller.h @@ -8,12 +8,12 @@ #include #include -#include -#include #include #include #include #include +#include +#include #include #include #include @@ -24,13 +24,13 @@ namespace Kernel { class AudioManagement; class AudioController : public AtomicRefCounted - , public Weakable { + , public LockWeakable { friend class AudioManagement; public: virtual ~AudioController() = default; - virtual RefPtr audio_channel(u32 index) const = 0; + virtual LockRefPtr audio_channel(u32 index) const = 0; virtual ErrorOr write(size_t channel_index, UserOrKernelBuffer const& data, size_t length) = 0; virtual void detect_hardware_audio_channels(Badge) = 0; @@ -40,6 +40,6 @@ public: virtual ErrorOr get_pcm_output_sample_rate(size_t channel_index) = 0; private: - IntrusiveListNode> m_node; + IntrusiveListNode> m_node; }; } diff --git a/Kernel/Devices/Audio/Management.h b/Kernel/Devices/Audio/Management.h index 9294fa881c..2ad0f3b4cc 100644 --- a/Kernel/Devices/Audio/Management.h +++ b/Kernel/Devices/Audio/Management.h @@ -10,10 +10,10 @@ #include #include #include -#include #include #include #include +#include namespace Kernel { diff --git a/Kernel/Devices/BlockDevice.h b/Kernel/Devices/BlockDevice.h index 71f40bc7ab..679e26cf17 100644 --- a/Kernel/Devices/BlockDevice.h +++ b/Kernel/Devices/BlockDevice.h @@ -7,8 +7,8 @@ #pragma once #include -#include #include +#include namespace Kernel { diff --git a/Kernel/Devices/ConsoleDevice.cpp b/Kernel/Devices/ConsoleDevice.cpp index 228c7aba91..5e59705a45 100644 --- a/Kernel/Devices/ConsoleDevice.cpp +++ b/Kernel/Devices/ConsoleDevice.cpp @@ -16,7 +16,7 @@ static Kernel::Spinlock g_console_lock { LockRank::None }; -UNMAP_AFTER_INIT NonnullRefPtr ConsoleDevice::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ConsoleDevice::must_create() { auto device_or_error = DeviceManagement::try_create_device(); VERIFY(!device_or_error.is_error()); diff --git a/Kernel/Devices/ConsoleDevice.h b/Kernel/Devices/ConsoleDevice.h index e0df08ca32..85243f2cea 100644 --- a/Kernel/Devices/ConsoleDevice.h +++ b/Kernel/Devices/ConsoleDevice.h @@ -16,7 +16,7 @@ class ConsoleDevice final : public CharacterDevice { friend class DeviceManagement; public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); virtual ~ConsoleDevice() override; diff --git a/Kernel/Devices/Device.h b/Kernel/Devices/Device.h index 3c143f4c24..39c921d3e6 100644 --- a/Kernel/Devices/Device.h +++ b/Kernel/Devices/Device.h @@ -18,13 +18,13 @@ #include #include #include -#include #include #include #include #include #include #include +#include #include namespace Kernel { @@ -53,9 +53,9 @@ public: void process_next_queued_request(Badge, AsyncDeviceRequest const&); template - ErrorOr> try_make_request(Args&&... args) + ErrorOr> try_make_request(Args&&... args) { - auto request = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) AsyncRequestType(*this, forward(args)...))); + auto request = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) AsyncRequestType(*this, forward(args)...))); SpinlockLocker lock(m_requests_lock); bool was_empty = m_requests.is_empty(); m_requests.append(request); @@ -89,15 +89,15 @@ private: State m_state { State::Normal }; Spinlock m_requests_lock { LockRank::None }; - DoublyLinkedList> m_requests; + DoublyLinkedList> m_requests; protected: // FIXME: This pointer will be eventually removed after all nodes in /sys/dev/block/ and // /sys/dev/char/ are symlinks. - RefPtr m_sysfs_component; + LockRefPtr m_sysfs_component; - RefPtr m_symlink_sysfs_component; - RefPtr m_sysfs_device_directory; + LockRefPtr m_symlink_sysfs_component; + LockRefPtr m_sysfs_device_directory; }; } diff --git a/Kernel/Devices/DeviceControlDevice.cpp b/Kernel/Devices/DeviceControlDevice.cpp index 0e5f4c5cf7..59f5f569f6 100644 --- a/Kernel/Devices/DeviceControlDevice.cpp +++ b/Kernel/Devices/DeviceControlDevice.cpp @@ -9,7 +9,7 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr DeviceControlDevice::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr DeviceControlDevice::must_create() { auto device_control_device_or_error = DeviceManagement::try_create_device(); // FIXME: Find a way to propagate errors diff --git a/Kernel/Devices/DeviceControlDevice.h b/Kernel/Devices/DeviceControlDevice.h index 5e86a73650..aa98f373dc 100644 --- a/Kernel/Devices/DeviceControlDevice.h +++ b/Kernel/Devices/DeviceControlDevice.h @@ -14,7 +14,7 @@ class DeviceControlDevice final : public CharacterDevice { friend class DeviceManagement; public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); virtual ~DeviceControlDevice() override; private: diff --git a/Kernel/Devices/DeviceManagement.h b/Kernel/Devices/DeviceManagement.h index d9146f95b4..d6627971b5 100644 --- a/Kernel/Devices/DeviceManagement.h +++ b/Kernel/Devices/DeviceManagement.h @@ -8,9 +8,7 @@ #include #include -#include #include -#include #include #include #include @@ -21,6 +19,8 @@ #include #include #include +#include +#include #include namespace Kernel { @@ -54,7 +54,7 @@ public: ConsoleDevice& console_device(); template - static inline ErrorOr> try_create_device(Args&&... args) requires(requires(Args... args) { DeviceType::try_create(args...); }) + static inline ErrorOr> try_create_device(Args&&... args) requires(requires(Args... args) { DeviceType::try_create(args...); }) { auto device = TRY(DeviceType::try_create(forward(args)...)); device->after_inserting(); @@ -62,17 +62,17 @@ public: } template - static inline ErrorOr> try_create_device(Args&&... args) + static inline ErrorOr> try_create_device(Args&&... args) { - auto device = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DeviceType(forward(args)...))); + auto device = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DeviceType(forward(args)...))); device->after_inserting(); return device; } private: - RefPtr m_null_device; - RefPtr m_console_device; - RefPtr m_device_control_device; + LockRefPtr m_null_device; + LockRefPtr m_console_device; + LockRefPtr m_device_control_device; // FIXME: Once we have a singleton for managing many sound cards, remove this from here SpinlockProtected> m_devices { LockRank::None }; diff --git a/Kernel/Devices/FullDevice.cpp b/Kernel/Devices/FullDevice.cpp index 1073c58800..c4062a3801 100644 --- a/Kernel/Devices/FullDevice.cpp +++ b/Kernel/Devices/FullDevice.cpp @@ -12,7 +12,7 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr FullDevice::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr FullDevice::must_create() { auto full_device_or_error = DeviceManagement::try_create_device(); // FIXME: Find a way to propagate errors diff --git a/Kernel/Devices/FullDevice.h b/Kernel/Devices/FullDevice.h index 8329d4f9fc..4f8df218f0 100644 --- a/Kernel/Devices/FullDevice.h +++ b/Kernel/Devices/FullDevice.h @@ -14,7 +14,7 @@ class FullDevice final : public CharacterDevice { friend class DeviceManagement; public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); virtual ~FullDevice() override; private: diff --git a/Kernel/Devices/HID/HIDManagement.h b/Kernel/Devices/HID/HIDManagement.h index 49d45f4d26..86f242945f 100644 --- a/Kernel/Devices/HID/HIDManagement.h +++ b/Kernel/Devices/HID/HIDManagement.h @@ -9,12 +9,12 @@ #include #include #include -#include -#include #include #include #include #include +#include +#include #include #include #include @@ -61,8 +61,8 @@ private: size_t m_mouse_minor_number { 0 }; size_t m_keyboard_minor_number { 0 }; KeyboardClient* m_client { nullptr }; - RefPtr m_i8042_controller; - NonnullRefPtrVector m_hid_devices; + LockRefPtr m_i8042_controller; + NonnullLockRefPtrVector m_hid_devices; Spinlock m_client_lock { LockRank::None }; }; diff --git a/Kernel/Devices/HID/I8042Controller.cpp b/Kernel/Devices/HID/I8042Controller.cpp index aeeb9edfa2..0b809f91c2 100644 --- a/Kernel/Devices/HID/I8042Controller.cpp +++ b/Kernel/Devices/HID/I8042Controller.cpp @@ -13,16 +13,16 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr I8042Controller::initialize() +UNMAP_AFTER_INIT NonnullLockRefPtr I8042Controller::initialize() { - return adopt_ref(*new I8042Controller()); + return adopt_lock_ref(*new I8042Controller()); } -RefPtr I8042Controller::mouse() const +LockRefPtr I8042Controller::mouse() const { return m_mouse_device; } -RefPtr I8042Controller::keyboard() const +LockRefPtr I8042Controller::keyboard() const { return m_keyboard_device; } diff --git a/Kernel/Devices/HID/I8042Controller.h b/Kernel/Devices/HID/I8042Controller.h index 65b8c35fbe..997cf4517d 100644 --- a/Kernel/Devices/HID/I8042Controller.h +++ b/Kernel/Devices/HID/I8042Controller.h @@ -77,7 +77,7 @@ protected: { } - NonnullRefPtr m_i8042_controller; + NonnullLockRefPtr m_i8042_controller; }; class PS2KeyboardDevice; @@ -88,7 +88,7 @@ class I8042Controller final : public AtomicRefCounted { friend class PS2MouseDevice; public: - static NonnullRefPtr initialize(); + static NonnullLockRefPtr initialize(); ErrorOr detect_devices(); @@ -132,8 +132,8 @@ public: bool irq_process_input_buffer(HIDDevice::Type); - RefPtr mouse() const; - RefPtr keyboard() const; + LockRefPtr mouse() const; + LockRefPtr keyboard() const; // Note: This function exists only for the initialization process of the controller bool check_existence_via_probing(Badge); @@ -157,8 +157,8 @@ private: bool m_first_port_available { false }; bool m_second_port_available { false }; bool m_is_dual_channel { false }; - RefPtr m_mouse_device; - RefPtr m_keyboard_device; + LockRefPtr m_mouse_device; + LockRefPtr m_keyboard_device; }; } diff --git a/Kernel/Devices/HID/PS2KeyboardDevice.cpp b/Kernel/Devices/HID/PS2KeyboardDevice.cpp index cbad9a434f..3cac1c7a9b 100644 --- a/Kernel/Devices/HID/PS2KeyboardDevice.cpp +++ b/Kernel/Devices/HID/PS2KeyboardDevice.cpp @@ -87,7 +87,7 @@ bool PS2KeyboardDevice::handle_irq(RegisterState const&) return m_i8042_controller->irq_process_input_buffer(HIDDevice::Type::Keyboard); } -UNMAP_AFTER_INIT ErrorOr> PS2KeyboardDevice::try_to_initialize(I8042Controller const& ps2_controller) +UNMAP_AFTER_INIT ErrorOr> PS2KeyboardDevice::try_to_initialize(I8042Controller const& ps2_controller) { auto keyboard_device = TRY(DeviceManagement::try_create_device(ps2_controller)); diff --git a/Kernel/Devices/HID/PS2KeyboardDevice.h b/Kernel/Devices/HID/PS2KeyboardDevice.h index 0bb1da70a6..24e9465eea 100644 --- a/Kernel/Devices/HID/PS2KeyboardDevice.h +++ b/Kernel/Devices/HID/PS2KeyboardDevice.h @@ -23,7 +23,7 @@ class PS2KeyboardDevice final : public IRQHandler friend class DeviceManagement; public: - static ErrorOr> try_to_initialize(I8042Controller const&); + static ErrorOr> try_to_initialize(I8042Controller const&); virtual ~PS2KeyboardDevice() override; ErrorOr initialize(); diff --git a/Kernel/Devices/HID/PS2MouseDevice.cpp b/Kernel/Devices/HID/PS2MouseDevice.cpp index a84c3877b8..819e99b191 100644 --- a/Kernel/Devices/HID/PS2MouseDevice.cpp +++ b/Kernel/Devices/HID/PS2MouseDevice.cpp @@ -175,7 +175,7 @@ ErrorOr PS2MouseDevice::set_sample_rate(u8 rate) return {}; } -UNMAP_AFTER_INIT ErrorOr> PS2MouseDevice::try_to_initialize(I8042Controller const& ps2_controller) +UNMAP_AFTER_INIT ErrorOr> PS2MouseDevice::try_to_initialize(I8042Controller const& ps2_controller) { auto mouse_device = TRY(DeviceManagement::try_create_device(ps2_controller)); TRY(mouse_device->initialize()); diff --git a/Kernel/Devices/HID/PS2MouseDevice.h b/Kernel/Devices/HID/PS2MouseDevice.h index bac8c127b6..773d58bd4e 100644 --- a/Kernel/Devices/HID/PS2MouseDevice.h +++ b/Kernel/Devices/HID/PS2MouseDevice.h @@ -20,7 +20,7 @@ class PS2MouseDevice : public IRQHandler friend class DeviceManagement; public: - static ErrorOr> try_to_initialize(I8042Controller const&); + static ErrorOr> try_to_initialize(I8042Controller const&); ErrorOr initialize(); virtual ~PS2MouseDevice() override; diff --git a/Kernel/Devices/HID/VMWareMouseDevice.cpp b/Kernel/Devices/HID/VMWareMouseDevice.cpp index 9a02c12a97..6eda47a6ed 100644 --- a/Kernel/Devices/HID/VMWareMouseDevice.cpp +++ b/Kernel/Devices/HID/VMWareMouseDevice.cpp @@ -11,7 +11,7 @@ namespace Kernel { -UNMAP_AFTER_INIT ErrorOr> VMWareMouseDevice::try_to_initialize(I8042Controller const& ps2_controller) +UNMAP_AFTER_INIT ErrorOr> VMWareMouseDevice::try_to_initialize(I8042Controller const& ps2_controller) { // FIXME: return the correct error if (!VMWareBackdoor::the()) diff --git a/Kernel/Devices/HID/VMWareMouseDevice.h b/Kernel/Devices/HID/VMWareMouseDevice.h index f004682aa3..96e11f6923 100644 --- a/Kernel/Devices/HID/VMWareMouseDevice.h +++ b/Kernel/Devices/HID/VMWareMouseDevice.h @@ -18,7 +18,7 @@ namespace Kernel { class VMWareMouseDevice final : public PS2MouseDevice { public: friend class DeviceManagement; - static ErrorOr> try_to_initialize(I8042Controller const&); + static ErrorOr> try_to_initialize(I8042Controller const&); virtual ~VMWareMouseDevice() override; // ^I8042Device diff --git a/Kernel/Devices/KCOVDevice.cpp b/Kernel/Devices/KCOVDevice.cpp index d34475c92b..7c326e7e70 100644 --- a/Kernel/Devices/KCOVDevice.cpp +++ b/Kernel/Devices/KCOVDevice.cpp @@ -19,7 +19,7 @@ namespace Kernel { HashMap* KCOVDevice::proc_instance; HashMap* KCOVDevice::thread_instance; -UNMAP_AFTER_INIT NonnullRefPtr KCOVDevice::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr KCOVDevice::must_create() { auto kcov_device_or_error = DeviceManagement::try_create_device(); // FIXME: Find a way to propagate errors @@ -65,7 +65,7 @@ void KCOVDevice::free_process() delete kcov_instance; } -ErrorOr> KCOVDevice::open(int options) +ErrorOr> KCOVDevice::open(int options) { auto pid = Process::current().pid(); if (proc_instance->get(pid).has_value()) diff --git a/Kernel/Devices/KCOVDevice.h b/Kernel/Devices/KCOVDevice.h index fa7cb89c3d..f4860fc2ab 100644 --- a/Kernel/Devices/KCOVDevice.h +++ b/Kernel/Devices/KCOVDevice.h @@ -17,13 +17,13 @@ public: static HashMap* proc_instance; static HashMap* thread_instance; - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); static void free_thread(); static void free_process(); // ^File ErrorOr mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override; - ErrorOr> open(int options) override; + ErrorOr> open(int options) override; protected: KCOVDevice(); diff --git a/Kernel/Devices/KCOVInstance.h b/Kernel/Devices/KCOVInstance.h index b6b5ccd35e..6958de0b8a 100644 --- a/Kernel/Devices/KCOVInstance.h +++ b/Kernel/Devices/KCOVInstance.h @@ -53,7 +53,7 @@ private: u64 m_buffer_size_in_entries { 0 }; size_t m_buffer_size_in_bytes { 0 }; kcov_pc_t* m_buffer { nullptr }; - RefPtr m_vmobject; + LockRefPtr m_vmobject; // Here to ensure it's not garbage collected at the end of open() OwnPtr m_kernel_region; diff --git a/Kernel/Devices/MemoryDevice.cpp b/Kernel/Devices/MemoryDevice.cpp index 02e879dc87..6f9de0206e 100644 --- a/Kernel/Devices/MemoryDevice.cpp +++ b/Kernel/Devices/MemoryDevice.cpp @@ -14,7 +14,7 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr MemoryDevice::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr MemoryDevice::must_create() { auto memory_device_or_error = DeviceManagement::try_create_device(); // FIXME: Find a way to propagate errors diff --git a/Kernel/Devices/MemoryDevice.h b/Kernel/Devices/MemoryDevice.h index 2755149e4e..0ca5226887 100644 --- a/Kernel/Devices/MemoryDevice.h +++ b/Kernel/Devices/MemoryDevice.h @@ -16,7 +16,7 @@ class MemoryDevice final : public CharacterDevice { friend class DeviceManagement; public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); ~MemoryDevice(); virtual ErrorOr mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override; diff --git a/Kernel/Devices/NullDevice.cpp b/Kernel/Devices/NullDevice.cpp index d8eeba1f36..56e6564427 100644 --- a/Kernel/Devices/NullDevice.cpp +++ b/Kernel/Devices/NullDevice.cpp @@ -11,7 +11,7 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr NullDevice::must_initialize() +UNMAP_AFTER_INIT NonnullLockRefPtr NullDevice::must_initialize() { auto null_device_or_error = DeviceManagement::try_create_device(); // FIXME: Find a way to propagate errors diff --git a/Kernel/Devices/NullDevice.h b/Kernel/Devices/NullDevice.h index 23b647cfe5..255c67f01c 100644 --- a/Kernel/Devices/NullDevice.h +++ b/Kernel/Devices/NullDevice.h @@ -16,7 +16,7 @@ class NullDevice final : public CharacterDevice { public: virtual ~NullDevice() override; - static NonnullRefPtr must_initialize(); + static NonnullLockRefPtr must_initialize(); private: NullDevice(); diff --git a/Kernel/Devices/RandomDevice.cpp b/Kernel/Devices/RandomDevice.cpp index 7e7c988cdd..6dc97f48ae 100644 --- a/Kernel/Devices/RandomDevice.cpp +++ b/Kernel/Devices/RandomDevice.cpp @@ -11,7 +11,7 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr RandomDevice::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr RandomDevice::must_create() { auto random_device_or_error = DeviceManagement::try_create_device(); // FIXME: Find a way to propagate errors diff --git a/Kernel/Devices/RandomDevice.h b/Kernel/Devices/RandomDevice.h index a86ba9f854..b234792fb9 100644 --- a/Kernel/Devices/RandomDevice.h +++ b/Kernel/Devices/RandomDevice.h @@ -14,7 +14,7 @@ class RandomDevice final : public CharacterDevice { friend class DeviceManagement; public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); virtual ~RandomDevice() override; private: diff --git a/Kernel/Devices/SelfTTYDevice.cpp b/Kernel/Devices/SelfTTYDevice.cpp index e7701e7b29..a01552c7e2 100644 --- a/Kernel/Devices/SelfTTYDevice.cpp +++ b/Kernel/Devices/SelfTTYDevice.cpp @@ -11,7 +11,7 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr SelfTTYDevice::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr SelfTTYDevice::must_create() { auto self_tty_device_or_error = DeviceManagement::try_create_device(); // FIXME: Find a way to propagate errors @@ -19,14 +19,14 @@ UNMAP_AFTER_INIT NonnullRefPtr SelfTTYDevice::must_create() return self_tty_device_or_error.release_value(); } -ErrorOr> SelfTTYDevice::open(int options) +ErrorOr> SelfTTYDevice::open(int options) { // Note: If for some odd reason we try to open this device (early on boot?) // while there's no current Process assigned, don't fail and return an error. if (!Process::has_current()) return Error::from_errno(ESRCH); auto& current_process = Process::current(); - RefPtr tty = current_process.tty(); + LockRefPtr tty = current_process.tty(); if (!tty) return Error::from_errno(ENXIO); auto description = TRY(OpenFileDescription::try_create(*tty)); diff --git a/Kernel/Devices/SelfTTYDevice.h b/Kernel/Devices/SelfTTYDevice.h index 7a808e37d4..4bf5b7c733 100644 --- a/Kernel/Devices/SelfTTYDevice.h +++ b/Kernel/Devices/SelfTTYDevice.h @@ -14,14 +14,14 @@ class SelfTTYDevice final : public CharacterDevice { friend class DeviceManagement; public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); virtual ~SelfTTYDevice() override; private: SelfTTYDevice(); // ^CharacterDevice - virtual ErrorOr> open(int options) override; + virtual ErrorOr> open(int options) override; virtual ErrorOr read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override; virtual ErrorOr write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override; virtual bool can_read(OpenFileDescription const&, u64) const override; diff --git a/Kernel/Devices/SerialDevice.cpp b/Kernel/Devices/SerialDevice.cpp index 96db5b6904..b32b5a79dc 100644 --- a/Kernel/Devices/SerialDevice.cpp +++ b/Kernel/Devices/SerialDevice.cpp @@ -17,11 +17,11 @@ namespace Kernel { #define SERIAL_COM3_ADDR 0x3E8 #define SERIAL_COM4_ADDR 0x2E8 -UNMAP_AFTER_INIT NonnullRefPtr SerialDevice::must_create(size_t com_number) +UNMAP_AFTER_INIT NonnullLockRefPtr SerialDevice::must_create(size_t com_number) { // FIXME: This way of blindly doing release_value is really not a good thing, find // a way to propagate errors back. - RefPtr serial_device; + LockRefPtr serial_device; switch (com_number) { case 0: { serial_device = DeviceManagement::try_create_device(IOAddress(SERIAL_COM1_ADDR), 64).release_value(); diff --git a/Kernel/Devices/SerialDevice.h b/Kernel/Devices/SerialDevice.h index 85755e8d99..ef724522f5 100644 --- a/Kernel/Devices/SerialDevice.h +++ b/Kernel/Devices/SerialDevice.h @@ -15,7 +15,7 @@ class SerialDevice final : public CharacterDevice { friend class DeviceManagement; public: - static NonnullRefPtr must_create(size_t com_number); + static NonnullLockRefPtr must_create(size_t com_number); virtual ~SerialDevice() override; diff --git a/Kernel/Devices/ZeroDevice.cpp b/Kernel/Devices/ZeroDevice.cpp index f4d59a8677..21ea2c10e3 100644 --- a/Kernel/Devices/ZeroDevice.cpp +++ b/Kernel/Devices/ZeroDevice.cpp @@ -11,7 +11,7 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr ZeroDevice::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ZeroDevice::must_create() { auto zero_device_or_error = DeviceManagement::try_create_device(); // FIXME: Find a way to propagate errors diff --git a/Kernel/Devices/ZeroDevice.h b/Kernel/Devices/ZeroDevice.h index d10be8387f..77c9f08e57 100644 --- a/Kernel/Devices/ZeroDevice.h +++ b/Kernel/Devices/ZeroDevice.h @@ -14,7 +14,7 @@ class ZeroDevice final : public CharacterDevice { friend class DeviceManagement; public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); virtual ~ZeroDevice() override; private: diff --git a/Kernel/FileSystem/AnonymousFile.cpp b/Kernel/FileSystem/AnonymousFile.cpp index 11d7e42345..40ad6cc19d 100644 --- a/Kernel/FileSystem/AnonymousFile.cpp +++ b/Kernel/FileSystem/AnonymousFile.cpp @@ -10,7 +10,7 @@ namespace Kernel { -AnonymousFile::AnonymousFile(NonnullRefPtr vmobject) +AnonymousFile::AnonymousFile(NonnullLockRefPtr vmobject) : m_vmobject(move(vmobject)) { } diff --git a/Kernel/FileSystem/AnonymousFile.h b/Kernel/FileSystem/AnonymousFile.h index d03342ec7d..5391d82f28 100644 --- a/Kernel/FileSystem/AnonymousFile.h +++ b/Kernel/FileSystem/AnonymousFile.h @@ -13,9 +13,9 @@ namespace Kernel { class AnonymousFile final : public File { public: - static ErrorOr> try_create(NonnullRefPtr vmobject) + static ErrorOr> try_create(NonnullLockRefPtr vmobject) { - return adopt_nonnull_ref_or_enomem(new (nothrow) AnonymousFile(move(vmobject))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) AnonymousFile(move(vmobject))); } virtual ~AnonymousFile() override; @@ -30,9 +30,9 @@ private: virtual ErrorOr read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override { return ENOTSUP; } virtual ErrorOr write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override { return ENOTSUP; } - explicit AnonymousFile(NonnullRefPtr); + explicit AnonymousFile(NonnullLockRefPtr); - NonnullRefPtr m_vmobject; + NonnullLockRefPtr m_vmobject; }; } diff --git a/Kernel/FileSystem/Custody.cpp b/Kernel/FileSystem/Custody.cpp index 7dca80c50c..8166cc15f4 100644 --- a/Kernel/FileSystem/Custody.cpp +++ b/Kernel/FileSystem/Custody.cpp @@ -20,20 +20,20 @@ SpinlockProtected& Custody::all_instances() return s_all_instances; } -ErrorOr> Custody::try_create(Custody* parent, StringView name, Inode& inode, int mount_flags) +ErrorOr> Custody::try_create(Custody* parent, StringView name, Inode& inode, int mount_flags) { - return all_instances().with([&](auto& all_custodies) -> ErrorOr> { + return all_instances().with([&](auto& all_custodies) -> ErrorOr> { for (Custody& custody : all_custodies) { if (custody.parent() == parent && custody.name() == name && &custody.inode() == &inode && custody.mount_flags() == mount_flags) { - return NonnullRefPtr { custody }; + return NonnullLockRefPtr { custody }; } } auto name_kstring = TRY(KString::try_create(name)); - auto custody = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) Custody(parent, move(name_kstring), inode, mount_flags))); + auto custody = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) Custody(parent, move(name_kstring), inode, mount_flags))); all_custodies.prepend(*custody); return custody; }); diff --git a/Kernel/FileSystem/Custody.h b/Kernel/FileSystem/Custody.h index 5de67c1ed3..26f2e277b6 100644 --- a/Kernel/FileSystem/Custody.h +++ b/Kernel/FileSystem/Custody.h @@ -8,17 +8,17 @@ #include #include -#include #include #include #include +#include #include namespace Kernel { class Custody : public ListedRefCounted { public: - static ErrorOr> try_create(Custody* parent, StringView name, Inode&, int mount_flags); + static ErrorOr> try_create(Custody* parent, StringView name, Inode&, int mount_flags); ~Custody(); @@ -35,9 +35,9 @@ public: private: Custody(Custody* parent, NonnullOwnPtr name, Inode&, int mount_flags); - RefPtr m_parent; + LockRefPtr m_parent; NonnullOwnPtr m_name; - NonnullRefPtr m_inode; + NonnullLockRefPtr m_inode; int m_mount_flags { 0 }; mutable IntrusiveListNode m_all_custodies_list_node; diff --git a/Kernel/FileSystem/DevPtsFS.cpp b/Kernel/FileSystem/DevPtsFS.cpp index 06d187e284..d73442c8fe 100644 --- a/Kernel/FileSystem/DevPtsFS.cpp +++ b/Kernel/FileSystem/DevPtsFS.cpp @@ -12,9 +12,9 @@ namespace Kernel { -ErrorOr> DevPtsFS::try_create() +ErrorOr> DevPtsFS::try_create() { - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevPtsFS)); + return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DevPtsFS)); } DevPtsFS::DevPtsFS() = default; @@ -22,7 +22,7 @@ DevPtsFS::~DevPtsFS() = default; ErrorOr DevPtsFS::initialize() { - m_root_inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevPtsFSInode(*this, 1, nullptr))); + m_root_inode = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DevPtsFSInode(*this, 1, nullptr))); m_root_inode->m_metadata.inode = { fsid(), 1 }; m_root_inode->m_metadata.mode = 0040555; m_root_inode->m_metadata.uid = 0; @@ -48,7 +48,7 @@ Inode& DevPtsFS::root_inode() return *m_root_inode; } -ErrorOr> DevPtsFS::get_inode(InodeIdentifier inode_id) const +ErrorOr> DevPtsFS::get_inode(InodeIdentifier inode_id) const { if (inode_id.index() == 1) return *m_root_inode; @@ -57,7 +57,7 @@ ErrorOr> DevPtsFS::get_inode(InodeIdentifier inode_id) cons auto* device = DeviceManagement::the().get_device(201, pty_index); VERIFY(device); - auto inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevPtsFSInode(const_cast(*this), inode_id.index(), static_cast(device)))); + auto inode = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DevPtsFSInode(const_cast(*this), inode_id.index(), static_cast(device)))); inode->m_metadata.inode = inode_id; inode->m_metadata.size = 0; inode->m_metadata.uid = device->uid(); @@ -117,7 +117,7 @@ ErrorOr DevPtsFSInode::traverse_as_directory(Function(FileSy }); } -ErrorOr> DevPtsFSInode::lookup(StringView name) +ErrorOr> DevPtsFSInode::lookup(StringView name) { VERIFY(identifier().index() == 1); @@ -128,7 +128,7 @@ ErrorOr> DevPtsFSInode::lookup(StringView name) if (!pty_index.has_value()) return ENOENT; - return SlavePTY::all_instances().with([&](auto& list) -> ErrorOr> { + return SlavePTY::all_instances().with([&](auto& list) -> ErrorOr> { for (SlavePTY& slave_pty : list) { if (slave_pty.index() != pty_index.value()) continue; @@ -148,7 +148,7 @@ ErrorOr DevPtsFSInode::add_child(Inode&, StringView, mode_t) return EROFS; } -ErrorOr> DevPtsFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID) +ErrorOr> DevPtsFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID) { return EROFS; } diff --git a/Kernel/FileSystem/DevPtsFS.h b/Kernel/FileSystem/DevPtsFS.h index f5683edb08..18d4032148 100644 --- a/Kernel/FileSystem/DevPtsFS.h +++ b/Kernel/FileSystem/DevPtsFS.h @@ -20,7 +20,7 @@ class DevPtsFS final : public FileSystem { public: virtual ~DevPtsFS() override; - static ErrorOr> try_create(); + static ErrorOr> try_create(); virtual ErrorOr initialize() override; virtual StringView class_name() const override { return "DevPtsFS"sv; } @@ -29,9 +29,9 @@ public: private: DevPtsFS(); - ErrorOr> get_inode(InodeIdentifier) const; + ErrorOr> get_inode(InodeIdentifier) const; - RefPtr m_root_inode; + LockRefPtr m_root_inode; }; class DevPtsFSInode final : public Inode { @@ -50,16 +50,16 @@ private: virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override; virtual InodeMetadata metadata() const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual ErrorOr> lookup(StringView name) override; + virtual ErrorOr> lookup(StringView name) override; virtual ErrorOr flush_metadata() override; virtual ErrorOr write_bytes(off_t, size_t, UserOrKernelBuffer const& buffer, OpenFileDescription*) override; - virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; + virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; virtual ErrorOr add_child(Inode&, StringView name, mode_t) override; virtual ErrorOr remove_child(StringView name) override; virtual ErrorOr chmod(mode_t) override; virtual ErrorOr chown(UserID, GroupID) override; - WeakPtr m_pty; + LockWeakPtr m_pty; InodeMetadata m_metadata; }; diff --git a/Kernel/FileSystem/DevTmpFS.cpp b/Kernel/FileSystem/DevTmpFS.cpp index 6c78255a4f..5e0c84a157 100644 --- a/Kernel/FileSystem/DevTmpFS.cpp +++ b/Kernel/FileSystem/DevTmpFS.cpp @@ -11,9 +11,9 @@ namespace Kernel { -ErrorOr> DevTmpFS::try_create() +ErrorOr> DevTmpFS::try_create() { - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevTmpFS)); + return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DevTmpFS)); } DevTmpFS::DevTmpFS() = default; @@ -30,7 +30,7 @@ DevTmpFS::~DevTmpFS() = default; ErrorOr DevTmpFS::initialize() { - m_root_inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevTmpFSRootDirectoryInode(*this))); + m_root_inode = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DevTmpFSRootDirectoryInode(*this))); return {}; } @@ -61,7 +61,7 @@ ErrorOr DevTmpFSInode::traverse_as_directory(Function(FileSy VERIFY_NOT_REACHED(); } -ErrorOr> DevTmpFSInode::lookup(StringView) +ErrorOr> DevTmpFSInode::lookup(StringView) { VERIFY_NOT_REACHED(); } @@ -76,7 +76,7 @@ ErrorOr DevTmpFSInode::write_bytes(off_t, size_t, UserOrKernelBuffer con VERIFY_NOT_REACHED(); } -ErrorOr> DevTmpFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID) +ErrorOr> DevTmpFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID) { VERIFY_NOT_REACHED(); } @@ -214,7 +214,7 @@ ErrorOr DevTmpFSDirectoryInode::traverse_as_directory(Function> DevTmpFSDirectoryInode::lookup(StringView name) +ErrorOr> DevTmpFSDirectoryInode::lookup(StringView name) { MutexLocker locker(m_inode_lock); for (auto& node : m_nodes) { @@ -237,7 +237,7 @@ ErrorOr DevTmpFSDirectoryInode::remove_child(StringView name) return Error::from_errno(ENOENT); } -ErrorOr> DevTmpFSDirectoryInode::create_child(StringView name, mode_t mode, dev_t device_mode, UserID, GroupID) +ErrorOr> DevTmpFSDirectoryInode::create_child(StringView name, mode_t mode, dev_t device_mode, UserID, GroupID) { MutexLocker locker(m_inode_lock); for (auto& node : m_nodes) { @@ -249,7 +249,7 @@ ErrorOr> DevTmpFSDirectoryInode::create_child(StringView na metadata.mode = mode; if (metadata.is_directory()) { auto name_kstring = TRY(KString::try_create(name)); - auto new_directory_inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevTmpFSDirectoryInode(fs(), move(name_kstring)))); + auto new_directory_inode = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DevTmpFSDirectoryInode(fs(), move(name_kstring)))); TRY(new_directory_inode->chmod(mode)); m_nodes.append(*new_directory_inode); return new_directory_inode; @@ -258,14 +258,14 @@ ErrorOr> DevTmpFSDirectoryInode::create_child(StringView na auto name_kstring = TRY(KString::try_create(name)); auto major = major_from_encoded_device(device_mode); auto minor = minor_from_encoded_device(device_mode); - auto new_device_inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevTmpFSDeviceInode(fs(), major, minor, is_block_device(mode), move(name_kstring)))); + auto new_device_inode = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DevTmpFSDeviceInode(fs(), major, minor, is_block_device(mode), move(name_kstring)))); TRY(new_device_inode->chmod(mode)); m_nodes.append(*new_device_inode); return new_device_inode; } if (metadata.is_symlink()) { auto name_kstring = TRY(KString::try_create(name)); - auto new_link_inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevTmpFSLinkInode(fs(), move(name_kstring)))); + auto new_link_inode = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DevTmpFSLinkInode(fs(), move(name_kstring)))); TRY(new_link_inode->chmod(mode)); m_nodes.append(*new_link_inode); return new_link_inode; @@ -307,7 +307,7 @@ ErrorOr DevTmpFSDeviceInode::read_bytes(off_t offset, size_t count, User { MutexLocker locker(m_inode_lock); VERIFY(!!description); - RefPtr device = DeviceManagement::the().get_device(m_major_number, m_minor_number); + LockRefPtr device = DeviceManagement::the().get_device(m_major_number, m_minor_number); if (!device) return Error::from_errno(ENODEV); if (!device->can_read(*description, offset)) @@ -322,7 +322,7 @@ ErrorOr DevTmpFSDeviceInode::write_bytes(off_t offset, size_t count, Use { MutexLocker locker(m_inode_lock); VERIFY(!!description); - RefPtr device = DeviceManagement::the().get_device(m_major_number, m_minor_number); + LockRefPtr device = DeviceManagement::the().get_device(m_major_number, m_minor_number); if (!device) return Error::from_errno(ENODEV); if (!device->can_write(*description, offset)) diff --git a/Kernel/FileSystem/DevTmpFS.h b/Kernel/FileSystem/DevTmpFS.h index 4326e04ec5..67f8bc02d1 100644 --- a/Kernel/FileSystem/DevTmpFS.h +++ b/Kernel/FileSystem/DevTmpFS.h @@ -20,7 +20,7 @@ class DevTmpFS final : public FileSystem { public: virtual ~DevTmpFS() override; - static ErrorOr> try_create(); + static ErrorOr> try_create(); virtual ErrorOr initialize() override; virtual StringView class_name() const override { return "DevTmpFS"sv; } @@ -30,7 +30,7 @@ private: DevTmpFS(); size_t allocate_inode_index(); - RefPtr m_root_inode; + LockRefPtr m_root_inode; InodeIndex m_next_inode_index { 0 }; }; @@ -50,11 +50,11 @@ protected: DevTmpFSInode(DevTmpFS&, MajorNumber, MinorNumber); virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual ErrorOr> lookup(StringView name) override; + virtual ErrorOr> lookup(StringView name) override; virtual ErrorOr flush_metadata() override; virtual InodeMetadata metadata() const override final; virtual ErrorOr write_bytes(off_t, size_t, UserOrKernelBuffer const& buffer, OpenFileDescription*) override; - virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; + virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; virtual ErrorOr add_child(Inode&, StringView name, mode_t) override; virtual ErrorOr remove_child(StringView name) override; virtual ErrorOr chmod(mode_t) override; @@ -77,7 +77,7 @@ protected: virtual Type node_type() const = 0; private: - IntrusiveListNode> m_list_node; + IntrusiveListNode> m_list_node; }; class DevTmpFSDeviceInode final : public DevTmpFSInode { @@ -135,10 +135,10 @@ protected: // ^DevTmpFSInode virtual Type node_type() const override { return Type::Directory; } - virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; + virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; virtual ErrorOr remove_child(StringView name) override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual ErrorOr> lookup(StringView name) override; + virtual ErrorOr> lookup(StringView name) override; DevTmpFSDirectoryInode(DevTmpFS&, NonnullOwnPtr name); // ^Inode OwnPtr m_name; diff --git a/Kernel/FileSystem/Ext2FileSystem.cpp b/Kernel/FileSystem/Ext2FileSystem.cpp index 1d66841459..c1c8d5d93d 100644 --- a/Kernel/FileSystem/Ext2FileSystem.cpp +++ b/Kernel/FileSystem/Ext2FileSystem.cpp @@ -49,9 +49,9 @@ static u8 to_ext2_file_type(mode_t mode) return EXT2_FT_UNKNOWN; } -ErrorOr> Ext2FS::try_create(OpenFileDescription& file_description) +ErrorOr> Ext2FS::try_create(OpenFileDescription& file_description) { - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) Ext2FS(file_description))); + return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) Ext2FS(file_description))); } Ext2FS::Ext2FS(OpenFileDescription& file_description) @@ -686,7 +686,7 @@ void Ext2FS::flush_writes() // The problem is that they are quite heavy objects, and use a lot of heap memory // for their (child name lookup) and (block list) caches. - m_inode_cache.remove_all_matching([](InodeIndex, RefPtr const& cached_inode) { + m_inode_cache.remove_all_matching([](InodeIndex, LockRefPtr const& cached_inode) { // NOTE: If we're asked to look up an inode by number (via get_inode) and it turns out // to not exist, we remember the fact that it doesn't exist by caching a nullptr. // This seems like a reasonable time to uncache ideas about unknown inodes, so do that. @@ -763,7 +763,7 @@ ErrorOr Ext2FSInode::flush_metadata() return {}; } -ErrorOr> Ext2FS::get_inode(InodeIdentifier inode) const +ErrorOr> Ext2FS::get_inode(InodeIdentifier inode) const { MutexLocker locker(m_lock); VERIFY(inode.fsid() == fsid()); @@ -773,7 +773,7 @@ ErrorOr> Ext2FS::get_inode(InodeIdentifier inode) const if (it != m_inode_cache.end()) { if (!it->value) return ENOENT; - return NonnullRefPtr { *it->value }; + return NonnullLockRefPtr { *it->value }; } } @@ -789,7 +789,7 @@ ErrorOr> Ext2FS::get_inode(InodeIdentifier inode) const if (!find_block_containing_inode(inode.index(), block_index, offset)) return EINVAL; - auto new_inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) Ext2FSInode(const_cast(*this), inode.index()))); + auto new_inode = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) Ext2FSInode(const_cast(*this), inode.index()))); auto buffer = UserOrKernelBuffer::for_kernel_buffer(reinterpret_cast(&new_inode->m_raw_inode)); TRY(read_block(block_index, &buffer, sizeof(ext2_inode), offset)); @@ -1116,7 +1116,7 @@ ErrorOr Ext2FSInode::write_directory(Vector& entries return {}; } -ErrorOr> Ext2FSInode::create_child(StringView name, mode_t mode, dev_t dev, UserID uid, GroupID gid) +ErrorOr> Ext2FSInode::create_child(StringView name, mode_t mode, dev_t dev, UserID uid, GroupID gid) { if (::is_directory(mode)) return fs().create_directory(*this, name, mode, uid, gid); @@ -1434,7 +1434,7 @@ ErrorOr Ext2FS::set_block_allocation_state(BlockIndex block_index, bool ne return update_bitmap_block(bgd.bg_block_bitmap, bit_index, new_state, m_super_block.s_free_blocks_count, bgd.bg_free_blocks_count); } -ErrorOr> Ext2FS::create_directory(Ext2FSInode& parent_inode, StringView name, mode_t mode, UserID uid, GroupID gid) +ErrorOr> Ext2FS::create_directory(Ext2FSInode& parent_inode, StringView name, mode_t mode, UserID uid, GroupID gid) { MutexLocker locker(m_lock); VERIFY(is_directory(mode)); @@ -1459,7 +1459,7 @@ ErrorOr> Ext2FS::create_directory(Ext2FSInode& parent_inode return inode; } -ErrorOr> Ext2FS::create_inode(Ext2FSInode& parent_inode, StringView name, mode_t mode, dev_t dev, UserID uid, GroupID gid) +ErrorOr> Ext2FS::create_inode(Ext2FSInode& parent_inode, StringView name, mode_t mode, dev_t dev, UserID uid, GroupID gid) { if (name.length() > EXT2_NAME_LEN) return ENAMETOOLONG; @@ -1517,7 +1517,7 @@ ErrorOr Ext2FSInode::populate_lookup_cache() const return {}; } -ErrorOr> Ext2FSInode::lookup(StringView name) +ErrorOr> Ext2FSInode::lookup(StringView name) { VERIFY(is_directory()); dbgln_if(EXT2_DEBUG, "Ext2FSInode[{}]:lookup(): Looking up '{}'", identifier(), name); diff --git a/Kernel/FileSystem/Ext2FileSystem.h b/Kernel/FileSystem/Ext2FileSystem.h index c9ca4569a9..35b6805e02 100644 --- a/Kernel/FileSystem/Ext2FileSystem.h +++ b/Kernel/FileSystem/Ext2FileSystem.h @@ -38,10 +38,10 @@ private: virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override; virtual InodeMetadata metadata() const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual ErrorOr> lookup(StringView name) override; + virtual ErrorOr> lookup(StringView name) override; virtual ErrorOr flush_metadata() override; virtual ErrorOr write_bytes(off_t, size_t, UserOrKernelBuffer const& data, OpenFileDescription*) override; - virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; + virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; virtual ErrorOr add_child(Inode& child, StringView name, mode_t) override; virtual ErrorOr remove_child(StringView name) override; virtual ErrorOr set_atime(time_t) override; @@ -86,7 +86,7 @@ public: FileSize64bits = 1 << 1, }; - static ErrorOr> try_create(OpenFileDescription&); + static ErrorOr> try_create(OpenFileDescription&); virtual ~Ext2FS() override; virtual ErrorOr initialize() override; @@ -126,9 +126,9 @@ private: virtual StringView class_name() const override { return "Ext2FS"sv; } virtual Ext2FSInode& root_inode() override; - ErrorOr> get_inode(InodeIdentifier) const; - ErrorOr> create_inode(Ext2FSInode& parent_inode, StringView name, mode_t, dev_t, UserID, GroupID); - ErrorOr> create_directory(Ext2FSInode& parent_inode, StringView name, mode_t, UserID, GroupID); + ErrorOr> get_inode(InodeIdentifier) const; + ErrorOr> create_inode(Ext2FSInode& parent_inode, StringView name, mode_t, dev_t, UserID, GroupID); + ErrorOr> create_directory(Ext2FSInode& parent_inode, StringView name, mode_t, UserID, GroupID); virtual void flush_writes() override; BlockIndex first_block_index() const; @@ -159,7 +159,7 @@ private: mutable ext2_super_block m_super_block {}; mutable OwnPtr m_cached_group_descriptor_table; - mutable HashMap> m_inode_cache; + mutable HashMap> m_inode_cache; bool m_super_block_dirty { false }; bool m_block_group_descriptors_dirty { false }; @@ -180,7 +180,7 @@ private: ErrorOr update_bitmap_block(BlockIndex bitmap_block, size_t bit_index, bool new_state, u32& super_block_counter, u16& group_descriptor_counter); Vector> m_cached_bitmaps; - RefPtr m_root_inode; + LockRefPtr m_root_inode; }; inline Ext2FS& Ext2FSInode::fs() diff --git a/Kernel/FileSystem/FIFO.cpp b/Kernel/FileSystem/FIFO.cpp index 259f061d8c..a351ac4d87 100644 --- a/Kernel/FileSystem/FIFO.cpp +++ b/Kernel/FileSystem/FIFO.cpp @@ -16,13 +16,13 @@ namespace Kernel { static Atomic s_next_fifo_id = 1; -ErrorOr> FIFO::try_create(UserID uid) +ErrorOr> FIFO::try_create(UserID uid) { auto buffer = TRY(DoubleBuffer::try_create("FIFO: Buffer"sv)); - return adopt_nonnull_ref_or_enomem(new (nothrow) FIFO(uid, move(buffer))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) FIFO(uid, move(buffer))); } -ErrorOr> FIFO::open_direction(FIFO::Direction direction) +ErrorOr> FIFO::open_direction(FIFO::Direction direction) { auto description = TRY(OpenFileDescription::try_create(*this)); attach(direction); @@ -30,7 +30,7 @@ ErrorOr> FIFO::open_direction(FIFO::Direction return description; } -ErrorOr> FIFO::open_direction_blocking(FIFO::Direction direction) +ErrorOr> FIFO::open_direction_blocking(FIFO::Direction direction) { MutexLocker locker(m_open_lock); diff --git a/Kernel/FileSystem/FIFO.h b/Kernel/FileSystem/FIFO.h index bce07e5793..0f01c1cf1f 100644 --- a/Kernel/FileSystem/FIFO.h +++ b/Kernel/FileSystem/FIFO.h @@ -24,13 +24,13 @@ public: Writer }; - static ErrorOr> try_create(UserID); + static ErrorOr> try_create(UserID); virtual ~FIFO() override; UserID uid() const { return m_uid; } - ErrorOr> open_direction(Direction); - ErrorOr> open_direction_blocking(Direction); + ErrorOr> open_direction(Direction); + ErrorOr> open_direction_blocking(Direction); #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Woverloaded-virtual" diff --git a/Kernel/FileSystem/File.cpp b/Kernel/FileSystem/File.cpp index 16873b3ec3..07bb430ae1 100644 --- a/Kernel/FileSystem/File.cpp +++ b/Kernel/FileSystem/File.cpp @@ -15,7 +15,7 @@ namespace Kernel { File::File() = default; File::~File() = default; -ErrorOr> File::open(int options) +ErrorOr> File::open(int options) { auto description = OpenFileDescription::try_create(*this); if (!description.is_error()) { diff --git a/Kernel/FileSystem/File.h b/Kernel/FileSystem/File.h index ccbe6b579a..51206f8b7a 100644 --- a/Kernel/FileSystem/File.h +++ b/Kernel/FileSystem/File.h @@ -8,11 +8,11 @@ #include #include -#include #include #include -#include #include +#include +#include #include #include #include @@ -72,13 +72,13 @@ public: class File : public AtomicRefCounted - , public Weakable { + , public LockWeakable { public: virtual bool unref() const { return AtomicRefCounted::unref(); } virtual void will_be_destroyed() { } virtual ~File(); - virtual ErrorOr> open(int options); + virtual ErrorOr> open(int options); virtual ErrorOr close(); virtual bool can_read(OpenFileDescription const&, u64) const = 0; diff --git a/Kernel/FileSystem/FileBackedFileSystem.h b/Kernel/FileSystem/FileBackedFileSystem.h index 47bd36ea60..e959bb729c 100644 --- a/Kernel/FileSystem/FileBackedFileSystem.h +++ b/Kernel/FileSystem/FileBackedFileSystem.h @@ -26,7 +26,7 @@ protected: private: virtual bool is_file_backed() const override { return true; } - mutable NonnullRefPtr m_file_description; + mutable NonnullLockRefPtr m_file_description; }; } diff --git a/Kernel/FileSystem/FileSystem.cpp b/Kernel/FileSystem/FileSystem.cpp index 96d19bef43..120d917cae 100644 --- a/Kernel/FileSystem/FileSystem.cpp +++ b/Kernel/FileSystem/FileSystem.cpp @@ -53,7 +53,7 @@ void FileSystem::sync() { Inode::sync_all(); - NonnullRefPtrVector file_systems; + NonnullLockRefPtrVector file_systems; { InterruptDisabler disabler; for (auto& it : all_file_systems()) diff --git a/Kernel/FileSystem/FileSystem.h b/Kernel/FileSystem/FileSystem.h index 40655cfe1d..7618cd5edf 100644 --- a/Kernel/FileSystem/FileSystem.h +++ b/Kernel/FileSystem/FileSystem.h @@ -8,10 +8,10 @@ #include #include -#include #include #include #include +#include #include #include #include diff --git a/Kernel/FileSystem/ISO9660FileSystem.cpp b/Kernel/FileSystem/ISO9660FileSystem.cpp index 532302a5b3..670d5964b6 100644 --- a/Kernel/FileSystem/ISO9660FileSystem.cpp +++ b/Kernel/FileSystem/ISO9660FileSystem.cpp @@ -8,15 +8,15 @@ #include #include #include -#include #include -#include #include #include #include #include #include #include +#include +#include #include #include @@ -28,7 +28,7 @@ constexpr u32 logical_sector_size = 2048; constexpr u32 max_cached_directory_entries = 128; struct DirectoryState { - RefPtr entry; + LockRefPtr entry; u32 offset { 0 }; }; @@ -168,9 +168,9 @@ private: Vector m_directory_stack; }; -ErrorOr> ISO9660FS::try_create(OpenFileDescription& description) +ErrorOr> ISO9660FS::try_create(OpenFileDescription& description) { - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) ISO9660FS(description))); + return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) ISO9660FS(description))); } ISO9660FS::ISO9660FS(OpenFileDescription& description) @@ -360,7 +360,7 @@ ErrorOr ISO9660FS::visit_directory_record(ISO::DirectoryRecordHeader const return {}; } -ErrorOr> ISO9660FS::directory_entry_for_record(Badge, ISO::DirectoryRecordHeader const* record) +ErrorOr> ISO9660FS::directory_entry_for_record(Badge, ISO::DirectoryRecordHeader const* record) { u32 extent_location = LittleEndian { record->extent_location.little }; u32 data_length = LittleEndian { record->data_length.little }; @@ -458,9 +458,9 @@ ErrorOr ISO9660Inode::traverse_as_directory(Function(FileSys }); } -ErrorOr> ISO9660Inode::lookup(StringView name) +ErrorOr> ISO9660Inode::lookup(StringView name) { - RefPtr inode; + LockRefPtr inode; Array file_identifier_buffer; TRY(fs().visit_directory_record(m_record, [&](ISO::DirectoryRecordHeader const* record) { @@ -498,7 +498,7 @@ ErrorOr ISO9660Inode::write_bytes(off_t, size_t, UserOrKernelBuffer cons return EROFS; } -ErrorOr> ISO9660Inode::create_child(StringView, mode_t, dev_t, UserID, GroupID) +ErrorOr> ISO9660Inode::create_child(StringView, mode_t, dev_t, UserID, GroupID) { return EROFS; } @@ -553,9 +553,9 @@ ISO9660Inode::ISO9660Inode(ISO9660FS& fs, ISO::DirectoryRecordHeader const& reco ISO9660Inode::~ISO9660Inode() = default; -ErrorOr> ISO9660Inode::try_create_from_directory_record(ISO9660FS& fs, ISO::DirectoryRecordHeader const& record, StringView name) +ErrorOr> ISO9660Inode::try_create_from_directory_record(ISO9660FS& fs, ISO::DirectoryRecordHeader const& record, StringView name) { - return adopt_nonnull_ref_or_enomem(new (nothrow) ISO9660Inode(fs, record, name)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ISO9660Inode(fs, record, name)); } void ISO9660Inode::create_metadata() diff --git a/Kernel/FileSystem/ISO9660FileSystem.h b/Kernel/FileSystem/ISO9660FileSystem.h index 93de3e8476..62f76912e1 100644 --- a/Kernel/FileSystem/ISO9660FileSystem.h +++ b/Kernel/FileSystem/ISO9660FileSystem.h @@ -9,13 +9,13 @@ #include #include #include -#include #include #include #include #include #include #include +#include namespace Kernel { @@ -291,9 +291,9 @@ public: // We need it as an OwnPtr to default-construct this struct. OwnPtr blocks; - static ErrorOr> try_create(u32 extent, u32 length, OwnPtr blocks) + static ErrorOr> try_create(u32 extent, u32 length, OwnPtr blocks) { - return adopt_nonnull_ref_or_enomem(new (nothrow) DirectoryEntry(extent, length, move(blocks))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) DirectoryEntry(extent, length, move(blocks))); } private: @@ -305,7 +305,7 @@ public: } }; - static ErrorOr> try_create(OpenFileDescription&); + static ErrorOr> try_create(OpenFileDescription&); virtual ~ISO9660FS() override; virtual ErrorOr initialize() override; @@ -317,7 +317,7 @@ public: virtual u8 internal_file_type_to_directory_entry_type(DirectoryEntryView const& entry) const override; - ErrorOr> directory_entry_for_record(Badge, ISO::DirectoryRecordHeader const* record); + ErrorOr> directory_entry_for_record(Badge, ISO::DirectoryRecordHeader const* record); private: ISO9660FS(OpenFileDescription&); @@ -331,10 +331,10 @@ private: ErrorOr visit_directory_record(ISO::DirectoryRecordHeader const& record, Function(ISO::DirectoryRecordHeader const*)> const& visitor) const; OwnPtr m_primary_volume; - RefPtr m_root_inode; + LockRefPtr m_root_inode; mutable u32 m_cached_inode_count { 0 }; - HashMap> m_directory_entry_cache; + HashMap> m_directory_entry_cache; }; class ISO9660Inode final : public Inode { @@ -350,10 +350,10 @@ public: virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override; virtual InodeMetadata metadata() const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual ErrorOr> lookup(StringView name) override; + virtual ErrorOr> lookup(StringView name) override; virtual ErrorOr flush_metadata() override; virtual ErrorOr write_bytes(off_t, size_t, UserOrKernelBuffer const& buffer, OpenFileDescription*) override; - virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; + virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; virtual ErrorOr add_child(Inode&, StringView name, mode_t) override; virtual ErrorOr remove_child(StringView name) override; virtual ErrorOr chmod(mode_t) override; @@ -370,7 +370,7 @@ private: static constexpr size_t max_file_identifier_length = 256 - sizeof(ISO::DirectoryRecordHeader); ISO9660Inode(ISO9660FS&, ISO::DirectoryRecordHeader const& record, StringView name); - static ErrorOr> try_create_from_directory_record(ISO9660FS&, ISO::DirectoryRecordHeader const& record, StringView name); + static ErrorOr> try_create_from_directory_record(ISO9660FS&, ISO::DirectoryRecordHeader const& record, StringView name); static InodeIndex get_inode_index(ISO::DirectoryRecordHeader const& record, StringView name); static StringView get_normalized_filename(ISO::DirectoryRecordHeader const& record, Bytes buffer); diff --git a/Kernel/FileSystem/Inode.cpp b/Kernel/FileSystem/Inode.cpp index 62f37aa7a7..e0bf3d5955 100644 --- a/Kernel/FileSystem/Inode.cpp +++ b/Kernel/FileSystem/Inode.cpp @@ -6,7 +6,6 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include #include #include #include @@ -16,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -31,7 +31,7 @@ SpinlockProtected& Inode::all_instances() void Inode::sync_all() { - NonnullRefPtrVector inodes; + NonnullLockRefPtrVector inodes; Inode::all_instances().with([&](auto& all_inodes) { for (auto& inode : all_inodes) { if (inode.is_metadata_dirty()) @@ -76,7 +76,7 @@ ErrorOr> Inode::read_entire(OpenFileDescription* descript return entire_file.release_nonnull(); } -ErrorOr> Inode::resolve_as_link(Custody& base, RefPtr* out_parent, int options, int symlink_recursion_level) const +ErrorOr> Inode::resolve_as_link(Custody& base, LockRefPtr* out_parent, int options, int symlink_recursion_level) const { // The default implementation simply treats the stored // contents as a path and resolves that. That is, it @@ -138,7 +138,7 @@ ErrorOr Inode::set_shared_vmobject(Memory::SharedInodeVMObject& vmobject) return {}; } -RefPtr Inode::bound_socket() const +LockRefPtr Inode::bound_socket() const { return m_bound_socket; } @@ -178,7 +178,7 @@ void Inode::unregister_watcher(Badge, InodeWatcher& watcher) }); } -ErrorOr> Inode::fifo() +ErrorOr> Inode::fifo() { MutexLocker locker(m_inode_lock); VERIFY(metadata().is_fifo()); @@ -187,7 +187,7 @@ ErrorOr> Inode::fifo() if (!m_fifo) m_fifo = TRY(FIFO::try_create(metadata().uid)); - return NonnullRefPtr { *m_fifo }; + return NonnullLockRefPtr { *m_fifo }; } void Inode::set_metadata_dirty(bool metadata_dirty) @@ -264,7 +264,7 @@ ErrorOr Inode::prepare_to_write_data() return {}; } -RefPtr Inode::shared_vmobject() const +LockRefPtr Inode::shared_vmobject() const { MutexLocker locker(m_inode_lock); return m_shared_vmobject.strong_ref(); diff --git a/Kernel/FileSystem/Inode.h b/Kernel/FileSystem/Inode.h index 945ef1b23b..20c2ae6c49 100644 --- a/Kernel/FileSystem/Inode.h +++ b/Kernel/FileSystem/Inode.h @@ -11,13 +11,13 @@ #include #include #include -#include #include #include #include #include #include #include +#include #include #include @@ -29,7 +29,7 @@ enum class ShouldBlock { }; class Inode : public ListedRefCounted - , public Weakable { + , public LockWeakable { friend class VirtualFileSystem; friend class FileSystem; friend class InodeFile; @@ -61,19 +61,19 @@ public: virtual void did_seek(OpenFileDescription&, off_t) { } virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const = 0; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const = 0; - virtual ErrorOr> lookup(StringView name) = 0; + virtual ErrorOr> lookup(StringView name) = 0; virtual ErrorOr write_bytes(off_t, size_t, UserOrKernelBuffer const& data, OpenFileDescription*) = 0; - virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) = 0; + virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) = 0; virtual ErrorOr add_child(Inode&, StringView name, mode_t) = 0; virtual ErrorOr remove_child(StringView name) = 0; virtual ErrorOr chmod(mode_t) = 0; virtual ErrorOr chown(UserID, GroupID) = 0; virtual ErrorOr truncate(u64) { return {}; } - virtual ErrorOr> resolve_as_link(Custody& base, RefPtr* out_parent, int options, int symlink_recursion_level) const; + virtual ErrorOr> resolve_as_link(Custody& base, LockRefPtr* out_parent, int options, int symlink_recursion_level) const; virtual ErrorOr get_block_address(int) { return ENOTSUP; } - RefPtr bound_socket() const; + LockRefPtr bound_socket() const; bool bind_socket(LocalSocket&); bool unbind_socket(); @@ -90,7 +90,7 @@ public: void will_be_destroyed(); ErrorOr set_shared_vmobject(Memory::SharedInodeVMObject&); - RefPtr shared_vmobject() const; + LockRefPtr shared_vmobject() const; static void sync_all(); void sync(); @@ -100,7 +100,7 @@ public: ErrorOr register_watcher(Badge, InodeWatcher&); void unregister_watcher(Badge, InodeWatcher&); - ErrorOr> fifo(); + ErrorOr> fifo(); bool can_apply_flock(flock const&) const; ErrorOr apply_flock(Process const&, OpenFileDescription const&, Userspace, ShouldBlock); @@ -125,11 +125,11 @@ private: FileSystem& m_file_system; InodeIndex m_index { 0 }; - WeakPtr m_shared_vmobject; - RefPtr m_bound_socket; + LockWeakPtr m_shared_vmobject; + LockRefPtr m_bound_socket; SpinlockProtected> m_watchers { LockRank::None }; bool m_metadata_dirty { false }; - RefPtr m_fifo; + LockRefPtr m_fifo; IntrusiveListNode m_inode_list_node; struct Flock { diff --git a/Kernel/FileSystem/InodeFile.cpp b/Kernel/FileSystem/InodeFile.cpp index 04056e6e88..260bfd2b25 100644 --- a/Kernel/FileSystem/InodeFile.cpp +++ b/Kernel/FileSystem/InodeFile.cpp @@ -17,7 +17,7 @@ namespace Kernel { -InodeFile::InodeFile(NonnullRefPtr&& inode) +InodeFile::InodeFile(NonnullLockRefPtr&& inode) : m_inode(move(inode)) { } @@ -87,7 +87,7 @@ ErrorOr InodeFile::ioctl(OpenFileDescription& description, unsigned reques ErrorOr InodeFile::mmap(Process& process, OpenFileDescription& description, Memory::VirtualRange const& range, u64 offset, int prot, bool shared) { // FIXME: If PROT_EXEC, check that the underlying file system isn't mounted noexec. - RefPtr vmobject; + LockRefPtr vmobject; if (shared) vmobject = TRY(Memory::SharedInodeVMObject::try_create_with_inode(inode())); else diff --git a/Kernel/FileSystem/InodeFile.h b/Kernel/FileSystem/InodeFile.h index 5f9dce10de..88576d9c0b 100644 --- a/Kernel/FileSystem/InodeFile.h +++ b/Kernel/FileSystem/InodeFile.h @@ -14,9 +14,9 @@ class Inode; class InodeFile final : public File { public: - static ErrorOr> create(NonnullRefPtr&& inode) + static ErrorOr> create(NonnullLockRefPtr&& inode) { - auto file = adopt_ref_if_nonnull(new (nothrow) InodeFile(move(inode))); + auto file = adopt_lock_ref_if_nonnull(new (nothrow) InodeFile(move(inode))); if (!file) return ENOMEM; return file.release_nonnull(); @@ -49,8 +49,8 @@ public: virtual bool is_inode() const override { return true; } private: - explicit InodeFile(NonnullRefPtr&&); - NonnullRefPtr m_inode; + explicit InodeFile(NonnullLockRefPtr&&); + NonnullLockRefPtr m_inode; }; } diff --git a/Kernel/FileSystem/InodeWatcher.cpp b/Kernel/FileSystem/InodeWatcher.cpp index e2a033ec14..50f0f75b0c 100644 --- a/Kernel/FileSystem/InodeWatcher.cpp +++ b/Kernel/FileSystem/InodeWatcher.cpp @@ -12,9 +12,9 @@ namespace Kernel { -ErrorOr> InodeWatcher::try_create() +ErrorOr> InodeWatcher::try_create() { - return adopt_nonnull_ref_or_enomem(new (nothrow) InodeWatcher); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) InodeWatcher); } InodeWatcher::~InodeWatcher() diff --git a/Kernel/FileSystem/InodeWatcher.h b/Kernel/FileSystem/InodeWatcher.h index fb01da67e4..2172d667a0 100644 --- a/Kernel/FileSystem/InodeWatcher.h +++ b/Kernel/FileSystem/InodeWatcher.h @@ -40,7 +40,7 @@ private: class InodeWatcher final : public File { public: - static ErrorOr> try_create(); + static ErrorOr> try_create(); virtual ~InodeWatcher() override; virtual bool can_read(OpenFileDescription const&, u64) const override; diff --git a/Kernel/FileSystem/Mount.h b/Kernel/FileSystem/Mount.h index 7fdf67f0c9..89f59a5925 100644 --- a/Kernel/FileSystem/Mount.h +++ b/Kernel/FileSystem/Mount.h @@ -6,9 +6,9 @@ #pragma once -#include #include #include +#include namespace Kernel { @@ -32,9 +32,9 @@ public: void set_flags(int flags) { m_flags = flags; } private: - NonnullRefPtr m_guest; - NonnullRefPtr m_guest_fs; - RefPtr m_host_custody; + NonnullLockRefPtr m_guest; + NonnullLockRefPtr m_guest_fs; + LockRefPtr m_host_custody; int m_flags; }; diff --git a/Kernel/FileSystem/OpenFileDescription.cpp b/Kernel/FileSystem/OpenFileDescription.cpp index 4f19e4c502..b7a1c5ecd2 100644 --- a/Kernel/FileSystem/OpenFileDescription.cpp +++ b/Kernel/FileSystem/OpenFileDescription.cpp @@ -22,19 +22,19 @@ namespace Kernel { -ErrorOr> OpenFileDescription::try_create(Custody& custody) +ErrorOr> OpenFileDescription::try_create(Custody& custody) { auto inode_file = TRY(InodeFile::create(custody.inode())); - auto description = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) OpenFileDescription(move(inode_file)))); + auto description = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) OpenFileDescription(move(inode_file)))); description->m_custody = custody; TRY(description->attach()); return description; } -ErrorOr> OpenFileDescription::try_create(File& file) +ErrorOr> OpenFileDescription::try_create(File& file) { - auto description = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) OpenFileDescription(file))); + auto description = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) OpenFileDescription(file))); TRY(description->attach()); return description; } diff --git a/Kernel/FileSystem/OpenFileDescription.h b/Kernel/FileSystem/OpenFileDescription.h index cb265b5abd..fc513f56cb 100644 --- a/Kernel/FileSystem/OpenFileDescription.h +++ b/Kernel/FileSystem/OpenFileDescription.h @@ -24,8 +24,8 @@ public: class OpenFileDescription final : public AtomicRefCounted { public: - static ErrorOr> try_create(Custody&); - static ErrorOr> try_create(File&); + static ErrorOr> try_create(Custody&); + static ErrorOr> try_create(File&); ~OpenFileDescription(); Thread::FileBlocker::BlockFlags should_unblock(Thread::FileBlocker::BlockFlags) const; @@ -112,7 +112,7 @@ public: OwnPtr& data(); - void set_original_inode(Badge, NonnullRefPtr&& inode) { m_inode = move(inode); } + void set_original_inode(Badge, NonnullLockRefPtr&& inode) { m_inode = move(inode); } void set_original_custody(Badge, Custody& custody); ErrorOr truncate(u64); @@ -138,9 +138,9 @@ private: blocker_set().unblock_all_blockers_whose_conditions_are_met(); } - RefPtr m_custody; - RefPtr m_inode; - NonnullRefPtr m_file; + LockRefPtr m_custody; + LockRefPtr m_inode; + NonnullLockRefPtr m_file; struct State { OwnPtr data; diff --git a/Kernel/FileSystem/Plan9FileSystem.cpp b/Kernel/FileSystem/Plan9FileSystem.cpp index 43822bfb2d..941440a1c6 100644 --- a/Kernel/FileSystem/Plan9FileSystem.cpp +++ b/Kernel/FileSystem/Plan9FileSystem.cpp @@ -9,9 +9,9 @@ namespace Kernel { -ErrorOr> Plan9FS::try_create(OpenFileDescription& file_description) +ErrorOr> Plan9FS::try_create(OpenFileDescription& file_description) { - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) Plan9FS(file_description))); + return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) Plan9FS(file_description))); } Plan9FS::Plan9FS(OpenFileDescription& file_description) @@ -487,7 +487,7 @@ bool Plan9FS::is_complete(ReceiveCompletion const& completion) return true; } -ErrorOr Plan9FS::post_message(Message& message, RefPtr completion) +ErrorOr Plan9FS::post_message(Message& message, LockRefPtr completion) { auto const& buffer = message.build(); u8 const* data = buffer.data(); @@ -584,7 +584,7 @@ ErrorOr Plan9FS::post_message_and_wait_for_a_reply(Message& message) { auto request_type = message.type(); auto tag = message.tag(); - auto completion = adopt_ref(*new ReceiveCompletion(tag)); + auto completion = adopt_lock_ref(*new ReceiveCompletion(tag)); TRY(post_message(message, completion)); if (Thread::current()->block({}, *this, message, completion).was_interrupted()) return EINTR; @@ -668,9 +668,9 @@ Plan9FSInode::Plan9FSInode(Plan9FS& fs, u32 fid) { } -ErrorOr> Plan9FSInode::try_create(Plan9FS& fs, u32 fid) +ErrorOr> Plan9FSInode::try_create(Plan9FS& fs, u32 fid) { - return adopt_nonnull_ref_or_enomem(new (nothrow) Plan9FSInode(fs, fid)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) Plan9FSInode(fs, fid)); } Plan9FSInode::~Plan9FSInode() @@ -893,7 +893,7 @@ ErrorOr Plan9FSInode::traverse_as_directory(Function(FileSys return ENOTIMPL; } -ErrorOr> Plan9FSInode::lookup(StringView name) +ErrorOr> Plan9FSInode::lookup(StringView name) { u32 newfid = fs().allocate_fid(); Plan9FS::Message message { fs(), Plan9FS::Message::Type::Twalk }; @@ -902,7 +902,7 @@ ErrorOr> Plan9FSInode::lookup(StringView name) return TRY(Plan9FSInode::try_create(fs(), newfid)); } -ErrorOr> Plan9FSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID) +ErrorOr> Plan9FSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID) { // TODO return ENOTIMPL; diff --git a/Kernel/FileSystem/Plan9FileSystem.h b/Kernel/FileSystem/Plan9FileSystem.h index 892407f91b..3ee42f1c76 100644 --- a/Kernel/FileSystem/Plan9FileSystem.h +++ b/Kernel/FileSystem/Plan9FileSystem.h @@ -20,7 +20,7 @@ class Plan9FS final : public FileBackedFileSystem { public: virtual ~Plan9FS() override; - static ErrorOr> try_create(OpenFileDescription&); + static ErrorOr> try_create(OpenFileDescription&); virtual ErrorOr initialize() override; @@ -82,7 +82,7 @@ private: class Blocker final : public Thread::Blocker { public: - Blocker(Plan9FS& fs, Message& message, NonnullRefPtr completion) + Blocker(Plan9FS& fs, Message& message, NonnullLockRefPtr completion) : m_fs(fs) , m_message(message) , m_completion(move(completion)) @@ -93,7 +93,7 @@ private: virtual Type blocker_type() const override { return Type::Plan9FS; } virtual void will_unblock_immediately_without_blocking(UnblockImmediatelyReason) override; - NonnullRefPtr const& completion() const { return m_completion; } + NonnullLockRefPtr const& completion() const { return m_completion; } u16 tag() const { return m_completion->tag; } bool is_completed() const; @@ -108,7 +108,7 @@ private: private: Plan9FS& m_fs; Message& m_message; - NonnullRefPtr m_completion; + NonnullLockRefPtr m_completion; bool m_did_unblock { false }; }; friend class Blocker; @@ -116,7 +116,7 @@ private: virtual StringView class_name() const override { return "Plan9FS"sv; } bool is_complete(ReceiveCompletion const&); - ErrorOr post_message(Message&, RefPtr); + ErrorOr post_message(Message&, LockRefPtr); ErrorOr do_read(u8* buffer, size_t); ErrorOr read_and_dispatch_one_message(); ErrorOr post_message_and_wait_for_a_reply(Message&); @@ -128,7 +128,7 @@ private: void thread_main(); void ensure_thread(); - RefPtr m_root_inode; + LockRefPtr m_root_inode; Atomic m_next_tag { (u16)-1 }; Atomic m_next_fid { 1 }; @@ -137,10 +137,10 @@ private: Mutex m_send_lock { "Plan9FS send"sv }; Plan9FSBlockerSet m_completion_blocker; - HashMap> m_completions; + HashMap> m_completions; Spinlock m_thread_lock { LockRank::None }; - RefPtr m_thread; + LockRefPtr m_thread; Atomic m_thread_running { false }; Atomic m_thread_shutdown { false }; }; @@ -159,8 +159,8 @@ public: virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override; virtual ErrorOr write_bytes(off_t, size_t, UserOrKernelBuffer const& data, OpenFileDescription*) override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual ErrorOr> lookup(StringView name) override; - virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; + virtual ErrorOr> lookup(StringView name) override; + virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; virtual ErrorOr add_child(Inode&, StringView name, mode_t) override; virtual ErrorOr remove_child(StringView name) override; virtual ErrorOr chmod(mode_t) override; @@ -169,7 +169,7 @@ public: private: Plan9FSInode(Plan9FS&, u32 fid); - static ErrorOr> try_create(Plan9FS&, u32 fid); + static ErrorOr> try_create(Plan9FS&, u32 fid); enum class GetAttrMask : u64 { Mode = 0x1, diff --git a/Kernel/FileSystem/ProcFS.cpp b/Kernel/FileSystem/ProcFS.cpp index b0af6ae9d2..4d6cb263b8 100644 --- a/Kernel/FileSystem/ProcFS.cpp +++ b/Kernel/FileSystem/ProcFS.cpp @@ -37,9 +37,9 @@ UNMAP_AFTER_INIT ProcFSComponentRegistry::ProcFSComponentRegistry() { } -ErrorOr> ProcFS::try_create() +ErrorOr> ProcFS::try_create() { - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) ProcFS)); + return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFS)); } ProcFS::ProcFS() = default; @@ -73,7 +73,7 @@ ErrorOr ProcFSInode::add_child(Inode&, StringView, mode_t) return EROFS; } -ErrorOr> ProcFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID) +ErrorOr> ProcFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID) { return EROFS; } @@ -93,9 +93,9 @@ ErrorOr ProcFSInode::chown(UserID, GroupID) return EPERM; } -ErrorOr> ProcFSGlobalInode::try_create(ProcFS const& fs, ProcFSExposedComponent const& component) +ErrorOr> ProcFSGlobalInode::try_create(ProcFS const& fs, ProcFSExposedComponent const& component) { - return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSGlobalInode(fs, component)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSGlobalInode(fs, component)); } ProcFSGlobalInode::ProcFSGlobalInode(ProcFS const& fs, ProcFSExposedComponent const& component) @@ -135,7 +135,7 @@ ErrorOr ProcFSGlobalInode::traverse_as_directory(Function(Fi VERIFY_NOT_REACHED(); } -ErrorOr> ProcFSGlobalInode::lookup(StringView) +ErrorOr> ProcFSGlobalInode::lookup(StringView) { VERIFY_NOT_REACHED(); } @@ -168,9 +168,9 @@ ErrorOr ProcFSGlobalInode::write_bytes(off_t offset, size_t count, UserO return m_associated_component->write_bytes(offset, count, buffer, fd); } -ErrorOr> ProcFSDirectoryInode::try_create(ProcFS const& procfs, ProcFSExposedComponent const& component) +ErrorOr> ProcFSDirectoryInode::try_create(ProcFS const& procfs, ProcFSExposedComponent const& component) { - return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSDirectoryInode(procfs, component)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSDirectoryInode(procfs, component)); } ProcFSDirectoryInode::ProcFSDirectoryInode(ProcFS const& fs, ProcFSExposedComponent const& component) @@ -197,16 +197,16 @@ ErrorOr ProcFSDirectoryInode::traverse_as_directory(Function return m_associated_component->traverse_as_directory(procfs().fsid(), move(callback)); } -ErrorOr> ProcFSDirectoryInode::lookup(StringView name) +ErrorOr> ProcFSDirectoryInode::lookup(StringView name) { MutexLocker locker(procfs().m_lock); auto component = TRY(m_associated_component->lookup(name)); return component->to_inode(procfs()); } -ErrorOr> ProcFSLinkInode::try_create(ProcFS const& procfs, ProcFSExposedComponent const& component) +ErrorOr> ProcFSLinkInode::try_create(ProcFS const& procfs, ProcFSExposedComponent const& component) { - return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSLinkInode(procfs, component)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSLinkInode(procfs, component)); } ProcFSLinkInode::ProcFSLinkInode(ProcFS const& fs, ProcFSExposedComponent const& component) @@ -238,9 +238,9 @@ ErrorOr ProcFSProcessAssociatedInode::write_bytes(off_t, size_t, UserOrK return ENOTSUP; } -ErrorOr> ProcFSProcessDirectoryInode::try_create(ProcFS const& procfs, ProcessID pid) +ErrorOr> ProcFSProcessDirectoryInode::try_create(ProcFS const& procfs, ProcessID pid) { - return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSProcessDirectoryInode(procfs, pid)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSProcessDirectoryInode(procfs, pid)); } ProcFSProcessDirectoryInode::ProcFSProcessDirectoryInode(ProcFS const& procfs, ProcessID pid) @@ -285,7 +285,7 @@ ErrorOr ProcFSProcessDirectoryInode::traverse_as_directory(Functionprocfs_traits()->traverse_as_directory(procfs().fsid(), move(callback)); } -ErrorOr> ProcFSProcessDirectoryInode::lookup(StringView name) +ErrorOr> ProcFSProcessDirectoryInode::lookup(StringView name) { MutexLocker locker(procfs().m_lock); auto process = Process::from_pid(associated_pid()); @@ -316,9 +316,9 @@ ErrorOr> ProcFSProcessDirectoryInode::lookup(StringView nam return ENOENT; } -ErrorOr> ProcFSProcessSubDirectoryInode::try_create(ProcFS const& procfs, SegmentedProcFSIndex::ProcessSubDirectory sub_directory_type, ProcessID pid) +ErrorOr> ProcFSProcessSubDirectoryInode::try_create(ProcFS const& procfs, SegmentedProcFSIndex::ProcessSubDirectory sub_directory_type, ProcessID pid) { - return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSProcessSubDirectoryInode(procfs, sub_directory_type, pid)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSProcessSubDirectoryInode(procfs, sub_directory_type, pid)); } ProcFSProcessSubDirectoryInode::ProcFSProcessSubDirectoryInode(ProcFS const& procfs, SegmentedProcFSIndex::ProcessSubDirectory sub_directory_type, ProcessID pid) @@ -379,7 +379,7 @@ ErrorOr ProcFSProcessSubDirectoryInode::traverse_as_directory(Function> ProcFSProcessSubDirectoryInode::lookup(StringView name) +ErrorOr> ProcFSProcessSubDirectoryInode::lookup(StringView name) { MutexLocker locker(procfs().m_lock); auto process = Process::from_pid(associated_pid()); @@ -397,21 +397,21 @@ ErrorOr> ProcFSProcessSubDirectoryInode::lookup(StringView } } -ErrorOr> ProcFSProcessPropertyInode::try_create_for_file_description_link(ProcFS const& procfs, unsigned file_description_index, ProcessID pid) +ErrorOr> ProcFSProcessPropertyInode::try_create_for_file_description_link(ProcFS const& procfs, unsigned file_description_index, ProcessID pid) { - return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSProcessPropertyInode(procfs, file_description_index, pid)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSProcessPropertyInode(procfs, file_description_index, pid)); } -ErrorOr> ProcFSProcessPropertyInode::try_create_for_thread_stack(ProcFS const& procfs, ThreadID stack_thread_index, ProcessID pid) +ErrorOr> ProcFSProcessPropertyInode::try_create_for_thread_stack(ProcFS const& procfs, ThreadID stack_thread_index, ProcessID pid) { - return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSProcessPropertyInode(procfs, stack_thread_index, pid)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSProcessPropertyInode(procfs, stack_thread_index, pid)); } -ErrorOr> ProcFSProcessPropertyInode::try_create_for_pid_property(ProcFS const& procfs, SegmentedProcFSIndex::MainProcessProperty main_property_type, ProcessID pid) +ErrorOr> ProcFSProcessPropertyInode::try_create_for_pid_property(ProcFS const& procfs, SegmentedProcFSIndex::MainProcessProperty main_property_type, ProcessID pid) { - return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSProcessPropertyInode(procfs, main_property_type, pid)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSProcessPropertyInode(procfs, main_property_type, pid)); } -ErrorOr> ProcFSProcessPropertyInode::try_create_for_child_process_link(ProcFS const& procfs, ProcessID child_pid, ProcessID pid) +ErrorOr> ProcFSProcessPropertyInode::try_create_for_child_process_link(ProcFS const& procfs, ProcessID child_pid, ProcessID pid) { - return adopt_nonnull_ref_or_enomem(new (nothrow) ProcFSProcessPropertyInode(procfs, child_pid, pid)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcFSProcessPropertyInode(procfs, child_pid, pid)); } ProcFSProcessPropertyInode::ProcFSProcessPropertyInode(ProcFS const& procfs, SegmentedProcFSIndex::MainProcessProperty main_property_type, ProcessID pid) @@ -528,7 +528,7 @@ ErrorOr ProcFSProcessPropertyInode::read_bytes(off_t offset, size_t coun return nread; } -ErrorOr> ProcFSProcessPropertyInode::lookup(StringView) +ErrorOr> ProcFSProcessPropertyInode::lookup(StringView) { return EINVAL; } diff --git a/Kernel/FileSystem/ProcFS.h b/Kernel/FileSystem/ProcFS.h index 63811e31e1..1601ba9e2c 100644 --- a/Kernel/FileSystem/ProcFS.h +++ b/Kernel/FileSystem/ProcFS.h @@ -28,7 +28,7 @@ class ProcFS final : public FileSystem { public: virtual ~ProcFS() override; - static ErrorOr> try_create(); + static ErrorOr> try_create(); virtual ErrorOr initialize() override; virtual StringView class_name() const override { return "ProcFS"sv; } @@ -38,7 +38,7 @@ public: private: ProcFS(); - RefPtr m_root_inode; + LockRefPtr m_root_inode; }; class ProcFSInode : public Inode { @@ -57,7 +57,7 @@ protected: virtual ErrorOr attach(OpenFileDescription& description) override = 0; virtual void did_seek(OpenFileDescription&, off_t) override = 0; virtual ErrorOr flush_metadata() override final; - virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override final; + virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override final; virtual ErrorOr add_child(Inode&, StringView name, mode_t) override final; virtual ErrorOr remove_child(StringView name) override final; virtual ErrorOr chmod(mode_t) override final; @@ -68,7 +68,7 @@ class ProcFSGlobalInode : public ProcFSInode { friend class ProcFS; public: - static ErrorOr> try_create(ProcFS const&, ProcFSExposedComponent const&); + static ErrorOr> try_create(ProcFS const&, ProcFSExposedComponent const&); virtual ~ProcFSGlobalInode() override {}; StringView name() const; @@ -82,18 +82,18 @@ protected: virtual void did_seek(OpenFileDescription&, off_t) override final; virtual InodeMetadata metadata() const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual ErrorOr> lookup(StringView) override; + virtual ErrorOr> lookup(StringView) override; virtual ErrorOr truncate(u64) override final; virtual ErrorOr set_mtime(time_t) override final; - NonnullRefPtr m_associated_component; + NonnullLockRefPtr m_associated_component; }; class ProcFSLinkInode : public ProcFSGlobalInode { friend class ProcFS; public: - static ErrorOr> try_create(ProcFS const&, ProcFSExposedComponent const&); + static ErrorOr> try_create(ProcFS const&, ProcFSExposedComponent const&); protected: ProcFSLinkInode(ProcFS const&, ProcFSExposedComponent const&); @@ -104,7 +104,7 @@ class ProcFSDirectoryInode final : public ProcFSGlobalInode { friend class ProcFS; public: - static ErrorOr> try_create(ProcFS const&, ProcFSExposedComponent const&); + static ErrorOr> try_create(ProcFS const&, ProcFSExposedComponent const&); virtual ~ProcFSDirectoryInode() override; protected: @@ -112,7 +112,7 @@ protected: // ^Inode virtual InodeMetadata metadata() const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual ErrorOr> lookup(StringView name) override; + virtual ErrorOr> lookup(StringView name) override; }; class ProcFSProcessAssociatedInode : public ProcFSInode { @@ -133,7 +133,7 @@ class ProcFSProcessDirectoryInode final : public ProcFSProcessAssociatedInode { friend class ProcFS; public: - static ErrorOr> try_create(ProcFS const&, ProcessID); + static ErrorOr> try_create(ProcFS const&, ProcessID); private: ProcFSProcessDirectoryInode(ProcFS const&, ProcessID); @@ -143,14 +143,14 @@ private: virtual InodeMetadata metadata() const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final; - virtual ErrorOr> lookup(StringView name) override; + virtual ErrorOr> lookup(StringView name) override; }; class ProcFSProcessSubDirectoryInode final : public ProcFSProcessAssociatedInode { friend class ProcFS; public: - static ErrorOr> try_create(ProcFS const&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID); + static ErrorOr> try_create(ProcFS const&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID); private: ProcFSProcessSubDirectoryInode(ProcFS const&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID); @@ -160,7 +160,7 @@ private: virtual InodeMetadata metadata() const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final; - virtual ErrorOr> lookup(StringView name) override; + virtual ErrorOr> lookup(StringView name) override; const SegmentedProcFSIndex::ProcessSubDirectory m_sub_directory_type; }; @@ -169,10 +169,10 @@ class ProcFSProcessPropertyInode final : public ProcFSProcessAssociatedInode { friend class ProcFS; public: - static ErrorOr> try_create_for_file_description_link(ProcFS const&, unsigned, ProcessID); - static ErrorOr> try_create_for_thread_stack(ProcFS const&, ThreadID, ProcessID); - static ErrorOr> try_create_for_pid_property(ProcFS const&, SegmentedProcFSIndex::MainProcessProperty, ProcessID); - static ErrorOr> try_create_for_child_process_link(ProcFS const&, ProcessID, ProcessID); + static ErrorOr> try_create_for_file_description_link(ProcFS const&, unsigned, ProcessID); + static ErrorOr> try_create_for_thread_stack(ProcFS const&, ThreadID, ProcessID); + static ErrorOr> try_create_for_pid_property(ProcFS const&, SegmentedProcFSIndex::MainProcessProperty, ProcessID); + static ErrorOr> try_create_for_child_process_link(ProcFS const&, ProcessID, ProcessID); private: ProcFSProcessPropertyInode(ProcFS const&, SegmentedProcFSIndex::MainProcessProperty, ProcessID); @@ -186,7 +186,7 @@ private: virtual InodeMetadata metadata() const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final; - virtual ErrorOr> lookup(StringView name) override final; + virtual ErrorOr> lookup(StringView name) override final; ErrorOr refresh_data(OpenFileDescription& description); ErrorOr try_to_acquire_data(Process& process, KBufferBuilder& builder) const; diff --git a/Kernel/FileSystem/SysFS.cpp b/Kernel/FileSystem/SysFS.cpp index 16940f76be..00783245b6 100644 --- a/Kernel/FileSystem/SysFS.cpp +++ b/Kernel/FileSystem/SysFS.cpp @@ -12,9 +12,9 @@ namespace Kernel { -ErrorOr> SysFS::try_create() +ErrorOr> SysFS::try_create() { - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) SysFS)); + return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFS)); } SysFS::SysFS() = default; @@ -31,9 +31,9 @@ Inode& SysFS::root_inode() return *m_root_inode; } -ErrorOr> SysFSInode::try_create(SysFS const& fs, SysFSComponent const& component) +ErrorOr> SysFSInode::try_create(SysFS const& fs, SysFSComponent const& component) { - return adopt_nonnull_ref_or_enomem(new (nothrow) SysFSInode(fs, component)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFSInode(fs, component)); } SysFSInode::SysFSInode(SysFS const& fs, SysFSComponent const& component) @@ -68,7 +68,7 @@ ErrorOr SysFSInode::traverse_as_directory(Function(FileSyste VERIFY_NOT_REACHED(); } -ErrorOr> SysFSInode::lookup(StringView) +ErrorOr> SysFSInode::lookup(StringView) { VERIFY_NOT_REACHED(); } @@ -96,7 +96,7 @@ ErrorOr SysFSInode::write_bytes(off_t offset, size_t count, UserOrKernel return m_associated_component->write_bytes(offset, count, buffer, fd); } -ErrorOr> SysFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID) +ErrorOr> SysFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID) { return EROFS; } @@ -131,9 +131,9 @@ ErrorOr SysFSInode::truncate(u64 size) return m_associated_component->truncate(size); } -ErrorOr> SysFSLinkInode::try_create(SysFS const& sysfs, SysFSComponent const& component) +ErrorOr> SysFSLinkInode::try_create(SysFS const& sysfs, SysFSComponent const& component) { - return adopt_nonnull_ref_or_enomem(new (nothrow) SysFSLinkInode(sysfs, component)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFSLinkInode(sysfs, component)); } SysFSLinkInode::SysFSLinkInode(SysFS const& fs, SysFSComponent const& component) @@ -156,9 +156,9 @@ InodeMetadata SysFSLinkInode::metadata() const return metadata; } -ErrorOr> SysFSDirectoryInode::try_create(SysFS const& sysfs, SysFSComponent const& component) +ErrorOr> SysFSDirectoryInode::try_create(SysFS const& sysfs, SysFSComponent const& component) { - return adopt_nonnull_ref_or_enomem(new (nothrow) SysFSDirectoryInode(sysfs, component)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFSDirectoryInode(sysfs, component)); } SysFSDirectoryInode::SysFSDirectoryInode(SysFS const& fs, SysFSComponent const& component) @@ -186,7 +186,7 @@ ErrorOr SysFSDirectoryInode::traverse_as_directory(Function( return m_associated_component->traverse_as_directory(fs().fsid(), move(callback)); } -ErrorOr> SysFSDirectoryInode::lookup(StringView name) +ErrorOr> SysFSDirectoryInode::lookup(StringView name) { MutexLocker locker(fs().m_lock); auto component = m_associated_component->lookup(name); diff --git a/Kernel/FileSystem/SysFS.h b/Kernel/FileSystem/SysFS.h index b1aa80b15f..0afd4b22d0 100644 --- a/Kernel/FileSystem/SysFS.h +++ b/Kernel/FileSystem/SysFS.h @@ -19,7 +19,7 @@ class SysFS final : public FileSystem { public: virtual ~SysFS() override; - static ErrorOr> try_create(); + static ErrorOr> try_create(); virtual ErrorOr initialize() override; virtual StringView class_name() const override { return "SysFS"sv; } @@ -29,7 +29,7 @@ public: private: SysFS(); - RefPtr m_root_inode; + LockRefPtr m_root_inode; }; class SysFSInode : public Inode { @@ -37,18 +37,18 @@ class SysFSInode : public Inode { friend class SysFSDirectoryInode; public: - static ErrorOr> try_create(SysFS const&, SysFSComponent const&); + static ErrorOr> try_create(SysFS const&, SysFSComponent const&); StringView name() const { return m_associated_component->name(); } protected: SysFSInode(SysFS const&, SysFSComponent const&); virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual ErrorOr> lookup(StringView name) override; + virtual ErrorOr> lookup(StringView name) override; virtual ErrorOr flush_metadata() override; virtual InodeMetadata metadata() const override; virtual ErrorOr write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) override; - virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; + virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; virtual ErrorOr add_child(Inode&, StringView name, mode_t) override; virtual ErrorOr remove_child(StringView name) override; virtual ErrorOr chmod(mode_t) override; @@ -59,14 +59,14 @@ protected: virtual ErrorOr attach(OpenFileDescription& description) override final; virtual void did_seek(OpenFileDescription&, off_t) override final; - NonnullRefPtr m_associated_component; + NonnullLockRefPtr m_associated_component; }; class SysFSLinkInode : public SysFSInode { friend class SysFS; public: - static ErrorOr> try_create(SysFS const&, SysFSComponent const&); + static ErrorOr> try_create(SysFS const&, SysFSComponent const&); virtual ~SysFSLinkInode() override; protected: @@ -79,7 +79,7 @@ class SysFSDirectoryInode : public SysFSInode { friend class SysFS; public: - static ErrorOr> try_create(SysFS const&, SysFSComponent const&); + static ErrorOr> try_create(SysFS const&, SysFSComponent const&); virtual ~SysFSDirectoryInode() override; SysFS& fs() { return static_cast(Inode::fs()); } @@ -90,7 +90,7 @@ protected: // ^Inode virtual InodeMetadata metadata() const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual ErrorOr> lookup(StringView name) override; + virtual ErrorOr> lookup(StringView name) override; }; } diff --git a/Kernel/FileSystem/SysFS/Component.cpp b/Kernel/FileSystem/SysFS/Component.cpp index d9a462b177..77140bdf15 100644 --- a/Kernel/FileSystem/SysFS/Component.cpp +++ b/Kernel/FileSystem/SysFS/Component.cpp @@ -124,9 +124,9 @@ ErrorOr SysFSDirectory::traverse_as_directory(FileSystemID fsid, Function< }); } -RefPtr SysFSDirectory::lookup(StringView name) +LockRefPtr SysFSDirectory::lookup(StringView name) { - return m_child_components.with([&](auto& list) -> RefPtr { + return m_child_components.with([&](auto& list) -> LockRefPtr { for (auto& child_component : list) { if (child_component.name() == name) { return child_component; @@ -141,17 +141,17 @@ SysFSDirectory::SysFSDirectory(SysFSDirectory const& parent_directory) { } -ErrorOr> SysFSDirectory::to_inode(SysFS const& sysfs_instance) const +ErrorOr> SysFSDirectory::to_inode(SysFS const& sysfs_instance) const { return TRY(SysFSDirectoryInode::try_create(sysfs_instance, *this)); } -ErrorOr> SysFSSymbolicLink::to_inode(SysFS const& sysfs_instance) const +ErrorOr> SysFSSymbolicLink::to_inode(SysFS const& sysfs_instance) const { return TRY(SysFSLinkInode::try_create(sysfs_instance, *this)); } -ErrorOr> SysFSComponent::to_inode(SysFS const& sysfs_instance) const +ErrorOr> SysFSComponent::to_inode(SysFS const& sysfs_instance) const { return SysFSInode::try_create(sysfs_instance, *this); } diff --git a/Kernel/FileSystem/SysFS/Component.h b/Kernel/FileSystem/SysFS/Component.h index 8ecbee5f87..6ea0ee4815 100644 --- a/Kernel/FileSystem/SysFS/Component.h +++ b/Kernel/FileSystem/SysFS/Component.h @@ -9,13 +9,13 @@ #include #include #include -#include #include #include #include #include #include #include +#include namespace Kernel { @@ -31,7 +31,7 @@ public: virtual StringView name() const = 0; virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const { return Error::from_errno(ENOTIMPL); } virtual ErrorOr traverse_as_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)>) const { VERIFY_NOT_REACHED(); } - virtual RefPtr lookup(StringView) { VERIFY_NOT_REACHED(); }; + virtual LockRefPtr lookup(StringView) { VERIFY_NOT_REACHED(); }; virtual mode_t permissions() const; virtual ErrorOr truncate(u64) { return EPERM; } virtual size_t size() const { return 0; } @@ -39,7 +39,7 @@ public: virtual ErrorOr write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) { return EROFS; } virtual ErrorOr refresh_data(OpenFileDescription&) const { return {}; } - virtual ErrorOr> to_inode(SysFS const&) const; + virtual ErrorOr> to_inode(SysFS const&) const; InodeIndex component_index() const { return m_component_index; }; @@ -52,9 +52,9 @@ protected: explicit SysFSComponent(SysFSDirectory const& parent_directory); SysFSComponent(); - RefPtr m_parent_directory; + LockRefPtr m_parent_directory; - IntrusiveListNode> m_list_node; + IntrusiveListNode> m_list_node; private: InodeIndex m_component_index {}; @@ -63,7 +63,7 @@ private: class SysFSSymbolicLink : public SysFSComponent { public: virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override final; - virtual ErrorOr> to_inode(SysFS const& sysfs_instance) const override final; + virtual ErrorOr> to_inode(SysFS const& sysfs_instance) const override final; protected: ErrorOr> try_generate_return_path_to_mount_point() const; @@ -71,15 +71,15 @@ protected: explicit SysFSSymbolicLink(SysFSDirectory const& parent_directory, SysFSComponent const& pointed_component); - RefPtr m_pointed_component; + LockRefPtr m_pointed_component; }; class SysFSDirectory : public SysFSComponent { public: virtual ErrorOr traverse_as_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)>) const override final; - virtual RefPtr lookup(StringView name) override final; + virtual LockRefPtr lookup(StringView name) override final; - virtual ErrorOr> to_inode(SysFS const& sysfs_instance) const override final; + virtual ErrorOr> to_inode(SysFS const& sysfs_instance) const override final; using ChildList = SpinlockProtected>; diff --git a/Kernel/FileSystem/SysFS/Registry.h b/Kernel/FileSystem/SysFS/Registry.h index a560a9d62d..c0113eb29d 100644 --- a/Kernel/FileSystem/SysFS/Registry.h +++ b/Kernel/FileSystem/SysFS/Registry.h @@ -31,7 +31,7 @@ public: SysFSBusDirectory& buses_directory(); private: - NonnullRefPtr m_root_directory; + NonnullLockRefPtr m_root_directory; Spinlock m_root_directory_lock { LockRank::None }; }; diff --git a/Kernel/FileSystem/SysFS/RootDirectory.cpp b/Kernel/FileSystem/SysFS/RootDirectory.cpp index d3e7fc20a8..409a412cb9 100644 --- a/Kernel/FileSystem/SysFS/RootDirectory.cpp +++ b/Kernel/FileSystem/SysFS/RootDirectory.cpp @@ -13,9 +13,9 @@ namespace Kernel { -NonnullRefPtr SysFSRootDirectory::create() +NonnullLockRefPtr SysFSRootDirectory::create() { - return adopt_ref(*new (nothrow) SysFSRootDirectory); + return adopt_lock_ref(*new (nothrow) SysFSRootDirectory); } SysFSRootDirectory::SysFSRootDirectory() diff --git a/Kernel/FileSystem/SysFS/RootDirectory.h b/Kernel/FileSystem/SysFS/RootDirectory.h index 09a67b7cf0..bd12df8bfa 100644 --- a/Kernel/FileSystem/SysFS/RootDirectory.h +++ b/Kernel/FileSystem/SysFS/RootDirectory.h @@ -16,12 +16,12 @@ class SysFSRootDirectory final : public SysFSDirectory { public: virtual StringView name() const override { return "."sv; } - static NonnullRefPtr create(); + static NonnullLockRefPtr create(); private: virtual bool is_root_directory() const override final { return true; } SysFSRootDirectory(); - RefPtr m_buses_directory; + LockRefPtr m_buses_directory; }; } diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.cpp index f9d1a2bf63..488364f483 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.cpp @@ -10,9 +10,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr SysFSBusDirectory::must_create(SysFSRootDirectory const& parent_directory) +UNMAP_AFTER_INIT NonnullLockRefPtr SysFSBusDirectory::must_create(SysFSRootDirectory const& parent_directory) { - auto directory = adopt_ref(*new (nothrow) SysFSBusDirectory(parent_directory)); + auto directory = adopt_lock_ref(*new (nothrow) SysFSBusDirectory(parent_directory)); return directory; } diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.h b/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.h index c8ccb14c74..dc906de433 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.h @@ -16,7 +16,7 @@ class SysFSBusDirectory : public SysFSDirectory { public: virtual StringView name() const override { return "bus"sv; } - static NonnullRefPtr must_create(SysFSRootDirectory const&); + static NonnullLockRefPtr must_create(SysFSRootDirectory const&); private: explicit SysFSBusDirectory(SysFSRootDirectory const&); diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.cpp index e2f99411b3..584bb328fa 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.cpp @@ -16,7 +16,7 @@ namespace Kernel { UNMAP_AFTER_INIT void PCIBusSysFSDirectory::initialize() { - auto pci_directory = adopt_ref(*new (nothrow) PCIBusSysFSDirectory()); + auto pci_directory = adopt_lock_ref(*new (nothrow) PCIBusSysFSDirectory()); SysFSComponentRegistry::the().register_new_bus_directory(pci_directory); } diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.cpp b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.cpp index 5fe4039167..e4b1c94526 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.cpp @@ -48,9 +48,9 @@ StringView PCIDeviceAttributeSysFSComponent::name() const } } -NonnullRefPtr PCIDeviceAttributeSysFSComponent::create(PCIDeviceSysFSDirectory const& device, PCI::RegisterOffset offset, size_t field_bytes_width) +NonnullLockRefPtr PCIDeviceAttributeSysFSComponent::create(PCIDeviceSysFSDirectory const& device, PCI::RegisterOffset offset, size_t field_bytes_width) { - return adopt_ref(*new (nothrow) PCIDeviceAttributeSysFSComponent(device, offset, field_bytes_width)); + return adopt_lock_ref(*new (nothrow) PCIDeviceAttributeSysFSComponent(device, offset, field_bytes_width)); } PCIDeviceAttributeSysFSComponent::PCIDeviceAttributeSysFSComponent(PCIDeviceSysFSDirectory const& device, PCI::RegisterOffset offset, size_t field_bytes_width) diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.h b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.h index e361c28c13..458a2625e2 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.h @@ -15,7 +15,7 @@ namespace Kernel { class PCIDeviceAttributeSysFSComponent : public SysFSComponent { public: - static NonnullRefPtr create(PCIDeviceSysFSDirectory const& device, PCI::RegisterOffset offset, size_t field_bytes_width); + static NonnullLockRefPtr create(PCIDeviceSysFSDirectory const& device, PCI::RegisterOffset offset, size_t field_bytes_width); virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override; virtual ~PCIDeviceAttributeSysFSComponent() {}; @@ -25,7 +25,7 @@ public: protected: ErrorOr> try_to_generate_buffer() const; PCIDeviceAttributeSysFSComponent(PCIDeviceSysFSDirectory const& device, PCI::RegisterOffset offset, size_t field_bytes_width); - NonnullRefPtr m_device; + NonnullLockRefPtr m_device; PCI::RegisterOffset m_offset; size_t m_field_bytes_width; }; diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.cpp index 0719d73058..16d4b9dcc1 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.cpp @@ -13,11 +13,11 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr PCIDeviceSysFSDirectory::create(SysFSDirectory const& parent_directory, PCI::Address address) +UNMAP_AFTER_INIT NonnullLockRefPtr PCIDeviceSysFSDirectory::create(SysFSDirectory const& parent_directory, PCI::Address address) { // FIXME: Handle allocation failure gracefully auto device_name = MUST(KString::formatted("{:04x}:{:02x}:{:02x}.{}", address.domain(), address.bus(), address.device(), address.function())); - auto directory = adopt_ref(*new (nothrow) PCIDeviceSysFSDirectory(move(device_name), parent_directory, address)); + auto directory = adopt_lock_ref(*new (nothrow) PCIDeviceSysFSDirectory(move(device_name), parent_directory, address)); MUST(directory->m_child_components.with([&](auto& list) -> ErrorOr { list.append(PCIDeviceAttributeSysFSComponent::create(*directory, PCI::RegisterOffset::VENDOR_ID, 2)); list.append(PCIDeviceAttributeSysFSComponent::create(*directory, PCI::RegisterOffset::DEVICE_ID, 2)); diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.h b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.h index 55fdea729c..14a7fafff1 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.h @@ -14,7 +14,7 @@ namespace Kernel { class PCIDeviceSysFSDirectory final : public SysFSDirectory { public: - static NonnullRefPtr create(SysFSDirectory const&, PCI::Address); + static NonnullLockRefPtr create(SysFSDirectory const&, PCI::Address); PCI::Address const& address() const { return m_address; } virtual StringView name() const override { return m_device_directory_name->view(); } diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.cpp index cf3eda8d7f..29eb531064 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.cpp @@ -40,7 +40,7 @@ UNMAP_AFTER_INIT SysFSUSBBusDirectory::SysFSUSBBusDirectory(SysFSBusDirectory& b UNMAP_AFTER_INIT void SysFSUSBBusDirectory::initialize() { - auto directory = adopt_ref(*new SysFSUSBBusDirectory(SysFSComponentRegistry::the().buses_directory())); + auto directory = adopt_lock_ref(*new SysFSUSBBusDirectory(SysFSComponentRegistry::the().buses_directory())); SysFSComponentRegistry::the().register_new_bus_directory(directory); s_sysfs_usb_bus_directory = directory; } diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.cpp b/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.cpp index d4018a2d02..2fdf5bd7e6 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.cpp @@ -11,10 +11,10 @@ namespace Kernel { -ErrorOr> SysFSUSBDeviceInformation::create(USB::Device& device) +ErrorOr> SysFSUSBDeviceInformation::create(USB::Device& device) { auto device_name = TRY(KString::number(device.address())); - return adopt_nonnull_ref_or_enomem(new (nothrow) SysFSUSBDeviceInformation(move(device_name), device)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFSUSBDeviceInformation(move(device_name), device)); } SysFSUSBDeviceInformation::SysFSUSBDeviceInformation(NonnullOwnPtr device_name, USB::Device& device) diff --git a/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.h b/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.h index afdcf32399..03768e004e 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.h @@ -20,7 +20,7 @@ class SysFSUSBDeviceInformation : public SysFSComponent { public: virtual ~SysFSUSBDeviceInformation() override; - static ErrorOr> create(USB::Device&); + static ErrorOr> create(USB::Device&); virtual StringView name() const override { return m_device_name->view(); } protected: @@ -28,7 +28,7 @@ protected: virtual ErrorOr read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription*) const override; - NonnullRefPtr m_device; + NonnullLockRefPtr m_device; private: ErrorOr try_generate(KBufferBuilder&); diff --git a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/BlockDevicesDirectory.cpp b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/BlockDevicesDirectory.cpp index 234f6d37a5..71d0c4883f 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/BlockDevicesDirectory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/BlockDevicesDirectory.cpp @@ -12,9 +12,9 @@ namespace Kernel { static SysFSBlockDevicesDirectory* s_the { nullptr }; -NonnullRefPtr SysFSBlockDevicesDirectory::must_create(SysFSDeviceIdentifiersDirectory const& devices_directory) +NonnullLockRefPtr SysFSBlockDevicesDirectory::must_create(SysFSDeviceIdentifiersDirectory const& devices_directory) { - return adopt_ref_if_nonnull(new SysFSBlockDevicesDirectory(devices_directory)).release_nonnull(); + return adopt_lock_ref_if_nonnull(new SysFSBlockDevicesDirectory(devices_directory)).release_nonnull(); } SysFSBlockDevicesDirectory::SysFSBlockDevicesDirectory(SysFSDeviceIdentifiersDirectory const& devices_directory) : SysFSDirectory(devices_directory) diff --git a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/BlockDevicesDirectory.h b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/BlockDevicesDirectory.h index c90b5ede67..c883e739f2 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/BlockDevicesDirectory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/BlockDevicesDirectory.h @@ -17,7 +17,7 @@ class SysFSBlockDevicesDirectory final : public SysFSDirectory { public: virtual StringView name() const override { return "block"sv; } - static NonnullRefPtr must_create(SysFSDeviceIdentifiersDirectory const&); + static NonnullLockRefPtr must_create(SysFSDeviceIdentifiersDirectory const&); static SysFSBlockDevicesDirectory& the(); diff --git a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/CharacterDevicesDirectory.cpp b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/CharacterDevicesDirectory.cpp index 4bc3fc6983..2f1cadedb3 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/CharacterDevicesDirectory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/CharacterDevicesDirectory.cpp @@ -12,9 +12,9 @@ namespace Kernel { static SysFSCharacterDevicesDirectory* s_the { nullptr }; -NonnullRefPtr SysFSCharacterDevicesDirectory::must_create(SysFSDeviceIdentifiersDirectory const& devices_directory) +NonnullLockRefPtr SysFSCharacterDevicesDirectory::must_create(SysFSDeviceIdentifiersDirectory const& devices_directory) { - return adopt_ref_if_nonnull(new SysFSCharacterDevicesDirectory(devices_directory)).release_nonnull(); + return adopt_lock_ref_if_nonnull(new SysFSCharacterDevicesDirectory(devices_directory)).release_nonnull(); } SysFSCharacterDevicesDirectory::SysFSCharacterDevicesDirectory(SysFSDeviceIdentifiersDirectory const& devices_directory) : SysFSDirectory(devices_directory) diff --git a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/CharacterDevicesDirectory.h b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/CharacterDevicesDirectory.h index ab22bc5e70..9229c5a055 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/CharacterDevicesDirectory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/CharacterDevicesDirectory.h @@ -17,7 +17,7 @@ class SysFSCharacterDevicesDirectory final : public SysFSDirectory { public: virtual StringView name() const override { return "char"sv; } - static NonnullRefPtr must_create(SysFSDeviceIdentifiersDirectory const&); + static NonnullLockRefPtr must_create(SysFSDeviceIdentifiersDirectory const&); static SysFSCharacterDevicesDirectory& the(); diff --git a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/DeviceComponent.cpp b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/DeviceComponent.cpp index 05cd3b71fd..e8fe2b1a42 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/DeviceComponent.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/DeviceComponent.cpp @@ -10,11 +10,11 @@ namespace Kernel { -NonnullRefPtr SysFSDeviceComponent::must_create(Device const& device) +NonnullLockRefPtr SysFSDeviceComponent::must_create(Device const& device) { // FIXME: Handle allocation failure gracefully auto device_name = MUST(KString::formatted("{}:{}", device.major(), device.minor())); - return adopt_ref_if_nonnull(new SysFSDeviceComponent(move(device_name), device)).release_nonnull(); + return adopt_lock_ref_if_nonnull(new SysFSDeviceComponent(move(device_name), device)).release_nonnull(); } SysFSDeviceComponent::SysFSDeviceComponent(NonnullOwnPtr major_minor_formatted_device_name, Device const& device) : SysFSComponent() diff --git a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/DeviceComponent.h b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/DeviceComponent.h index 3f9650fdc7..e8f4a51bb6 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/DeviceComponent.h +++ b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/DeviceComponent.h @@ -14,12 +14,12 @@ namespace Kernel { class SysFSDeviceComponent final : public SysFSComponent - , public Weakable { + , public LockWeakable { friend class SysFSBlockDevicesDirectory; friend class SysFSCharacterDevicesDirectory; public: - static NonnullRefPtr must_create(Device const&); + static NonnullLockRefPtr must_create(Device const&); virtual StringView name() const override { return m_major_minor_formatted_device_name->view(); } bool is_block_device() const { return m_block_device; } diff --git a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/Directory.cpp b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/Directory.cpp index 3653948246..ea52a3374f 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/Directory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/Directory.cpp @@ -20,9 +20,9 @@ SysFSDeviceIdentifiersDirectory& SysFSDeviceIdentifiersDirectory::the() return *s_the; } -UNMAP_AFTER_INIT NonnullRefPtr SysFSDeviceIdentifiersDirectory::must_create(SysFSRootDirectory const& root_directory) +UNMAP_AFTER_INIT NonnullLockRefPtr SysFSDeviceIdentifiersDirectory::must_create(SysFSRootDirectory const& root_directory) { - auto devices_directory = adopt_ref_if_nonnull(new SysFSDeviceIdentifiersDirectory(root_directory)).release_nonnull(); + auto devices_directory = adopt_lock_ref_if_nonnull(new SysFSDeviceIdentifiersDirectory(root_directory)).release_nonnull(); MUST(devices_directory->m_child_components.with([&](auto& list) -> ErrorOr { list.append(SysFSBlockDevicesDirectory::must_create(*devices_directory)); list.append(SysFSCharacterDevicesDirectory::must_create(*devices_directory)); diff --git a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/Directory.h b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/Directory.h index 9bc56f2fa2..6b5dba7c01 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/Directory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/Directory.h @@ -14,7 +14,7 @@ namespace Kernel { class SysFSDeviceIdentifiersDirectory final : public SysFSDirectory { public: virtual StringView name() const override { return "dev"sv; } - static NonnullRefPtr must_create(SysFSRootDirectory const&); + static NonnullLockRefPtr must_create(SysFSRootDirectory const&); static SysFSDeviceIdentifiersDirectory& the(); diff --git a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/SymbolicLinkDeviceComponent.cpp b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/SymbolicLinkDeviceComponent.cpp index 56725b58bb..53f22785ca 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/SymbolicLinkDeviceComponent.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/SymbolicLinkDeviceComponent.cpp @@ -11,16 +11,16 @@ namespace Kernel { -ErrorOr> SysFSSymbolicLinkDeviceComponent::try_create(SysFSCharacterDevicesDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component) +ErrorOr> SysFSSymbolicLinkDeviceComponent::try_create(SysFSCharacterDevicesDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component) { auto device_name = TRY(KString::formatted("{}:{}", device.major(), device.minor())); - return adopt_nonnull_ref_or_enomem(new (nothrow) SysFSSymbolicLinkDeviceComponent(parent_directory, move(device_name), device, pointed_component)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFSSymbolicLinkDeviceComponent(parent_directory, move(device_name), device, pointed_component)); } -ErrorOr> SysFSSymbolicLinkDeviceComponent::try_create(SysFSBlockDevicesDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component) +ErrorOr> SysFSSymbolicLinkDeviceComponent::try_create(SysFSBlockDevicesDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component) { auto device_name = TRY(KString::formatted("{}:{}", device.major(), device.minor())); - return adopt_nonnull_ref_or_enomem(new (nothrow) SysFSSymbolicLinkDeviceComponent(parent_directory, move(device_name), device, pointed_component)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) SysFSSymbolicLinkDeviceComponent(parent_directory, move(device_name), device, pointed_component)); } SysFSSymbolicLinkDeviceComponent::SysFSSymbolicLinkDeviceComponent(SysFSCharacterDevicesDirectory const& parent_directory, NonnullOwnPtr major_minor_formatted_device_name, Device const& device, SysFSComponent const& pointed_component) diff --git a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/SymbolicLinkDeviceComponent.h b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/SymbolicLinkDeviceComponent.h index c900cca62d..1f9105216a 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/SymbolicLinkDeviceComponent.h +++ b/Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/SymbolicLinkDeviceComponent.h @@ -17,12 +17,12 @@ namespace Kernel { class SysFSDeviceIdentifiersDirectory; class SysFSSymbolicLinkDeviceComponent final : public SysFSSymbolicLink - , public Weakable { + , public LockWeakable { friend class SysFSComponentRegistry; public: - static ErrorOr> try_create(SysFSCharacterDevicesDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component); - static ErrorOr> try_create(SysFSBlockDevicesDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component); + static ErrorOr> try_create(SysFSCharacterDevicesDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component); + static ErrorOr> try_create(SysFSBlockDevicesDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component); virtual StringView name() const override { return m_major_minor_formatted_device_name->view(); } bool is_block_device() const { return m_block_device; } @@ -31,7 +31,7 @@ private: SysFSSymbolicLinkDeviceComponent(SysFSCharacterDevicesDirectory const& parent_directory, NonnullOwnPtr major_minor_formatted_device_name, Device const&, SysFSComponent const& pointed_component); SysFSSymbolicLinkDeviceComponent(SysFSBlockDevicesDirectory const& parent_directory, NonnullOwnPtr major_minor_formatted_device_name, Device const&, SysFSComponent const& pointed_component); - IntrusiveListNode> m_list_node; + IntrusiveListNode> m_list_node; bool const m_block_device { false }; NonnullOwnPtr m_major_minor_formatted_device_name; }; diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.cpp index 0d4178159f..312c0a94b5 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.cpp @@ -12,9 +12,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr SysFSDevicesDirectory::must_create(SysFSRootDirectory const& root_directory) +UNMAP_AFTER_INIT NonnullLockRefPtr SysFSDevicesDirectory::must_create(SysFSRootDirectory const& root_directory) { - auto devices_directory = adopt_ref_if_nonnull(new (nothrow) SysFSDevicesDirectory(root_directory)).release_nonnull(); + auto devices_directory = adopt_lock_ref_if_nonnull(new (nothrow) SysFSDevicesDirectory(root_directory)).release_nonnull(); MUST(devices_directory->m_child_components.with([&](auto& list) -> ErrorOr { list.append(SysFSStorageDirectory::must_create(*devices_directory)); list.append(SysFSGraphicsDirectory::must_create(*devices_directory)); diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.h b/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.h index 0d1e08ba45..04d27be2a4 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.h @@ -14,7 +14,7 @@ namespace Kernel { class SysFSDevicesDirectory final : public SysFSDirectory { public: virtual StringView name() const override { return "devices"sv; } - static NonnullRefPtr must_create(SysFSRootDirectory const&); + static NonnullLockRefPtr must_create(SysFSRootDirectory const&); private: explicit SysFSDevicesDirectory(SysFSRootDirectory const&); diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/Directory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/Directory.cpp index febfbf3b00..43d2c640aa 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/Directory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/Directory.cpp @@ -10,9 +10,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr SysFSGraphicsDirectory::must_create(SysFSDevicesDirectory const& parent_directory) +UNMAP_AFTER_INIT NonnullLockRefPtr SysFSGraphicsDirectory::must_create(SysFSDevicesDirectory const& parent_directory) { - auto directory = adopt_ref(*new (nothrow) SysFSGraphicsDirectory(parent_directory)); + auto directory = adopt_lock_ref(*new (nothrow) SysFSGraphicsDirectory(parent_directory)); MUST(directory->m_child_components.with([&](auto& list) -> ErrorOr { list.append(SysFSDisplayConnectorsDirectory::must_create(*directory)); return {}; diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/Directory.h b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/Directory.h index 7378d0ebfc..528fbd2a8a 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/Directory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/Directory.h @@ -17,7 +17,7 @@ class SysFSGraphicsDirectory : public SysFSDirectory { public: virtual StringView name() const override { return "graphics"sv; } - static NonnullRefPtr must_create(SysFSDevicesDirectory const&); + static NonnullLockRefPtr must_create(SysFSDevicesDirectory const&); private: explicit SysFSGraphicsDirectory(SysFSDevicesDirectory const&); diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceAttribute.cpp b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceAttribute.cpp index 5b7c44b773..7a64c7f9cb 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceAttribute.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceAttribute.cpp @@ -32,9 +32,9 @@ StringView DisplayConnectorAttributeSysFSComponent::name() const } } -NonnullRefPtr DisplayConnectorAttributeSysFSComponent::must_create(DisplayConnectorSysFSDirectory const& device_directory, Type type) +NonnullLockRefPtr DisplayConnectorAttributeSysFSComponent::must_create(DisplayConnectorSysFSDirectory const& device_directory, Type type) { - return adopt_ref(*new (nothrow) DisplayConnectorAttributeSysFSComponent(device_directory, type)); + return adopt_lock_ref(*new (nothrow) DisplayConnectorAttributeSysFSComponent(device_directory, type)); } DisplayConnectorAttributeSysFSComponent::DisplayConnectorAttributeSysFSComponent(DisplayConnectorSysFSDirectory const& device_directory, Type type) diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceAttribute.h b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceAttribute.h index f1db9cb30a..56f106cf3e 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceAttribute.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceAttribute.h @@ -25,7 +25,7 @@ public: }; public: - static NonnullRefPtr must_create(DisplayConnectorSysFSDirectory const& device_directory, Type); + static NonnullLockRefPtr must_create(DisplayConnectorSysFSDirectory const& device_directory, Type); virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override; virtual ~DisplayConnectorAttributeSysFSComponent() {}; @@ -35,7 +35,7 @@ public: protected: ErrorOr> try_to_generate_buffer() const; DisplayConnectorAttributeSysFSComponent(DisplayConnectorSysFSDirectory const& device, Type); - NonnullRefPtr m_device; + NonnullLockRefPtr m_device; Type const m_type { Type::MutableModeSettingCapable }; }; diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceDirectory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceDirectory.cpp index 0256417821..6bf3236528 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceDirectory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceDirectory.cpp @@ -19,11 +19,11 @@ DisplayConnector const& DisplayConnectorSysFSDirectory::device(Badge DisplayConnectorSysFSDirectory::create(SysFSDirectory const& parent_directory, DisplayConnector const& device) +UNMAP_AFTER_INIT NonnullLockRefPtr DisplayConnectorSysFSDirectory::create(SysFSDirectory const& parent_directory, DisplayConnector const& device) { // FIXME: Handle allocation failure gracefully auto device_name = MUST(KString::formatted("{}", device.minor())); - auto directory = adopt_ref(*new (nothrow) DisplayConnectorSysFSDirectory(move(device_name), parent_directory, device)); + auto directory = adopt_lock_ref(*new (nothrow) DisplayConnectorSysFSDirectory(move(device_name), parent_directory, device)); MUST(directory->m_child_components.with([&](auto& list) -> ErrorOr { list.append(DisplayConnectorAttributeSysFSComponent::must_create(*directory, DisplayConnectorAttributeSysFSComponent::Type::MutableModeSettingCapable)); list.append(DisplayConnectorAttributeSysFSComponent::must_create(*directory, DisplayConnectorAttributeSysFSComponent::Type::DoubleFrameBufferingCapable)); diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceDirectory.h b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceDirectory.h index 5ff79a007a..45d48af637 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceDirectory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceDirectory.h @@ -15,7 +15,7 @@ namespace Kernel { class DisplayConnectorAttributeSysFSComponent; class DisplayConnectorSysFSDirectory final : public SysFSDirectory { public: - static NonnullRefPtr create(SysFSDirectory const&, DisplayConnector const&); + static NonnullLockRefPtr create(SysFSDirectory const&, DisplayConnector const&); virtual StringView name() const override { return m_device_directory_name->view(); } @@ -23,7 +23,7 @@ public: private: DisplayConnectorSysFSDirectory(NonnullOwnPtr device_directory_name, SysFSDirectory const&, DisplayConnector const&); - RefPtr m_device; + LockRefPtr m_device; NonnullOwnPtr m_device_directory_name; }; diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/Directory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/Directory.cpp index 1d897e153b..a2fc29c97f 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/Directory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/Directory.cpp @@ -16,9 +16,9 @@ namespace Kernel { static SysFSDisplayConnectorsDirectory* s_the { nullptr }; -UNMAP_AFTER_INIT NonnullRefPtr SysFSDisplayConnectorsDirectory::must_create(SysFSGraphicsDirectory const& parent_directory) +UNMAP_AFTER_INIT NonnullLockRefPtr SysFSDisplayConnectorsDirectory::must_create(SysFSGraphicsDirectory const& parent_directory) { - auto directory = adopt_ref(*new (nothrow) SysFSDisplayConnectorsDirectory(parent_directory)); + auto directory = adopt_lock_ref(*new (nothrow) SysFSDisplayConnectorsDirectory(parent_directory)); s_the = directory; return directory; } diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/Directory.h b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/Directory.h index 04038277d1..3924ff1615 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/Directory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/Directory.h @@ -20,7 +20,7 @@ class SysFSDisplayConnectorsDirectory : public SysFSDirectory { public: virtual StringView name() const override { return "connectors"sv; } static SysFSDisplayConnectorsDirectory& the(); - static NonnullRefPtr must_create(SysFSGraphicsDirectory const&); + static NonnullLockRefPtr must_create(SysFSGraphicsDirectory const&); void plug(Badge, DisplayConnectorSysFSDirectory&); void unplug(Badge, SysFSDirectory&); diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceAttribute.cpp b/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceAttribute.cpp index d21ba3ba95..e053444d31 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceAttribute.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceAttribute.cpp @@ -26,9 +26,9 @@ StringView StorageDeviceAttributeSysFSComponent::name() const } } -NonnullRefPtr StorageDeviceAttributeSysFSComponent::must_create(StorageDeviceSysFSDirectory const& device_directory, Type type) +NonnullLockRefPtr StorageDeviceAttributeSysFSComponent::must_create(StorageDeviceSysFSDirectory const& device_directory, Type type) { - return adopt_ref(*new (nothrow) StorageDeviceAttributeSysFSComponent(device_directory, type)); + return adopt_lock_ref(*new (nothrow) StorageDeviceAttributeSysFSComponent(device_directory, type)); } StorageDeviceAttributeSysFSComponent::StorageDeviceAttributeSysFSComponent(StorageDeviceSysFSDirectory const& device_directory, Type type) diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceAttribute.h b/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceAttribute.h index 9682fb0172..2145cbdf13 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceAttribute.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceAttribute.h @@ -21,7 +21,7 @@ public: }; public: - static NonnullRefPtr must_create(StorageDeviceSysFSDirectory const& device_directory, Type); + static NonnullLockRefPtr must_create(StorageDeviceSysFSDirectory const& device_directory, Type); virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override; virtual ~StorageDeviceAttributeSysFSComponent() {}; @@ -31,7 +31,7 @@ public: protected: ErrorOr> try_to_generate_buffer() const; StorageDeviceAttributeSysFSComponent(StorageDeviceSysFSDirectory const& device, Type); - NonnullRefPtr m_device; + NonnullLockRefPtr m_device; Type const m_type { Type::EndLBA }; }; diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceDirectory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceDirectory.cpp index 1e0bf34f74..8cdac379f0 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceDirectory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceDirectory.cpp @@ -19,12 +19,12 @@ StorageDevice const& StorageDeviceSysFSDirectory::device(Badge StorageDeviceSysFSDirectory::create(SysFSDirectory const& parent_directory, StorageDevice const& device) +UNMAP_AFTER_INIT NonnullLockRefPtr StorageDeviceSysFSDirectory::create(SysFSDirectory const& parent_directory, StorageDevice const& device) { // FIXME: Handle allocation failure gracefully auto lun_address = device.logical_unit_number_address(); auto device_name = MUST(KString::formatted("{:02x}:{:02x}.{}", lun_address.controller_id, lun_address.target_id, lun_address.disk_id)); - auto directory = adopt_ref(*new (nothrow) StorageDeviceSysFSDirectory(move(device_name), parent_directory, device)); + auto directory = adopt_lock_ref(*new (nothrow) StorageDeviceSysFSDirectory(move(device_name), parent_directory, device)); MUST(directory->m_child_components.with([&](auto& list) -> ErrorOr { list.append(StorageDeviceAttributeSysFSComponent::must_create(*directory, StorageDeviceAttributeSysFSComponent::Type::EndLBA)); list.append(StorageDeviceAttributeSysFSComponent::must_create(*directory, StorageDeviceAttributeSysFSComponent::Type::SectorSize)); diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceDirectory.h b/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceDirectory.h index b06ed67ad9..69b5cc4c2f 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceDirectory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceDirectory.h @@ -15,7 +15,7 @@ namespace Kernel { class StorageDeviceAttributeSysFSComponent; class StorageDeviceSysFSDirectory final : public SysFSDirectory { public: - static NonnullRefPtr create(SysFSDirectory const&, StorageDevice const&); + static NonnullLockRefPtr create(SysFSDirectory const&, StorageDevice const&); virtual StringView name() const override { return m_device_directory_name->view(); } @@ -23,7 +23,7 @@ public: private: StorageDeviceSysFSDirectory(NonnullOwnPtr device_directory_name, SysFSDirectory const&, StorageDevice const&); - RefPtr m_device; + LockRefPtr m_device; NonnullOwnPtr m_device_directory_name; }; diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/Directory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/Directory.cpp index 8bd4c2ace8..de08cb76bd 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/Directory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/Directory.cpp @@ -15,9 +15,9 @@ namespace Kernel { static SysFSStorageDirectory* s_the { nullptr }; -UNMAP_AFTER_INIT NonnullRefPtr SysFSStorageDirectory::must_create(SysFSDevicesDirectory const& parent_directory) +UNMAP_AFTER_INIT NonnullLockRefPtr SysFSStorageDirectory::must_create(SysFSDevicesDirectory const& parent_directory) { - auto directory = adopt_ref(*new (nothrow) SysFSStorageDirectory(parent_directory)); + auto directory = adopt_lock_ref(*new (nothrow) SysFSStorageDirectory(parent_directory)); s_the = directory; return directory; } diff --git a/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/Directory.h b/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/Directory.h index 80170fb901..8d59ae52e9 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/Directory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/Directory.h @@ -19,7 +19,7 @@ class SysFSStorageDirectory : public SysFSDirectory { public: virtual StringView name() const override { return "storage"sv; } static SysFSStorageDirectory& the(); - static NonnullRefPtr must_create(SysFSDevicesDirectory const&); + static NonnullLockRefPtr must_create(SysFSDevicesDirectory const&); void plug(Badge, StorageDeviceSysFSDirectory&); void unplug(Badge, SysFSDirectory&); diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp index b503116e7f..2399a6cf3c 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp @@ -15,9 +15,9 @@ namespace Kernel { -NonnullRefPtr BIOSSysFSComponent::must_create(Type type, PhysicalAddress blob_paddr, size_t blob_size) +NonnullLockRefPtr BIOSSysFSComponent::must_create(Type type, PhysicalAddress blob_paddr, size_t blob_size) { - return adopt_ref_if_nonnull(new (nothrow) BIOSSysFSComponent(type, blob_paddr, blob_size)).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) BIOSSysFSComponent(type, blob_paddr, blob_size)).release_nonnull(); } UNMAP_AFTER_INIT BIOSSysFSComponent::BIOSSysFSComponent(Type type, PhysicalAddress blob_paddr, size_t blob_size) diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h index a58ec9fc7c..3fb2a61a35 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h @@ -6,11 +6,11 @@ #pragma once -#include #include #include #include #include +#include #include namespace Kernel { @@ -23,7 +23,7 @@ public: }; public: - static NonnullRefPtr must_create(Type, PhysicalAddress, size_t blob_size); + static NonnullLockRefPtr must_create(Type, PhysicalAddress, size_t blob_size); virtual StringView name() const override; virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override; diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp index bc1532bd94..74ca730793 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp @@ -39,9 +39,9 @@ UNMAP_AFTER_INIT void BIOSSysFSDirectory::set_dmi_32_bit_entry_initialization_va m_smbios_structure_table_length = smbios_entry.ptr()->legacy_structure.smbios_table_length; } -UNMAP_AFTER_INIT NonnullRefPtr BIOSSysFSDirectory::must_create(FirmwareSysFSDirectory& firmware_directory) +UNMAP_AFTER_INIT NonnullLockRefPtr BIOSSysFSDirectory::must_create(FirmwareSysFSDirectory& firmware_directory) { - auto bios_directory = MUST(adopt_nonnull_ref_or_enomem(new (nothrow) BIOSSysFSDirectory(firmware_directory))); + auto bios_directory = MUST(adopt_nonnull_lock_ref_or_enomem(new (nothrow) BIOSSysFSDirectory(firmware_directory))); bios_directory->create_components(); return bios_directory; } diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h index 40f63c9f50..fc1bb87390 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h @@ -6,11 +6,11 @@ #pragma once -#include #include #include #include #include +#include #include namespace Kernel { @@ -18,7 +18,7 @@ namespace Kernel { class BIOSSysFSDirectory : public SysFSDirectory { public: virtual StringView name() const override { return "bios"sv; } - static NonnullRefPtr must_create(FirmwareSysFSDirectory&); + static NonnullLockRefPtr must_create(FirmwareSysFSDirectory&); void create_components(); diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp index 3b481971fc..adbc110da0 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp @@ -15,7 +15,7 @@ namespace Kernel { UNMAP_AFTER_INIT void FirmwareSysFSDirectory::initialize() { - auto firmware_directory = adopt_ref_if_nonnull(new (nothrow) FirmwareSysFSDirectory()).release_nonnull(); + auto firmware_directory = adopt_lock_ref_if_nonnull(new (nothrow) FirmwareSysFSDirectory()).release_nonnull(); SysFSComponentRegistry::the().register_new_component(firmware_directory); firmware_directory->create_components(); } diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.cpp b/Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.cpp index 31e51608bc..51beb59dee 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.cpp +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.cpp @@ -20,9 +20,9 @@ mode_t PowerStateSwitchNode::permissions() const return S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP; } -UNMAP_AFTER_INIT NonnullRefPtr PowerStateSwitchNode::must_create(FirmwareSysFSDirectory& firmware_directory) +UNMAP_AFTER_INIT NonnullLockRefPtr PowerStateSwitchNode::must_create(FirmwareSysFSDirectory& firmware_directory) { - return adopt_ref_if_nonnull(new (nothrow) PowerStateSwitchNode(firmware_directory)).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) PowerStateSwitchNode(firmware_directory)).release_nonnull(); } UNMAP_AFTER_INIT PowerStateSwitchNode::PowerStateSwitchNode(FirmwareSysFSDirectory&) diff --git a/Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.h b/Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.h index 771455dc84..c7a79eaef5 100644 --- a/Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.h +++ b/Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.h @@ -7,12 +7,12 @@ #pragma once -#include #include #include #include #include #include +#include #include #include #include @@ -23,7 +23,7 @@ namespace Kernel { class PowerStateSwitchNode final : public SysFSComponent { public: virtual StringView name() const override { return "power_state"sv; } - static NonnullRefPtr must_create(FirmwareSysFSDirectory&); + static NonnullLockRefPtr must_create(FirmwareSysFSDirectory&); virtual mode_t permissions() const override; virtual ErrorOr write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) override; virtual ErrorOr truncate(u64) override; diff --git a/Kernel/FileSystem/TmpFS.cpp b/Kernel/FileSystem/TmpFS.cpp index a0dbf463f3..bbdd340a65 100644 --- a/Kernel/FileSystem/TmpFS.cpp +++ b/Kernel/FileSystem/TmpFS.cpp @@ -10,9 +10,9 @@ namespace Kernel { -ErrorOr> TmpFS::try_create() +ErrorOr> TmpFS::try_create() { - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) TmpFS)); + return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) TmpFS)); } TmpFS::TmpFS() = default; @@ -37,7 +37,7 @@ unsigned TmpFS::next_inode_index() return m_next_inode_index++; } -TmpFSInode::TmpFSInode(TmpFS& fs, InodeMetadata const& metadata, WeakPtr parent) +TmpFSInode::TmpFSInode(TmpFS& fs, InodeMetadata const& metadata, LockWeakPtr parent) : Inode(fs, fs.next_inode_index()) , m_metadata(metadata) , m_parent(move(parent)) @@ -47,12 +47,12 @@ TmpFSInode::TmpFSInode(TmpFS& fs, InodeMetadata const& metadata, WeakPtr> TmpFSInode::try_create(TmpFS& fs, InodeMetadata const& metadata, WeakPtr parent) +ErrorOr> TmpFSInode::try_create(TmpFS& fs, InodeMetadata const& metadata, LockWeakPtr parent) { - return adopt_nonnull_ref_or_enomem(new (nothrow) TmpFSInode(fs, metadata, move(parent))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) TmpFSInode(fs, metadata, move(parent))); } -ErrorOr> TmpFSInode::try_create_root(TmpFS& fs) +ErrorOr> TmpFSInode::try_create_root(TmpFS& fs) { InodeMetadata metadata; auto now = kgettimeofday().to_truncated_seconds(); @@ -147,7 +147,7 @@ ErrorOr TmpFSInode::write_bytes(off_t offset, size_t size, UserOrKernelB return size; } -ErrorOr> TmpFSInode::lookup(StringView name) +ErrorOr> TmpFSInode::lookup(StringView name) { MutexLocker locker(m_inode_lock, Mutex::Mode::Shared); VERIFY(is_directory()); @@ -205,7 +205,7 @@ ErrorOr TmpFSInode::chown(UserID uid, GroupID gid) return {}; } -ErrorOr> TmpFSInode::create_child(StringView name, mode_t mode, dev_t dev, UserID uid, GroupID gid) +ErrorOr> TmpFSInode::create_child(StringView name, mode_t mode, dev_t dev, UserID uid, GroupID gid) { MutexLocker locker(m_inode_lock); diff --git a/Kernel/FileSystem/TmpFS.h b/Kernel/FileSystem/TmpFS.h index a6269aec05..5ec0e632dc 100644 --- a/Kernel/FileSystem/TmpFS.h +++ b/Kernel/FileSystem/TmpFS.h @@ -19,7 +19,7 @@ class TmpFS final : public FileSystem { public: virtual ~TmpFS() override; - static ErrorOr> try_create(); + static ErrorOr> try_create(); virtual ErrorOr initialize() override; virtual StringView class_name() const override { return "TmpFS"sv; } @@ -31,7 +31,7 @@ public: private: TmpFS(); - RefPtr m_root_inode; + LockRefPtr m_root_inode; unsigned m_next_inode_index { 1 }; unsigned next_inode_index(); @@ -50,10 +50,10 @@ public: virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override; virtual InodeMetadata metadata() const override; virtual ErrorOr traverse_as_directory(Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual ErrorOr> lookup(StringView name) override; + virtual ErrorOr> lookup(StringView name) override; virtual ErrorOr flush_metadata() override; virtual ErrorOr write_bytes(off_t, size_t, UserOrKernelBuffer const& buffer, OpenFileDescription*) override; - virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; + virtual ErrorOr> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override; virtual ErrorOr add_child(Inode&, StringView name, mode_t) override; virtual ErrorOr remove_child(StringView name) override; virtual ErrorOr chmod(mode_t) override; @@ -64,13 +64,13 @@ public: virtual ErrorOr set_mtime(time_t) override; private: - TmpFSInode(TmpFS& fs, InodeMetadata const& metadata, WeakPtr parent); - static ErrorOr> try_create(TmpFS&, InodeMetadata const& metadata, WeakPtr parent); - static ErrorOr> try_create_root(TmpFS&); + TmpFSInode(TmpFS& fs, InodeMetadata const& metadata, LockWeakPtr parent); + static ErrorOr> try_create(TmpFS&, InodeMetadata const& metadata, LockWeakPtr parent); + static ErrorOr> try_create_root(TmpFS&); struct Child { NonnullOwnPtr name; - NonnullRefPtr inode; + NonnullLockRefPtr inode; IntrusiveListNode list_node {}; using List = IntrusiveList<&Child::list_node>; }; @@ -78,7 +78,7 @@ private: Child* find_child_by_name(StringView); InodeMetadata m_metadata; - WeakPtr m_parent; + LockWeakPtr m_parent; OwnPtr m_content; diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp index 162f79e843..d995c29299 100644 --- a/Kernel/FileSystem/VirtualFileSystem.cpp +++ b/Kernel/FileSystem/VirtualFileSystem.cpp @@ -239,12 +239,12 @@ ErrorOr VirtualFileSystem::lookup_metadata(StringView path, Custo return custody->inode().metadata(); } -ErrorOr> VirtualFileSystem::open(StringView path, int options, mode_t mode, Custody& base, Optional owner) +ErrorOr> VirtualFileSystem::open(StringView path, int options, mode_t mode, Custody& base, Optional owner) { if ((options & O_CREAT) && (options & O_DIRECTORY)) return EINVAL; - RefPtr parent_custody; + LockRefPtr parent_custody; auto custody_or_error = resolve_path(path, base, &parent_custody, options); if (custody_or_error.is_error()) { // NOTE: ENOENT with a non-null parent custody signals us that the immediate parent @@ -332,7 +332,7 @@ ErrorOr VirtualFileSystem::mknod(StringView path, mode_t mode, dev_t dev, if (!is_regular_file(mode) && !is_block_device(mode) && !is_character_device(mode) && !is_fifo(mode) && !is_socket(mode)) return EINVAL; - RefPtr parent_custody; + LockRefPtr parent_custody; auto existing_file_or_error = resolve_path(path, base, &parent_custody); if (!existing_file_or_error.is_error()) return EEXIST; @@ -353,7 +353,7 @@ ErrorOr VirtualFileSystem::mknod(StringView path, mode_t mode, dev_t dev, return {}; } -ErrorOr> VirtualFileSystem::create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional owner) +ErrorOr> VirtualFileSystem::create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional owner) { auto basename = KLexicalPath::basename(path); auto parent_path = TRY(parent_custody.try_serialize_absolute_path()); @@ -397,7 +397,7 @@ ErrorOr VirtualFileSystem::mkdir(StringView path, mode_t mode, Custody& ba path = "/"sv; } - RefPtr parent_custody; + LockRefPtr parent_custody; // FIXME: The errors returned by resolve_path_without_veil can leak information about paths that are not unveiled, // e.g. when the error is EACCESS or similar. auto result = resolve_path_without_veil(path, base, &parent_custody); @@ -446,7 +446,7 @@ ErrorOr VirtualFileSystem::access(StringView path, int mode, Custody& base return {}; } -ErrorOr> VirtualFileSystem::open_directory(StringView path, Custody& base) +ErrorOr> VirtualFileSystem::open_directory(StringView path, Custody& base) { auto custody = TRY(resolve_path(path, base)); auto& inode = custody->inode(); @@ -480,11 +480,11 @@ ErrorOr VirtualFileSystem::chmod(StringView path, mode_t mode, Custody& ba ErrorOr VirtualFileSystem::rename(StringView old_path, StringView new_path, Custody& base) { - RefPtr old_parent_custody; + LockRefPtr old_parent_custody; auto old_custody = TRY(resolve_path(old_path, base, &old_parent_custody, O_NOFOLLOW_NOERROR)); auto& old_inode = old_custody->inode(); - RefPtr new_parent_custody; + LockRefPtr new_parent_custody; auto new_custody_or_error = resolve_path(new_path, base, &new_parent_custody); if (new_custody_or_error.is_error()) { if (new_custody_or_error.error().code() != ENOENT || !new_parent_custody) @@ -630,7 +630,7 @@ ErrorOr VirtualFileSystem::link(StringView old_path, StringView new_path, auto old_custody = TRY(resolve_path(old_path, base)); auto& old_inode = old_custody->inode(); - RefPtr parent_custody; + LockRefPtr parent_custody; auto new_custody_or_error = resolve_path(new_path, base, &parent_custody); if (!new_custody_or_error.is_error()) return EEXIST; @@ -660,7 +660,7 @@ ErrorOr VirtualFileSystem::link(StringView old_path, StringView new_path, ErrorOr VirtualFileSystem::unlink(StringView path, Custody& base) { - RefPtr parent_custody; + LockRefPtr parent_custody; auto custody = TRY(resolve_path(path, base, &parent_custody, O_NOFOLLOW_NOERROR | O_UNLINK_INTERNAL)); auto& inode = custody->inode(); @@ -690,7 +690,7 @@ ErrorOr VirtualFileSystem::unlink(StringView path, Custody& base) ErrorOr VirtualFileSystem::symlink(StringView target, StringView linkpath, Custody& base) { - RefPtr parent_custody; + LockRefPtr parent_custody; auto existing_custody_or_error = resolve_path(linkpath, base, &parent_custody); if (!existing_custody_or_error.is_error()) return EEXIST; @@ -719,7 +719,7 @@ ErrorOr VirtualFileSystem::symlink(StringView target, StringView linkpath, ErrorOr VirtualFileSystem::rmdir(StringView path, Custody& base) { - RefPtr parent_custody; + LockRefPtr parent_custody; auto custody = TRY(resolve_path(path, base, &parent_custody)); auto& inode = custody->inode(); @@ -871,7 +871,7 @@ ErrorOr VirtualFileSystem::validate_path_against_process_veil(StringView p return {}; } -ErrorOr> VirtualFileSystem::resolve_path(StringView path, Custody& base, RefPtr* out_parent, int options, int symlink_recursion_level) +ErrorOr> VirtualFileSystem::resolve_path(StringView path, Custody& base, LockRefPtr* out_parent, int options, int symlink_recursion_level) { // FIXME: The errors returned by resolve_path_without_veil can leak information about paths that are not unveiled, // e.g. when the error is EACCESS or similar. @@ -899,7 +899,7 @@ static bool safe_to_follow_symlink(Inode const& inode, InodeMetadata const& pare return false; } -ErrorOr> VirtualFileSystem::resolve_path_without_veil(StringView path, Custody& base, RefPtr* out_parent, int options, int symlink_recursion_level) +ErrorOr> VirtualFileSystem::resolve_path_without_veil(StringView path, Custody& base, LockRefPtr* out_parent, int options, int symlink_recursion_level) { if (symlink_recursion_level >= symlink_recursion_limit) return ELOOP; @@ -910,7 +910,7 @@ ErrorOr> VirtualFileSystem::resolve_path_without_veil(Str GenericLexer path_lexer(path); auto& current_process = Process::current(); - NonnullRefPtr custody = path[0] == '/' ? root_custody() : base; + NonnullLockRefPtr custody = path[0] == '/' ? root_custody() : base; bool extra_iteration = path[path.length() - 1] == '/'; while (!path_lexer.is_eof() || extra_iteration) { diff --git a/Kernel/FileSystem/VirtualFileSystem.h b/Kernel/FileSystem/VirtualFileSystem.h index f7c186b36e..a9b358eb01 100644 --- a/Kernel/FileSystem/VirtualFileSystem.h +++ b/Kernel/FileSystem/VirtualFileSystem.h @@ -12,13 +12,13 @@ #include #include #include -#include #include #include #include #include #include #include +#include #include namespace Kernel { @@ -50,8 +50,8 @@ public: ErrorOr remount(Custody& mount_point, int new_flags); ErrorOr unmount(Inode& guest_inode); - ErrorOr> open(StringView path, int options, mode_t mode, Custody& base, Optional = {}); - ErrorOr> create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional = {}); + ErrorOr> open(StringView path, int options, mode_t mode, Custody& base, Optional = {}); + ErrorOr> create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional = {}); ErrorOr mkdir(StringView path, mode_t mode, Custody& base); ErrorOr link(StringView old_path, StringView new_path, Custody& base); ErrorOr unlink(StringView path, Custody& base); @@ -67,7 +67,7 @@ public: ErrorOr utimensat(StringView path, Custody& base, timespec const& atime, timespec const& mtime, int options = 0); ErrorOr rename(StringView oldpath, StringView newpath, Custody& base); ErrorOr mknod(StringView path, mode_t, dev_t, Custody& base); - ErrorOr> open_directory(StringView path, Custody& base); + ErrorOr> open_directory(StringView path, Custody& base); ErrorOr for_each_mount(Function(Mount const&)>) const; @@ -76,8 +76,8 @@ public: static void sync(); Custody& root_custody(); - ErrorOr> resolve_path(StringView path, Custody& base, RefPtr* out_parent = nullptr, int options = 0, int symlink_recursion_level = 0); - ErrorOr> resolve_path_without_veil(StringView path, Custody& base, RefPtr* out_parent = nullptr, int options = 0, int symlink_recursion_level = 0); + ErrorOr> resolve_path(StringView path, Custody& base, LockRefPtr* out_parent = nullptr, int options = 0, int symlink_recursion_level = 0); + ErrorOr> resolve_path_without_veil(StringView path, Custody& base, LockRefPtr* out_parent = nullptr, int options = 0, int symlink_recursion_level = 0); private: friend class OpenFileDescription; @@ -95,8 +95,8 @@ private: Mount* find_mount_for_host(InodeIdentifier); Mount* find_mount_for_guest(InodeIdentifier); - RefPtr m_root_inode; - RefPtr m_root_custody; + LockRefPtr m_root_inode; + LockRefPtr m_root_custody; SpinlockProtected> m_mounts { LockRank::None }; }; diff --git a/Kernel/Firmware/ACPI/Parser.cpp b/Kernel/Firmware/ACPI/Parser.cpp index 04f94f766e..0afc5ce03d 100644 --- a/Kernel/Firmware/ACPI/Parser.cpp +++ b/Kernel/Firmware/ACPI/Parser.cpp @@ -35,11 +35,11 @@ void Parser::must_initialize(PhysicalAddress rsdp, PhysicalAddress fadt, u8 irq_ VERIFY(s_acpi_parser); } -UNMAP_AFTER_INIT NonnullRefPtr ACPISysFSComponent::create(StringView name, PhysicalAddress paddr, size_t table_size) +UNMAP_AFTER_INIT NonnullLockRefPtr ACPISysFSComponent::create(StringView name, PhysicalAddress paddr, size_t table_size) { // FIXME: Handle allocation failure gracefully auto table_name = KString::must_create(name); - return adopt_ref(*new (nothrow) ACPISysFSComponent(move(table_name), paddr, table_size)); + return adopt_lock_ref(*new (nothrow) ACPISysFSComponent(move(table_name), paddr, table_size)); } ErrorOr ACPISysFSComponent::read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription*) const @@ -97,9 +97,9 @@ UNMAP_AFTER_INIT void ACPISysFSDirectory::find_tables_and_register_them_as_compo })); } -UNMAP_AFTER_INIT NonnullRefPtr ACPISysFSDirectory::must_create(FirmwareSysFSDirectory& firmware_directory) +UNMAP_AFTER_INIT NonnullLockRefPtr ACPISysFSDirectory::must_create(FirmwareSysFSDirectory& firmware_directory) { - auto acpi_directory = MUST(adopt_nonnull_ref_or_enomem(new (nothrow) ACPISysFSDirectory(firmware_directory))); + auto acpi_directory = MUST(adopt_nonnull_lock_ref_or_enomem(new (nothrow) ACPISysFSDirectory(firmware_directory))); acpi_directory->find_tables_and_register_them_as_components(); return acpi_directory; } diff --git a/Kernel/Firmware/ACPI/Parser.h b/Kernel/Firmware/ACPI/Parser.h index e345db6a1f..25239f8a93 100644 --- a/Kernel/Firmware/ACPI/Parser.h +++ b/Kernel/Firmware/ACPI/Parser.h @@ -6,7 +6,6 @@ #pragma once -#include #include #include #include @@ -14,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -24,7 +24,7 @@ namespace Kernel::ACPI { class ACPISysFSDirectory : public SysFSDirectory { public: virtual StringView name() const override { return "acpi"sv; } - static NonnullRefPtr must_create(FirmwareSysFSDirectory& firmware_directory); + static NonnullLockRefPtr must_create(FirmwareSysFSDirectory& firmware_directory); private: void find_tables_and_register_them_as_components(); @@ -33,7 +33,7 @@ private: class ACPISysFSComponent : public SysFSComponent { public: - static NonnullRefPtr create(StringView name, PhysicalAddress, size_t table_size); + static NonnullLockRefPtr create(StringView name, PhysicalAddress, size_t table_size); virtual StringView name() const override { return m_table_name->view(); } virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override; diff --git a/Kernel/GlobalProcessExposed.cpp b/Kernel/GlobalProcessExposed.cpp index dc0c0eba55..7ef025e8f7 100644 --- a/Kernel/GlobalProcessExposed.cpp +++ b/Kernel/GlobalProcessExposed.cpp @@ -37,7 +37,7 @@ namespace Kernel { class ProcFSAdapters final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSAdapters(); @@ -74,7 +74,7 @@ private: class ProcFSARP final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSARP(); @@ -99,7 +99,7 @@ private: class ProcFSRoute final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSRoute(); @@ -128,7 +128,7 @@ private: class ProcFSTCP final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSTCP(); @@ -165,7 +165,7 @@ private: class ProcFSLocalNet final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSLocalNet(); @@ -191,7 +191,7 @@ private: class ProcFSUDP final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSUDP(); @@ -221,7 +221,7 @@ private: class ProcFSNetworkDirectory : public ProcFSExposedDirectory { public: - static NonnullRefPtr must_create(ProcFSRootDirectory const& parent_directory); + static NonnullLockRefPtr must_create(ProcFSRootDirectory const& parent_directory); private: ProcFSNetworkDirectory(ProcFSRootDirectory const& parent_directory); @@ -229,40 +229,40 @@ private: class ProcFSSystemDirectory : public ProcFSExposedDirectory { public: - static NonnullRefPtr must_create(ProcFSRootDirectory const& parent_directory); + static NonnullLockRefPtr must_create(ProcFSRootDirectory const& parent_directory); private: ProcFSSystemDirectory(ProcFSRootDirectory const& parent_directory); }; -UNMAP_AFTER_INIT NonnullRefPtr ProcFSAdapters::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSAdapters::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSAdapters).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSAdapters).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSARP::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSARP::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSARP).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSARP).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSRoute::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSRoute::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSRoute).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSRoute).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSTCP::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSTCP::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSTCP).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSTCP).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSLocalNet::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSLocalNet::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSLocalNet).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSLocalNet).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSUDP::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSUDP::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSUDP).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSUDP).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSNetworkDirectory::must_create(ProcFSRootDirectory const& parent_directory) +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSNetworkDirectory::must_create(ProcFSRootDirectory const& parent_directory) { - auto directory = adopt_ref(*new (nothrow) ProcFSNetworkDirectory(parent_directory)); + auto directory = adopt_lock_ref(*new (nothrow) ProcFSNetworkDirectory(parent_directory)); directory->m_components.append(ProcFSAdapters::must_create()); directory->m_components.append(ProcFSARP::must_create()); directory->m_components.append(ProcFSRoute::must_create()); @@ -303,7 +303,7 @@ UNMAP_AFTER_INIT ProcFSNetworkDirectory::ProcFSNetworkDirectory(ProcFSRootDirect class ProcFSDumpKmallocStacks : public ProcFSSystemBoolean { public: - static NonnullRefPtr must_create(ProcFSSystemDirectory const&); + static NonnullLockRefPtr must_create(ProcFSSystemDirectory const&); virtual bool value() const override { MutexLocker locker(m_lock); @@ -322,7 +322,7 @@ private: class ProcFSUBSanDeadly : public ProcFSSystemBoolean { public: - static NonnullRefPtr must_create(ProcFSSystemDirectory const&); + static NonnullLockRefPtr must_create(ProcFSSystemDirectory const&); virtual bool value() const override { return AK::UBSanitizer::g_ubsan_is_deadly; } virtual void set_value(bool new_value) override { AK::UBSanitizer::g_ubsan_is_deadly = new_value; } @@ -333,7 +333,7 @@ private: class ProcFSCapsLockRemap : public ProcFSSystemBoolean { public: - static NonnullRefPtr must_create(ProcFSSystemDirectory const&); + static NonnullLockRefPtr must_create(ProcFSSystemDirectory const&); virtual bool value() const override { MutexLocker locker(m_lock); @@ -350,17 +350,17 @@ private: mutable Mutex m_lock; }; -UNMAP_AFTER_INIT NonnullRefPtr ProcFSDumpKmallocStacks::must_create(ProcFSSystemDirectory const&) +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSDumpKmallocStacks::must_create(ProcFSSystemDirectory const&) { - return adopt_ref_if_nonnull(new (nothrow) ProcFSDumpKmallocStacks).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSDumpKmallocStacks).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSUBSanDeadly::must_create(ProcFSSystemDirectory const&) +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSUBSanDeadly::must_create(ProcFSSystemDirectory const&) { - return adopt_ref_if_nonnull(new (nothrow) ProcFSUBSanDeadly).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSUBSanDeadly).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSCapsLockRemap::must_create(ProcFSSystemDirectory const&) +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSCapsLockRemap::must_create(ProcFSSystemDirectory const&) { - return adopt_ref_if_nonnull(new (nothrow) ProcFSCapsLockRemap).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSCapsLockRemap).release_nonnull(); } UNMAP_AFTER_INIT ProcFSDumpKmallocStacks::ProcFSDumpKmallocStacks() @@ -380,7 +380,7 @@ UNMAP_AFTER_INIT ProcFSCapsLockRemap::ProcFSCapsLockRemap() class ProcFSSelfProcessDirectory final : public ProcFSExposedLink { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSSelfProcessDirectory(); @@ -392,7 +392,7 @@ private: class ProcFSDiskUsage final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSDiskUsage(); @@ -430,7 +430,7 @@ private: class ProcFSMemoryStatus final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSMemoryStatus(); @@ -459,7 +459,7 @@ private: class ProcFSSystemStatistics final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSSystemStatistics(); @@ -482,7 +482,7 @@ private: class ProcFSOverallProcesses final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSOverallProcesses(); @@ -600,7 +600,7 @@ private: }; class ProcFSCPUInformation final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSCPUInformation(); @@ -665,7 +665,7 @@ private: }; class ProcFSDmesg final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); virtual mode_t required_mode() const override { return 0400; } @@ -683,7 +683,7 @@ private: }; class ProcFSInterrupts final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSInterrupts(); @@ -713,7 +713,7 @@ private: }; class ProcFSKeymap final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSKeymap(); @@ -730,7 +730,7 @@ private: class ProcFSDevices final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSDevices(); @@ -758,7 +758,7 @@ private: }; class ProcFSUptime final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSUptime(); @@ -769,7 +769,7 @@ private: }; class ProcFSCommandLine final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSCommandLine(); @@ -782,7 +782,7 @@ private: }; class ProcFSSystemMode final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSSystemMode(); @@ -796,7 +796,7 @@ private: class ProcFSProfile final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); virtual mode_t required_mode() const override { return 0400; } @@ -813,7 +813,7 @@ private: class ProcFSKernelBase final : public ProcFSGlobalInformation { public: - static NonnullRefPtr must_create(); + static NonnullLockRefPtr must_create(); private: ProcFSKernelBase(); @@ -828,66 +828,66 @@ private: } }; -UNMAP_AFTER_INIT NonnullRefPtr ProcFSSelfProcessDirectory::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSSelfProcessDirectory::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSSelfProcessDirectory()).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSSelfProcessDirectory()).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSDiskUsage::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSDiskUsage::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSDiskUsage).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSDiskUsage).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSMemoryStatus::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSMemoryStatus::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSMemoryStatus).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSMemoryStatus).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSSystemStatistics::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSSystemStatistics::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSSystemStatistics).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSSystemStatistics).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSOverallProcesses::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSOverallProcesses::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSOverallProcesses).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSOverallProcesses).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSCPUInformation::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSCPUInformation::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSCPUInformation).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSCPUInformation).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSDmesg::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSDmesg::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSDmesg).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSDmesg).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSInterrupts::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSInterrupts::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSInterrupts).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSInterrupts).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSKeymap::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSKeymap::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSKeymap).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSKeymap).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSDevices::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSDevices::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSDevices).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSDevices).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSUptime::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSUptime::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSUptime).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSUptime).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSCommandLine::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSCommandLine::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSCommandLine).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSCommandLine).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSSystemMode::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSSystemMode::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSSystemMode).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSSystemMode).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSProfile::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSProfile::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSProfile).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSProfile).release_nonnull(); } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSKernelBase::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSKernelBase::must_create() { - return adopt_ref_if_nonnull(new (nothrow) ProcFSKernelBase).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) ProcFSKernelBase).release_nonnull(); } UNMAP_AFTER_INIT ProcFSSelfProcessDirectory::ProcFSSelfProcessDirectory() @@ -952,9 +952,9 @@ UNMAP_AFTER_INIT ProcFSKernelBase::ProcFSKernelBase() { } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSSystemDirectory::must_create(ProcFSRootDirectory const& parent_directory) +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSSystemDirectory::must_create(ProcFSRootDirectory const& parent_directory) { - auto directory = adopt_ref(*new (nothrow) ProcFSSystemDirectory(parent_directory)); + auto directory = adopt_lock_ref(*new (nothrow) ProcFSSystemDirectory(parent_directory)); directory->m_components.append(ProcFSDumpKmallocStacks::must_create(directory)); directory->m_components.append(ProcFSUBSanDeadly::must_create(directory)); directory->m_components.append(ProcFSCapsLockRemap::must_create(directory)); @@ -966,9 +966,9 @@ UNMAP_AFTER_INIT ProcFSSystemDirectory::ProcFSSystemDirectory(ProcFSRootDirector { } -UNMAP_AFTER_INIT NonnullRefPtr ProcFSRootDirectory::must_create() +UNMAP_AFTER_INIT NonnullLockRefPtr ProcFSRootDirectory::must_create() { - auto directory = adopt_ref(*new (nothrow) ProcFSRootDirectory); + auto directory = adopt_lock_ref(*new (nothrow) ProcFSRootDirectory); directory->m_components.append(ProcFSSelfProcessDirectory::must_create()); directory->m_components.append(ProcFSDiskUsage::must_create()); directory->m_components.append(ProcFSMemoryStatus::must_create()); @@ -1013,7 +1013,7 @@ ErrorOr ProcFSRootDirectory::traverse_as_directory(FileSystemID fsid, Func }); } -ErrorOr> ProcFSRootDirectory::lookup(StringView name) +ErrorOr> ProcFSRootDirectory::lookup(StringView name) { auto maybe_candidate = ProcFSExposedDirectory::lookup(name); if (maybe_candidate.is_error()) { diff --git a/Kernel/Graphics/Bochs/DisplayConnector.cpp b/Kernel/Graphics/Bochs/DisplayConnector.cpp index b51bb2b329..62e9b99ed5 100644 --- a/Kernel/Graphics/Bochs/DisplayConnector.cpp +++ b/Kernel/Graphics/Bochs/DisplayConnector.cpp @@ -14,7 +14,7 @@ namespace Kernel { -NonnullRefPtr BochsDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, bool virtual_box_hardware) +NonnullLockRefPtr BochsDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, bool virtual_box_hardware) { auto device_or_error = DeviceManagement::try_create_device(framebuffer_address, framebuffer_resource_size); VERIFY(!device_or_error.is_error()); diff --git a/Kernel/Graphics/Bochs/DisplayConnector.h b/Kernel/Graphics/Bochs/DisplayConnector.h index 6f73484763..4359b4aecf 100644 --- a/Kernel/Graphics/Bochs/DisplayConnector.h +++ b/Kernel/Graphics/Bochs/DisplayConnector.h @@ -6,11 +6,11 @@ #pragma once -#include #include #include #include #include +#include #include #include @@ -24,7 +24,7 @@ class BochsDisplayConnector public: AK_TYPEDEF_DISTINCT_ORDERED_ID(u16, IndexID); - static NonnullRefPtr must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, bool virtual_box_hardware); + static NonnullLockRefPtr must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, bool virtual_box_hardware); virtual IndexID index_id() const; @@ -50,6 +50,6 @@ protected: virtual void enable_console() override final; virtual void disable_console() override final; - RefPtr m_framebuffer_console; + LockRefPtr m_framebuffer_console; }; } diff --git a/Kernel/Graphics/Bochs/GraphicsAdapter.cpp b/Kernel/Graphics/Bochs/GraphicsAdapter.cpp index e974c812a8..0a1d161a48 100644 --- a/Kernel/Graphics/Bochs/GraphicsAdapter.cpp +++ b/Kernel/Graphics/Bochs/GraphicsAdapter.cpp @@ -22,11 +22,11 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr BochsGraphicsAdapter::initialize(PCI::DeviceIdentifier const& pci_device_identifier) +UNMAP_AFTER_INIT NonnullLockRefPtr BochsGraphicsAdapter::initialize(PCI::DeviceIdentifier const& pci_device_identifier) { PCI::HardwareID id = pci_device_identifier.hardware_id(); VERIFY((id.vendor_id == PCI::VendorID::QEMUOld && id.device_id == 0x1111) || (id.vendor_id == PCI::VendorID::VirtualBox && id.device_id == 0xbeef)); - auto adapter = adopt_ref(*new BochsGraphicsAdapter(pci_device_identifier)); + auto adapter = adopt_lock_ref(*new BochsGraphicsAdapter(pci_device_identifier)); MUST(adapter->initialize_adapter(pci_device_identifier)); return adapter; } diff --git a/Kernel/Graphics/Bochs/GraphicsAdapter.h b/Kernel/Graphics/Bochs/GraphicsAdapter.h index 12376a4c83..d5ba3910f8 100644 --- a/Kernel/Graphics/Bochs/GraphicsAdapter.h +++ b/Kernel/Graphics/Bochs/GraphicsAdapter.h @@ -25,7 +25,7 @@ class BochsGraphicsAdapter final : public GenericGraphicsAdapter friend class GraphicsManagement; public: - static NonnullRefPtr initialize(PCI::DeviceIdentifier const&); + static NonnullLockRefPtr initialize(PCI::DeviceIdentifier const&); virtual ~BochsGraphicsAdapter() = default; private: @@ -33,6 +33,6 @@ private: explicit BochsGraphicsAdapter(PCI::DeviceIdentifier const&); - RefPtr m_display_connector; + LockRefPtr m_display_connector; }; } diff --git a/Kernel/Graphics/Bochs/QEMUDisplayConnector.cpp b/Kernel/Graphics/Bochs/QEMUDisplayConnector.cpp index 1f76222a56..d74f788ef8 100644 --- a/Kernel/Graphics/Bochs/QEMUDisplayConnector.cpp +++ b/Kernel/Graphics/Bochs/QEMUDisplayConnector.cpp @@ -12,7 +12,7 @@ namespace Kernel { -NonnullRefPtr QEMUDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping registers_mapping) +NonnullLockRefPtr QEMUDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping registers_mapping) { auto device_or_error = DeviceManagement::try_create_device(framebuffer_address, framebuffer_resource_size, move(registers_mapping)); VERIFY(!device_or_error.is_error()); diff --git a/Kernel/Graphics/Bochs/QEMUDisplayConnector.h b/Kernel/Graphics/Bochs/QEMUDisplayConnector.h index 9486d1e663..b08cc1b47b 100644 --- a/Kernel/Graphics/Bochs/QEMUDisplayConnector.h +++ b/Kernel/Graphics/Bochs/QEMUDisplayConnector.h @@ -6,10 +6,10 @@ #pragma once -#include #include #include #include +#include #include #include @@ -22,7 +22,7 @@ class QEMUDisplayConnector final friend class DeviceManagement; public: - static NonnullRefPtr must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping); + static NonnullLockRefPtr must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping); virtual IndexID index_id() const override; diff --git a/Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp b/Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp index ab252d39ef..2480dc81bf 100644 --- a/Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp +++ b/Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp @@ -9,9 +9,9 @@ namespace Kernel::Graphics { -NonnullRefPtr ContiguousFramebufferConsole::initialize(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch) +NonnullLockRefPtr ContiguousFramebufferConsole::initialize(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch) { - return adopt_ref(*new ContiguousFramebufferConsole(framebuffer_address, width, height, pitch)); + return adopt_lock_ref(*new ContiguousFramebufferConsole(framebuffer_address, width, height, pitch)); } ContiguousFramebufferConsole::ContiguousFramebufferConsole(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch) diff --git a/Kernel/Graphics/Console/ContiguousFramebufferConsole.h b/Kernel/Graphics/Console/ContiguousFramebufferConsole.h index 692631635f..4a31851b8b 100644 --- a/Kernel/Graphics/Console/ContiguousFramebufferConsole.h +++ b/Kernel/Graphics/Console/ContiguousFramebufferConsole.h @@ -12,7 +12,7 @@ namespace Kernel::Graphics { class ContiguousFramebufferConsole final : public GenericFramebufferConsole { public: - static NonnullRefPtr initialize(PhysicalAddress, size_t width, size_t height, size_t pitch); + static NonnullLockRefPtr initialize(PhysicalAddress, size_t width, size_t height, size_t pitch); virtual void set_resolution(size_t width, size_t height, size_t pitch) override; virtual void flush(size_t, size_t, size_t, size_t) override { } diff --git a/Kernel/Graphics/Console/VGATextModeConsole.cpp b/Kernel/Graphics/Console/VGATextModeConsole.cpp index 3b0fd9dee8..f410f93ec8 100644 --- a/Kernel/Graphics/Console/VGATextModeConsole.cpp +++ b/Kernel/Graphics/Console/VGATextModeConsole.cpp @@ -11,11 +11,11 @@ namespace Kernel::Graphics { -UNMAP_AFTER_INIT NonnullRefPtr VGATextModeConsole::initialize() +UNMAP_AFTER_INIT NonnullLockRefPtr VGATextModeConsole::initialize() { auto vga_window_size = MUST(Memory::page_round_up(0xc0000 - 0xa0000)); auto vga_window_region = MUST(MM.allocate_kernel_region(PhysicalAddress(0xa0000), vga_window_size, "VGA Display"sv, Memory::Region::Access::ReadWrite)); - return adopt_ref(*new (nothrow) VGATextModeConsole(move(vga_window_region))); + return adopt_lock_ref(*new (nothrow) VGATextModeConsole(move(vga_window_region))); } UNMAP_AFTER_INIT VGATextModeConsole::VGATextModeConsole(NonnullOwnPtr vga_window_region) diff --git a/Kernel/Graphics/Console/VGATextModeConsole.h b/Kernel/Graphics/Console/VGATextModeConsole.h index 2cc08a9861..75a669771a 100644 --- a/Kernel/Graphics/Console/VGATextModeConsole.h +++ b/Kernel/Graphics/Console/VGATextModeConsole.h @@ -13,7 +13,7 @@ namespace Kernel::Graphics { class VGATextModeConsole final : public Console { public: - static NonnullRefPtr initialize(); + static NonnullLockRefPtr initialize(); virtual size_t chars_per_line() const override { return width(); }; virtual bool has_hardware_cursor() const override { return true; } diff --git a/Kernel/Graphics/DisplayConnector.h b/Kernel/Graphics/DisplayConnector.h index 763e45176a..240684bd77 100644 --- a/Kernel/Graphics/DisplayConnector.h +++ b/Kernel/Graphics/DisplayConnector.h @@ -162,11 +162,11 @@ protected: size_t const m_framebuffer_resource_size; private: - RefPtr m_shared_framebuffer_vmobject; + LockRefPtr m_shared_framebuffer_vmobject; - WeakPtr m_responsible_process; + LockWeakPtr m_responsible_process; Spinlock m_responsible_process_lock { LockRank::None }; - IntrusiveListNode> m_list_node; + IntrusiveListNode> m_list_node; }; } diff --git a/Kernel/Graphics/Generic/DisplayConnector.cpp b/Kernel/Graphics/Generic/DisplayConnector.cpp index 26d79d43cc..299aedb7db 100644 --- a/Kernel/Graphics/Generic/DisplayConnector.cpp +++ b/Kernel/Graphics/Generic/DisplayConnector.cpp @@ -13,7 +13,7 @@ namespace Kernel { -NonnullRefPtr GenericDisplayConnector::must_create_with_preset_resolution(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch) +NonnullLockRefPtr GenericDisplayConnector::must_create_with_preset_resolution(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch) { auto device_or_error = DeviceManagement::try_create_device(framebuffer_address, width, height, pitch); VERIFY(!device_or_error.is_error()); diff --git a/Kernel/Graphics/Generic/DisplayConnector.h b/Kernel/Graphics/Generic/DisplayConnector.h index 2cf6deac76..c593e4def7 100644 --- a/Kernel/Graphics/Generic/DisplayConnector.h +++ b/Kernel/Graphics/Generic/DisplayConnector.h @@ -6,10 +6,10 @@ #pragma once -#include #include #include #include +#include #include #include @@ -20,7 +20,7 @@ class GenericDisplayConnector friend class DeviceManagement; public: - static NonnullRefPtr must_create_with_preset_resolution(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch); + static NonnullLockRefPtr must_create_with_preset_resolution(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch); protected: ErrorOr create_attached_framebuffer_console(); @@ -47,6 +47,6 @@ protected: virtual void enable_console() override final; virtual void disable_console() override final; - RefPtr m_framebuffer_console; + LockRefPtr m_framebuffer_console; }; } diff --git a/Kernel/Graphics/GenericGraphicsAdapter.h b/Kernel/Graphics/GenericGraphicsAdapter.h index 13944ca106..b2fa69e7ea 100644 --- a/Kernel/Graphics/GenericGraphicsAdapter.h +++ b/Kernel/Graphics/GenericGraphicsAdapter.h @@ -7,15 +7,15 @@ #pragma once #include -#include #include #include +#include #include namespace Kernel { class GenericGraphicsAdapter : public AtomicRefCounted - , public Weakable { + , public LockWeakable { public: virtual ~GenericGraphicsAdapter() = default; diff --git a/Kernel/Graphics/GraphicsManagement.cpp b/Kernel/Graphics/GraphicsManagement.cpp index c38b04bb55..025a3370f8 100644 --- a/Kernel/Graphics/GraphicsManagement.cpp +++ b/Kernel/Graphics/GraphicsManagement.cpp @@ -126,7 +126,7 @@ static inline bool is_display_controller_pci_device(PCI::DeviceIdentifier const& UNMAP_AFTER_INIT bool GraphicsManagement::determine_and_initialize_graphics_device(PCI::DeviceIdentifier const& device_identifier) { VERIFY(is_vga_compatible_pci_device(device_identifier) || is_display_controller_pci_device(device_identifier)); - RefPtr adapter; + LockRefPtr adapter; if (!adapter) { switch (device_identifier.hardware_id().vendor_id) { diff --git a/Kernel/Graphics/GraphicsManagement.h b/Kernel/Graphics/GraphicsManagement.h index 33c015efec..28ffd32737 100644 --- a/Kernel/Graphics/GraphicsManagement.h +++ b/Kernel/Graphics/GraphicsManagement.h @@ -7,8 +7,6 @@ #pragma once #include -#include -#include #include #include #include @@ -16,6 +14,8 @@ #include #include #include +#include +#include #include namespace Kernel { @@ -37,7 +37,7 @@ public: void disable_vga_text_mode_console_cursor(); void disable_vga_emulation_access_permanently(); - RefPtr console() const { return m_console; } + LockRefPtr console() const { return m_console; } void set_console(Graphics::Console&); void deactivate_graphical_mode(); @@ -50,11 +50,11 @@ private: void initialize_preset_resolution_generic_display_connector(); - NonnullRefPtrVector m_graphics_devices; - RefPtr m_console; + NonnullLockRefPtrVector m_graphics_devices; + LockRefPtr m_console; // Note: This is only used when booting with kernel commandline that includes "graphics_subsystem_mode=limited" - RefPtr m_preset_resolution_generic_display_connector; + LockRefPtr m_preset_resolution_generic_display_connector; unsigned m_current_minor_number { 0 }; diff --git a/Kernel/Graphics/Intel/NativeDisplayConnector.cpp b/Kernel/Graphics/Intel/NativeDisplayConnector.cpp index c0b1e85c05..b0710b3ea9 100644 --- a/Kernel/Graphics/Intel/NativeDisplayConnector.cpp +++ b/Kernel/Graphics/Intel/NativeDisplayConnector.cpp @@ -175,7 +175,7 @@ Optional IntelNativeDisplayConnector::create_pll_set return {}; } -NonnullRefPtr IntelNativeDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, PhysicalAddress registers_region_address, size_t registers_region_length) +NonnullLockRefPtr IntelNativeDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, PhysicalAddress registers_region_address, size_t registers_region_length) { auto registers_region = MUST(MM.allocate_kernel_region(PhysicalAddress(registers_region_address), registers_region_length, "Intel Native Graphics Registers"sv, Memory::Region::Access::ReadWrite)); auto device_or_error = DeviceManagement::try_create_device(framebuffer_address, framebuffer_resource_size, move(registers_region)); diff --git a/Kernel/Graphics/Intel/NativeDisplayConnector.h b/Kernel/Graphics/Intel/NativeDisplayConnector.h index b71995dbb9..a5d77a20b1 100644 --- a/Kernel/Graphics/Intel/NativeDisplayConnector.h +++ b/Kernel/Graphics/Intel/NativeDisplayConnector.h @@ -6,11 +6,11 @@ #pragma once -#include #include #include #include #include +#include #include namespace Kernel { @@ -81,7 +81,7 @@ class IntelNativeDisplayConnector final friend class DeviceManagement; public: - static NonnullRefPtr must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, PhysicalAddress registers_region_address, size_t registers_region_length); + static NonnullLockRefPtr must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, PhysicalAddress registers_region_address, size_t registers_region_length); private: // ^DisplayConnector @@ -155,7 +155,7 @@ private: Optional create_pll_settings(u64 target_frequency, u64 reference_clock, IntelGraphics::PLLMaxSettings const&); mutable Spinlock m_registers_lock { LockRank::None }; - RefPtr m_framebuffer_console; + LockRefPtr m_framebuffer_console; const PhysicalAddress m_registers; NonnullOwnPtr m_registers_region; diff --git a/Kernel/Graphics/Intel/NativeGraphicsAdapter.cpp b/Kernel/Graphics/Intel/NativeGraphicsAdapter.cpp index f5e14989f4..eb627a1f1d 100644 --- a/Kernel/Graphics/Intel/NativeGraphicsAdapter.cpp +++ b/Kernel/Graphics/Intel/NativeGraphicsAdapter.cpp @@ -27,12 +27,12 @@ static bool is_supported_model(u16 device_id) return false; } -RefPtr IntelNativeGraphicsAdapter::initialize(PCI::DeviceIdentifier const& pci_device_identifier) +LockRefPtr IntelNativeGraphicsAdapter::initialize(PCI::DeviceIdentifier const& pci_device_identifier) { VERIFY(pci_device_identifier.hardware_id().vendor_id == 0x8086); if (!is_supported_model(pci_device_identifier.hardware_id().device_id)) return {}; - auto adapter = adopt_ref(*new IntelNativeGraphicsAdapter(pci_device_identifier.address())); + auto adapter = adopt_lock_ref(*new IntelNativeGraphicsAdapter(pci_device_identifier.address())); MUST(adapter->initialize_adapter()); return adapter; } diff --git a/Kernel/Graphics/Intel/NativeGraphicsAdapter.h b/Kernel/Graphics/Intel/NativeGraphicsAdapter.h index cc7dec7ad9..dc8a72c5e8 100644 --- a/Kernel/Graphics/Intel/NativeGraphicsAdapter.h +++ b/Kernel/Graphics/Intel/NativeGraphicsAdapter.h @@ -20,7 +20,7 @@ class IntelNativeGraphicsAdapter final , public PCI::Device { public: - static RefPtr initialize(PCI::DeviceIdentifier const&); + static LockRefPtr initialize(PCI::DeviceIdentifier const&); virtual ~IntelNativeGraphicsAdapter() = default; @@ -29,6 +29,6 @@ private: explicit IntelNativeGraphicsAdapter(PCI::Address); - RefPtr m_display_connector; + LockRefPtr m_display_connector; }; } diff --git a/Kernel/Graphics/VMWare/Console.cpp b/Kernel/Graphics/VMWare/Console.cpp index badef5d531..ee5e451024 100644 --- a/Kernel/Graphics/VMWare/Console.cpp +++ b/Kernel/Graphics/VMWare/Console.cpp @@ -11,10 +11,10 @@ namespace Kernel { constexpr static AK::Time refresh_interval = AK::Time::from_milliseconds(16); -NonnullRefPtr VMWareFramebufferConsole::initialize(VMWareDisplayConnector& parent_display_connector) +NonnullLockRefPtr VMWareFramebufferConsole::initialize(VMWareDisplayConnector& parent_display_connector) { auto current_resolution = parent_display_connector.current_mode_setting(); - return adopt_ref(*new (nothrow) VMWareFramebufferConsole(parent_display_connector, current_resolution)); + return adopt_lock_ref(*new (nothrow) VMWareFramebufferConsole(parent_display_connector, current_resolution)); } VMWareFramebufferConsole::VMWareFramebufferConsole(VMWareDisplayConnector const& parent_display_connector, DisplayConnector::ModeSetting current_resolution) @@ -39,7 +39,7 @@ void VMWareFramebufferConsole::flush(size_t, size_t, size_t, size_t) void VMWareFramebufferConsole::enqueue_refresh_timer() { - NonnullRefPtr refresh_timer = adopt_ref(*new (nothrow) Timer()); + NonnullLockRefPtr refresh_timer = adopt_lock_ref(*new (nothrow) Timer()); refresh_timer->setup(CLOCK_MONOTONIC, refresh_interval, [this]() { if (m_enabled.load() && m_dirty) { MUST(g_io_work->try_queue([this]() { diff --git a/Kernel/Graphics/VMWare/Console.h b/Kernel/Graphics/VMWare/Console.h index cb095976c8..0624e427bb 100644 --- a/Kernel/Graphics/VMWare/Console.h +++ b/Kernel/Graphics/VMWare/Console.h @@ -14,7 +14,7 @@ namespace Kernel { class VMWareFramebufferConsole final : public Graphics::GenericFramebufferConsole { public: - static NonnullRefPtr initialize(VMWareDisplayConnector& parent_display_connector); + static NonnullLockRefPtr initialize(VMWareDisplayConnector& parent_display_connector); virtual void set_resolution(size_t width, size_t height, size_t pitch) override; virtual void flush(size_t x, size_t y, size_t width, size_t height) override; @@ -25,7 +25,7 @@ private: virtual u8* framebuffer_data() override; VMWareFramebufferConsole(VMWareDisplayConnector const& parent_display_connector, DisplayConnector::ModeSetting current_resolution); - RefPtr m_parent_display_connector; + LockRefPtr m_parent_display_connector; bool m_dirty { false }; }; diff --git a/Kernel/Graphics/VMWare/DisplayConnector.cpp b/Kernel/Graphics/VMWare/DisplayConnector.cpp index 651d93ec60..9df08f4b81 100644 --- a/Kernel/Graphics/VMWare/DisplayConnector.cpp +++ b/Kernel/Graphics/VMWare/DisplayConnector.cpp @@ -12,7 +12,7 @@ namespace Kernel { -NonnullRefPtr VMWareDisplayConnector::must_create(VMWareGraphicsAdapter const& parent_adapter, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size) +NonnullLockRefPtr VMWareDisplayConnector::must_create(VMWareGraphicsAdapter const& parent_adapter, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size) { auto connector = MUST(DeviceManagement::try_create_device(parent_adapter, framebuffer_address, framebuffer_resource_size)); MUST(connector->create_attached_framebuffer_console()); diff --git a/Kernel/Graphics/VMWare/DisplayConnector.h b/Kernel/Graphics/VMWare/DisplayConnector.h index 6f60653fd1..8bda8cf174 100644 --- a/Kernel/Graphics/VMWare/DisplayConnector.h +++ b/Kernel/Graphics/VMWare/DisplayConnector.h @@ -6,11 +6,11 @@ #pragma once -#include #include #include #include #include +#include #include #include @@ -23,7 +23,7 @@ class VMWareDisplayConnector : public DisplayConnector { friend class DeviceManagement; public: - static NonnullRefPtr must_create(VMWareGraphicsAdapter const& parent_adapter, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size); + static NonnullLockRefPtr must_create(VMWareGraphicsAdapter const& parent_adapter, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size); private: VMWareDisplayConnector(VMWareGraphicsAdapter const& parent_adapter, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size); @@ -48,7 +48,7 @@ private: virtual void disable_console() override; private: - NonnullRefPtr m_parent_adapter; - RefPtr m_framebuffer_console; + NonnullLockRefPtr m_parent_adapter; + LockRefPtr m_framebuffer_console; }; } diff --git a/Kernel/Graphics/VMWare/GraphicsAdapter.cpp b/Kernel/Graphics/VMWare/GraphicsAdapter.cpp index 3ccf87a363..2bec2ac401 100644 --- a/Kernel/Graphics/VMWare/GraphicsAdapter.cpp +++ b/Kernel/Graphics/VMWare/GraphicsAdapter.cpp @@ -21,14 +21,14 @@ namespace Kernel { -UNMAP_AFTER_INIT RefPtr VMWareGraphicsAdapter::try_initialize(PCI::DeviceIdentifier const& pci_device_identifier) +UNMAP_AFTER_INIT LockRefPtr VMWareGraphicsAdapter::try_initialize(PCI::DeviceIdentifier const& pci_device_identifier) { PCI::HardwareID id = pci_device_identifier.hardware_id(); VERIFY(id.vendor_id == PCI::VendorID::VMWare); // Note: We only support VMWare SVGA II adapter if (id.device_id != 0x0405) return {}; - auto adapter = MUST(adopt_nonnull_ref_or_enomem(new (nothrow) VMWareGraphicsAdapter(pci_device_identifier))); + auto adapter = MUST(adopt_nonnull_lock_ref_or_enomem(new (nothrow) VMWareGraphicsAdapter(pci_device_identifier))); MUST(adapter->initialize_adapter()); return adapter; } diff --git a/Kernel/Graphics/VMWare/GraphicsAdapter.h b/Kernel/Graphics/VMWare/GraphicsAdapter.h index 9ef605c6d9..8872e992a9 100644 --- a/Kernel/Graphics/VMWare/GraphicsAdapter.h +++ b/Kernel/Graphics/VMWare/GraphicsAdapter.h @@ -26,7 +26,7 @@ class VMWareGraphicsAdapter final friend class GraphicsManagement; public: - static RefPtr try_initialize(PCI::DeviceIdentifier const&); + static LockRefPtr try_initialize(PCI::DeviceIdentifier const&); virtual ~VMWareGraphicsAdapter() = default; ErrorOr modeset_primary_screen_resolution(Badge, size_t width, size_t height); @@ -49,7 +49,7 @@ private: explicit VMWareGraphicsAdapter(PCI::DeviceIdentifier const&); Memory::TypedMapping m_fifo_registers; - RefPtr m_display_connector; + LockRefPtr m_display_connector; const IOAddress m_io_registers_base; mutable Spinlock m_io_access_lock { LockRank::None }; mutable RecursiveSpinlock m_operation_lock { LockRank::None }; diff --git a/Kernel/Graphics/VirtIOGPU/Console.cpp b/Kernel/Graphics/VirtIOGPU/Console.cpp index 5d33a5c403..e2962fa858 100644 --- a/Kernel/Graphics/VirtIOGPU/Console.cpp +++ b/Kernel/Graphics/VirtIOGPU/Console.cpp @@ -11,10 +11,10 @@ namespace Kernel::Graphics::VirtIOGPU { constexpr static AK::Time refresh_interval = AK::Time::from_milliseconds(16); -NonnullRefPtr Console::initialize(VirtIODisplayConnector& parent_display_connector) +NonnullLockRefPtr Console::initialize(VirtIODisplayConnector& parent_display_connector) { auto current_resolution = parent_display_connector.current_mode_setting(); - return adopt_ref(*new Console(parent_display_connector, current_resolution)); + return adopt_lock_ref(*new Console(parent_display_connector, current_resolution)); } Console::Console(VirtIODisplayConnector const& parent_display_connector, DisplayConnector::ModeSetting current_resolution) @@ -36,7 +36,7 @@ void Console::flush(size_t, size_t, size_t, size_t) void Console::enqueue_refresh_timer() { - NonnullRefPtr refresh_timer = adopt_ref(*new Timer()); + NonnullLockRefPtr refresh_timer = adopt_lock_ref(*new Timer()); refresh_timer->setup(CLOCK_MONOTONIC, refresh_interval, [this]() { if (m_enabled.load() && m_dirty) { MUST(g_io_work->try_queue([this]() { diff --git a/Kernel/Graphics/VirtIOGPU/Console.h b/Kernel/Graphics/VirtIOGPU/Console.h index a84c354967..d798eff1a2 100644 --- a/Kernel/Graphics/VirtIOGPU/Console.h +++ b/Kernel/Graphics/VirtIOGPU/Console.h @@ -14,7 +14,7 @@ namespace Kernel::Graphics::VirtIOGPU { class Console final : public GenericFramebufferConsole { public: - static NonnullRefPtr initialize(VirtIODisplayConnector& parent_display_connector); + static NonnullLockRefPtr initialize(VirtIODisplayConnector& parent_display_connector); virtual void set_resolution(size_t width, size_t height, size_t pitch) override; virtual void flush(size_t x, size_t y, size_t width, size_t height) override; @@ -25,7 +25,7 @@ private: virtual u8* framebuffer_data() override; Console(VirtIODisplayConnector const& parent_display_connector, DisplayConnector::ModeSetting current_resolution); - NonnullRefPtr m_parent_display_connector; + NonnullLockRefPtr m_parent_display_connector; bool m_dirty { false }; }; diff --git a/Kernel/Graphics/VirtIOGPU/DisplayConnector.cpp b/Kernel/Graphics/VirtIOGPU/DisplayConnector.cpp index e7f8fe2671..b72c0ddc11 100644 --- a/Kernel/Graphics/VirtIOGPU/DisplayConnector.cpp +++ b/Kernel/Graphics/VirtIOGPU/DisplayConnector.cpp @@ -15,7 +15,7 @@ namespace Kernel { -NonnullRefPtr VirtIODisplayConnector::must_create(VirtIOGraphicsAdapter& graphics_adapter, Graphics::VirtIOGPU::ScanoutID scanout_id) +NonnullLockRefPtr VirtIODisplayConnector::must_create(VirtIOGraphicsAdapter& graphics_adapter, Graphics::VirtIOGPU::ScanoutID scanout_id) { auto device_or_error = DeviceManagement::try_create_device(graphics_adapter, scanout_id); VERIFY(!device_or_error.is_error()); diff --git a/Kernel/Graphics/VirtIOGPU/DisplayConnector.h b/Kernel/Graphics/VirtIOGPU/DisplayConnector.h index 0584df94a7..82d23edc4c 100644 --- a/Kernel/Graphics/VirtIOGPU/DisplayConnector.h +++ b/Kernel/Graphics/VirtIOGPU/DisplayConnector.h @@ -30,7 +30,7 @@ class VirtIODisplayConnector final : public DisplayConnector { friend class DeviceManagement; public: - static NonnullRefPtr must_create(VirtIOGraphicsAdapter& graphics_adapter, Graphics::VirtIOGPU::ScanoutID scanout_id); + static NonnullLockRefPtr must_create(VirtIOGraphicsAdapter& graphics_adapter, Graphics::VirtIOGPU::ScanoutID scanout_id); void set_edid_bytes(Badge, Array const& edid_bytes); void set_safe_mode_setting_after_initialization(Badge); @@ -81,8 +81,8 @@ private: // Context used for kernel operations (e.g. flushing resources to scanout) Graphics::VirtIOGPU::ContextID m_kernel_context_id; - NonnullRefPtr m_graphics_adapter; - RefPtr m_console; + NonnullLockRefPtr m_graphics_adapter; + LockRefPtr m_console; Graphics::VirtIOGPU::Protocol::DisplayInfoResponse::Display m_display_info {}; Graphics::VirtIOGPU::ScanoutID m_scanout_id; diff --git a/Kernel/Graphics/VirtIOGPU/GPU3DDevice.cpp b/Kernel/Graphics/VirtIOGPU/GPU3DDevice.cpp index acc93f5e5a..90f0fcc4dc 100644 --- a/Kernel/Graphics/VirtIOGPU/GPU3DDevice.cpp +++ b/Kernel/Graphics/VirtIOGPU/GPU3DDevice.cpp @@ -21,7 +21,7 @@ VirtIOGPU3DDevice::PerContextState::PerContextState(Graphics::VirtIOGPU::Context { } -NonnullRefPtr VirtIOGPU3DDevice::must_create(VirtIOGraphicsAdapter const& adapter) +NonnullLockRefPtr VirtIOGPU3DDevice::must_create(VirtIOGraphicsAdapter const& adapter) { // Setup memory transfer region auto region_result = MM.allocate_kernel_region( @@ -48,7 +48,7 @@ void VirtIOGPU3DDevice::detach(OpenFileDescription& description) CharacterDevice::detach(description); } -ErrorOr> VirtIOGPU3DDevice::get_context_for_description(OpenFileDescription& description) +ErrorOr> VirtIOGPU3DDevice::get_context_for_description(OpenFileDescription& description) { auto res = m_context_state_lookup.get(&description); if (!res.has_value()) @@ -66,7 +66,7 @@ ErrorOr VirtIOGPU3DDevice::ioctl(OpenFileDescription& description, unsigne SpinlockLocker locker(m_graphics_adapter->operation_lock()); // TODO: Delete the context if it fails to be set in m_context_state_lookup auto context_id = m_graphics_adapter->create_context(); - RefPtr per_context_state = TRY(PerContextState::try_create(context_id)); + LockRefPtr per_context_state = TRY(PerContextState::try_create(context_id)); TRY(m_context_state_lookup.try_set(&description, per_context_state)); return {}; } diff --git a/Kernel/Graphics/VirtIOGPU/GPU3DDevice.h b/Kernel/Graphics/VirtIOGPU/GPU3DDevice.h index 20b75d9c1c..6fcefd7cd8 100644 --- a/Kernel/Graphics/VirtIOGPU/GPU3DDevice.h +++ b/Kernel/Graphics/VirtIOGPU/GPU3DDevice.h @@ -95,21 +95,21 @@ class VirtIOGPU3DDevice : public CharacterDevice { friend class DeviceManagement; public: - static NonnullRefPtr must_create(VirtIOGraphicsAdapter const&); + static NonnullLockRefPtr must_create(VirtIOGraphicsAdapter const&); private: VirtIOGPU3DDevice(VirtIOGraphicsAdapter const& graphics_adapter, NonnullOwnPtr transfer_buffer_region); class PerContextState final : public AtomicRefCounted { public: - static ErrorOr> try_create(Graphics::VirtIOGPU::ContextID context_id) + static ErrorOr> try_create(Graphics::VirtIOGPU::ContextID context_id) { auto region_result = TRY(MM.allocate_kernel_region( NUM_TRANSFER_REGION_PAGES * PAGE_SIZE, "VIRGL3D userspace upload buffer"sv, Memory::Region::Access::ReadWrite, AllocationStrategy::AllocateNow)); - return TRY(adopt_nonnull_ref_or_enomem(new (nothrow) PerContextState(context_id, move(region_result)))); + return TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) PerContextState(context_id, move(region_result)))); } Graphics::VirtIOGPU::ContextID context_id() { return m_context_id; } Memory::Region& transfer_buffer_region() { return *m_transfer_buffer_region; } @@ -131,12 +131,12 @@ private: virtual void detach(OpenFileDescription&) override; private: - ErrorOr> get_context_for_description(OpenFileDescription&); + ErrorOr> get_context_for_description(OpenFileDescription&); - NonnullRefPtr m_graphics_adapter; + NonnullLockRefPtr m_graphics_adapter; // Context used for kernel operations (e.g. flushing resources to scanout) Graphics::VirtIOGPU::ContextID m_kernel_context_id; - HashMap> m_context_state_lookup; + HashMap> m_context_state_lookup; // Memory management for backing buffers NonnullOwnPtr m_transfer_buffer_region; constexpr static size_t NUM_TRANSFER_REGION_PAGES = 256; diff --git a/Kernel/Graphics/VirtIOGPU/GraphicsAdapter.cpp b/Kernel/Graphics/VirtIOGPU/GraphicsAdapter.cpp index c69b6fed3a..2600dffa39 100644 --- a/Kernel/Graphics/VirtIOGPU/GraphicsAdapter.cpp +++ b/Kernel/Graphics/VirtIOGPU/GraphicsAdapter.cpp @@ -21,7 +21,7 @@ namespace Kernel { #define DEVICE_EVENTS_CLEAR 0x4 #define DEVICE_NUM_SCANOUTS 0x8 -NonnullRefPtr VirtIOGraphicsAdapter::initialize(PCI::DeviceIdentifier const& device_identifier) +NonnullLockRefPtr VirtIOGraphicsAdapter::initialize(PCI::DeviceIdentifier const& device_identifier) { VERIFY(device_identifier.hardware_id().vendor_id == PCI::VendorID::VirtIO); // Setup memory transfer region @@ -30,7 +30,7 @@ NonnullRefPtr VirtIOGraphicsAdapter::initialize(PCI::Devi "VirtGPU Scratch Space"sv, Memory::Region::Access::ReadWrite)); - auto adapter = adopt_ref(*new (nothrow) VirtIOGraphicsAdapter(device_identifier, move(scratch_space_region))); + auto adapter = adopt_lock_ref(*new (nothrow) VirtIOGraphicsAdapter(device_identifier, move(scratch_space_region))); adapter->initialize(); MUST(adapter->initialize_adapter()); return adapter; diff --git a/Kernel/Graphics/VirtIOGPU/GraphicsAdapter.h b/Kernel/Graphics/VirtIOGPU/GraphicsAdapter.h index 1659b9036a..7623dd52d8 100644 --- a/Kernel/Graphics/VirtIOGPU/GraphicsAdapter.h +++ b/Kernel/Graphics/VirtIOGPU/GraphicsAdapter.h @@ -37,7 +37,7 @@ class VirtIOGraphicsAdapter final friend class VirtIOGPU3DDevice; public: - static NonnullRefPtr initialize(PCI::DeviceIdentifier const&); + static NonnullLockRefPtr initialize(PCI::DeviceIdentifier const&); virtual void initialize() override; void initialize_3d_device(); @@ -63,7 +63,7 @@ private: Graphics::VirtIOGPU::ResourceID resource_id { 0 }; }; - RefPtr display_connector; + LockRefPtr display_connector; PhysicalBuffer main_buffer; PhysicalBuffer back_buffer; }; @@ -119,7 +119,7 @@ private: // Note: Resource ID 0 is invalid, and we must not allocate 0 as the first resource ID. Atomic m_resource_id_counter { 1 }; Atomic m_context_id_counter { 1 }; - RefPtr m_3d_device; + LockRefPtr m_3d_device; bool m_has_virgl_support { false }; // Synchronous commands diff --git a/Kernel/Interrupts/IRQHandler.h b/Kernel/Interrupts/IRQHandler.h index 0804b95f13..a66b3d1f4f 100644 --- a/Kernel/Interrupts/IRQHandler.h +++ b/Kernel/Interrupts/IRQHandler.h @@ -6,10 +6,10 @@ #pragma once -#include #include #include #include +#include namespace Kernel { @@ -40,7 +40,7 @@ protected: private: bool m_shared_with_others { false }; bool m_enabled { false }; - RefPtr m_responsible_irq_controller; + LockRefPtr m_responsible_irq_controller; }; } diff --git a/Kernel/Interrupts/SharedIRQHandler.h b/Kernel/Interrupts/SharedIRQHandler.h index 017d96b33e..c0b1cbeb3c 100644 --- a/Kernel/Interrupts/SharedIRQHandler.h +++ b/Kernel/Interrupts/SharedIRQHandler.h @@ -7,10 +7,10 @@ #pragma once #include -#include #include #include #include +#include namespace Kernel { class IRQHandler; @@ -41,6 +41,6 @@ private: explicit SharedIRQHandler(u8 interrupt_number); bool m_enabled { true }; GenericInterruptHandler::List m_handlers; - RefPtr m_responsible_irq_controller; + LockRefPtr m_responsible_irq_controller; }; } diff --git a/Kernel/Interrupts/SpuriousInterruptHandler.h b/Kernel/Interrupts/SpuriousInterruptHandler.h index 9137e80312..a5acf27cd6 100644 --- a/Kernel/Interrupts/SpuriousInterruptHandler.h +++ b/Kernel/Interrupts/SpuriousInterruptHandler.h @@ -42,7 +42,7 @@ private: explicit SpuriousInterruptHandler(u8 interrupt_number); bool m_enabled { false }; bool m_real_irq { false }; - RefPtr m_responsible_irq_controller; + LockRefPtr m_responsible_irq_controller; OwnPtr m_real_handler; }; } diff --git a/Kernel/Library/ThreadSafeRefPtr.h b/Kernel/Library/LockRefPtr.h similarity index 71% rename from Kernel/Library/ThreadSafeRefPtr.h rename to Kernel/Library/LockRefPtr.h index b1e341d7e9..90f5889a8d 100644 --- a/Kernel/Library/ThreadSafeRefPtr.h +++ b/Kernel/Library/LockRefPtr.h @@ -10,16 +10,16 @@ #include #include #include -#include #include #include #include +#include #ifdef KERNEL # include # include #endif -#define THREADSAFEREFPTR_SCRUB_BYTE 0xa0 +#define LOCKREFPTR_SCRUB_BYTE 0xa0 namespace AK { @@ -27,7 +27,7 @@ template class OwnPtr; template -struct RefPtrTraits { +struct LockRefPtrTraits { ALWAYS_INLINE static T* as_ptr(FlatPtr bits) { return (T*)(bits & ~(FlatPtr)1); @@ -88,7 +88,7 @@ struct RefPtrTraits { ALWAYS_INLINE static FlatPtr lock(Atomic& atomic_var) { // This sets the lock bit atomically, preventing further modifications. - // This is important when e.g. copying a RefPtr where the source + // This is important when e.g. copying a LockRefPtr where the source // might be released and freed too quickly. This allows us // to temporarily lock the pointer so we can add a reference, then // unlock it @@ -117,24 +117,24 @@ struct RefPtrTraits { }; template -class [[nodiscard]] RefPtr { +class [[nodiscard]] LockRefPtr { template - friend class RefPtr; + friend class LockRefPtr; template - friend class WeakPtr; + friend class LockWeakPtr; public: enum AdoptTag { Adopt }; - RefPtr() = default; - RefPtr(const T* ptr) + LockRefPtr() = default; + LockRefPtr(const T* ptr) : m_bits(PtrTraits::as_bits(const_cast(ptr))) { ref_if_not_null(const_cast(ptr)); } - RefPtr(const T& object) + LockRefPtr(const T& object) : m_bits(PtrTraits::as_bits(const_cast(&object))) { T* ptr = const_cast(&object); @@ -142,58 +142,58 @@ public: VERIFY(!is_null()); ptr->ref(); } - RefPtr(AdoptTag, T& object) + LockRefPtr(AdoptTag, T& object) : m_bits(PtrTraits::as_bits(&object)) { VERIFY(!is_null()); } - RefPtr(RefPtr&& other) + LockRefPtr(LockRefPtr&& other) : m_bits(other.leak_ref_raw()) { } - ALWAYS_INLINE RefPtr(NonnullRefPtr const& other) + ALWAYS_INLINE LockRefPtr(NonnullLockRefPtr const& other) : m_bits(PtrTraits::as_bits(const_cast(other.add_ref()))) { } template - ALWAYS_INLINE RefPtr(NonnullRefPtr const& other) requires(IsConvertible) + ALWAYS_INLINE LockRefPtr(NonnullLockRefPtr const& other) requires(IsConvertible) : m_bits(PtrTraits::as_bits(const_cast(other.add_ref()))) { } template - ALWAYS_INLINE RefPtr(NonnullRefPtr&& other) requires(IsConvertible) + ALWAYS_INLINE LockRefPtr(NonnullLockRefPtr&& other) requires(IsConvertible) : m_bits(PtrTraits::as_bits(&other.leak_ref())) { VERIFY(!is_null()); } - template> - RefPtr(RefPtr&& other) requires(IsConvertible) + template> + LockRefPtr(LockRefPtr&& other) requires(IsConvertible) : m_bits(PtrTraits::template convert_from(other.leak_ref_raw())) { } - RefPtr(RefPtr const& other) + LockRefPtr(LockRefPtr const& other) : m_bits(other.add_ref_raw()) { } - template> - RefPtr(RefPtr const& other) requires(IsConvertible) + template> + LockRefPtr(LockRefPtr const& other) requires(IsConvertible) : m_bits(other.add_ref_raw()) { } - ALWAYS_INLINE ~RefPtr() + ALWAYS_INLINE ~LockRefPtr() { clear(); #ifdef SANITIZE_PTRS - m_bits.store(explode_byte(THREADSAFEREFPTR_SCRUB_BYTE), AK::MemoryOrder::memory_order_relaxed); + m_bits.store(explode_byte(LOCKREFPTR_SCRUB_BYTE), AK::MemoryOrder::memory_order_relaxed); #endif } template - RefPtr(OwnPtr const&) = delete; + LockRefPtr(OwnPtr const&) = delete; template - RefPtr& operator=(OwnPtr const&) = delete; + LockRefPtr& operator=(OwnPtr const&) = delete; - void swap(RefPtr& other) + void swap(LockRefPtr& other) { if (this == &other) return; @@ -204,8 +204,8 @@ public: PtrTraits::exchange(other.m_bits, bits); } - template> - void swap(RefPtr& other) requires(IsConvertible) + template> + void swap(LockRefPtr& other) requires(IsConvertible) { // NOTE: swap is not atomic! FlatPtr other_bits = P::exchange(other.m_bits, P::default_null_value); @@ -213,41 +213,41 @@ public: P::exchange(other.m_bits, P::template convert_from(bits)); } - ALWAYS_INLINE RefPtr& operator=(RefPtr&& other) + ALWAYS_INLINE LockRefPtr& operator=(LockRefPtr&& other) { if (this != &other) assign_raw(other.leak_ref_raw()); return *this; } - template> - ALWAYS_INLINE RefPtr& operator=(RefPtr&& other) requires(IsConvertible) + template> + ALWAYS_INLINE LockRefPtr& operator=(LockRefPtr&& other) requires(IsConvertible) { assign_raw(PtrTraits::template convert_from(other.leak_ref_raw())); return *this; } template - ALWAYS_INLINE RefPtr& operator=(NonnullRefPtr&& other) requires(IsConvertible) + ALWAYS_INLINE LockRefPtr& operator=(NonnullLockRefPtr&& other) requires(IsConvertible) { assign_raw(PtrTraits::as_bits(&other.leak_ref())); return *this; } - ALWAYS_INLINE RefPtr& operator=(NonnullRefPtr const& other) + ALWAYS_INLINE LockRefPtr& operator=(NonnullLockRefPtr const& other) { assign_raw(PtrTraits::as_bits(other.add_ref())); return *this; } template - ALWAYS_INLINE RefPtr& operator=(NonnullRefPtr const& other) requires(IsConvertible) + ALWAYS_INLINE LockRefPtr& operator=(NonnullLockRefPtr const& other) requires(IsConvertible) { assign_raw(PtrTraits::as_bits(other.add_ref())); return *this; } - ALWAYS_INLINE RefPtr& operator=(RefPtr const& other) + ALWAYS_INLINE LockRefPtr& operator=(LockRefPtr const& other) { if (this != &other) assign_raw(other.add_ref_raw()); @@ -255,41 +255,41 @@ public: } template - ALWAYS_INLINE RefPtr& operator=(RefPtr const& other) requires(IsConvertible) + ALWAYS_INLINE LockRefPtr& operator=(LockRefPtr const& other) requires(IsConvertible) { assign_raw(other.add_ref_raw()); return *this; } - ALWAYS_INLINE RefPtr& operator=(const T* ptr) + ALWAYS_INLINE LockRefPtr& operator=(const T* ptr) { ref_if_not_null(const_cast(ptr)); assign_raw(PtrTraits::as_bits(const_cast(ptr))); return *this; } - ALWAYS_INLINE RefPtr& operator=(const T& object) + ALWAYS_INLINE LockRefPtr& operator=(const T& object) { const_cast(object).ref(); assign_raw(PtrTraits::as_bits(const_cast(&object))); return *this; } - RefPtr& operator=(std::nullptr_t) + LockRefPtr& operator=(std::nullptr_t) { clear(); return *this; } - ALWAYS_INLINE bool assign_if_null(RefPtr&& other) + ALWAYS_INLINE bool assign_if_null(LockRefPtr&& other) { if (this == &other) return is_null(); return PtrTraits::exchange_if_null(m_bits, other.leak_ref_raw()); } - template> - ALWAYS_INLINE bool assign_if_null(RefPtr&& other) + template> + ALWAYS_INLINE bool assign_if_null(LockRefPtr&& other) { if (this == &other) return is_null(); @@ -309,11 +309,11 @@ public: return PtrTraits::as_ptr(bits); } - NonnullRefPtr release_nonnull() + NonnullLockRefPtr release_nonnull() { FlatPtr bits = PtrTraits::exchange(m_bits, PtrTraits::default_null_value); VERIFY(!PtrTraits::is_null(bits)); - return NonnullRefPtr(NonnullRefPtr::Adopt, *PtrTraits::as_ptr(bits)); + return NonnullLockRefPtr(NonnullLockRefPtr::Adopt, *PtrTraits::as_ptr(bits)); } ALWAYS_INLINE T* ptr() { return as_ptr(); } @@ -347,11 +347,11 @@ public: bool operator==(std::nullptr_t) const { return is_null(); } bool operator!=(std::nullptr_t) const { return !is_null(); } - bool operator==(RefPtr const& other) const { return as_ptr() == other.as_ptr(); } - bool operator!=(RefPtr const& other) const { return as_ptr() != other.as_ptr(); } + bool operator==(LockRefPtr const& other) const { return as_ptr() == other.as_ptr(); } + bool operator!=(LockRefPtr const& other) const { return as_ptr() != other.as_ptr(); } - bool operator==(RefPtr& other) { return as_ptr() == other.as_ptr(); } - bool operator!=(RefPtr& other) { return as_ptr() != other.as_ptr(); } + bool operator==(LockRefPtr& other) { return as_ptr() == other.as_ptr(); } + bool operator!=(LockRefPtr& other) { return as_ptr() != other.as_ptr(); } bool operator==(const T* other) const { return as_ptr() == other; } bool operator!=(const T* other) const { return as_ptr() != other; } @@ -405,7 +405,7 @@ private: Kernel::ScopedCritical critical; #endif // This prevents a race condition between thread A and B: - // 1. Thread A copies RefPtr, e.g. through assignment or copy constructor, + // 1. Thread A copies LockRefPtr, e.g. through assignment or copy constructor, // gets the pointer from source, but is pre-empted before adding // another reference // 2. Thread B calls clear, leak_ref, or release_nonnull on source, and @@ -445,64 +445,64 @@ private: }; template -struct Formatter> : Formatter { - ErrorOr format(FormatBuilder& builder, RefPtr const& value) +struct Formatter> : Formatter { + ErrorOr format(FormatBuilder& builder, LockRefPtr const& value) { return Formatter::format(builder, value.ptr()); } }; template -struct Traits> : public GenericTraits> { +struct Traits> : public GenericTraits> { using PeekType = T*; using ConstPeekType = const T*; - static unsigned hash(RefPtr const& p) { return ptr_hash(p.ptr()); } - static bool equals(RefPtr const& a, RefPtr const& b) { return a.ptr() == b.ptr(); } + static unsigned hash(LockRefPtr const& p) { return ptr_hash(p.ptr()); } + static bool equals(LockRefPtr const& a, LockRefPtr const& b) { return a.ptr() == b.ptr(); } }; template -inline NonnullRefPtr static_ptr_cast(NonnullRefPtr const& ptr) +inline NonnullLockRefPtr static_ptr_cast(NonnullLockRefPtr const& ptr) { - return NonnullRefPtr(static_cast(*ptr)); + return NonnullLockRefPtr(static_cast(*ptr)); } -template> -inline RefPtr static_ptr_cast(RefPtr const& ptr) +template> +inline LockRefPtr static_ptr_cast(LockRefPtr const& ptr) { - return RefPtr(static_cast(ptr.ptr())); + return LockRefPtr(static_cast(ptr.ptr())); } template -inline void swap(RefPtr& a, RefPtr& b) requires(IsConvertible) +inline void swap(LockRefPtr& a, LockRefPtr& b) requires(IsConvertible) { a.swap(b); } template -inline RefPtr adopt_ref_if_nonnull(T* object) +inline LockRefPtr adopt_lock_ref_if_nonnull(T* object) { if (object) - return RefPtr(RefPtr::Adopt, *object); + return LockRefPtr(LockRefPtr::Adopt, *object); return {}; } template -requires(IsConstructible) inline ErrorOr> try_make_ref_counted(Args&&... args) +requires(IsConstructible) inline ErrorOr> try_make_lock_ref_counted(Args&&... args) { - return adopt_nonnull_ref_or_enomem(new (nothrow) T(forward(args)...)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) T(forward(args)...)); } // FIXME: Remove once P0960R3 is available in Clang. template -inline ErrorOr> try_make_ref_counted(Args&&... args) +inline ErrorOr> try_make_lock_ref_counted(Args&&... args) { - return adopt_nonnull_ref_or_enomem(new (nothrow) T { forward(args)... }); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) T { forward(args)... }); } template -inline ErrorOr> adopt_nonnull_ref_or_enomem(T* object) +inline ErrorOr> adopt_nonnull_lock_ref_or_enomem(T* object) { - auto result = adopt_ref_if_nonnull(object); + auto result = adopt_lock_ref_if_nonnull(object); if (!result) return Error::from_errno(ENOMEM); return result.release_nonnull(); @@ -510,11 +510,11 @@ inline ErrorOr> adopt_nonnull_ref_or_enomem(T* object) } -using AK::adopt_ref_if_nonnull; -using AK::RefPtr; +using AK::adopt_lock_ref_if_nonnull; +using AK::LockRefPtr; using AK::static_ptr_cast; -using AK::try_make_ref_counted; +using AK::try_make_lock_ref_counted; #ifdef KERNEL -using AK::adopt_nonnull_ref_or_enomem; +using AK::adopt_nonnull_lock_ref_or_enomem; #endif diff --git a/Kernel/Library/ThreadSafeWeakPtr.h b/Kernel/Library/LockWeakPtr.h similarity index 71% rename from Kernel/Library/ThreadSafeWeakPtr.h rename to Kernel/Library/LockWeakPtr.h index c50bab3651..3b63864ce2 100644 --- a/Kernel/Library/ThreadSafeWeakPtr.h +++ b/Kernel/Library/LockWeakPtr.h @@ -6,66 +6,66 @@ #pragma once -#include +#include namespace AK { template -class [[nodiscard]] WeakPtr { +class [[nodiscard]] LockWeakPtr { template - friend class Weakable; + friend class LockWeakable; public: - WeakPtr() = default; + LockWeakPtr() = default; template - WeakPtr(WeakPtr const& other) requires(IsBaseOf) + LockWeakPtr(WeakPtr const& other) requires(IsBaseOf) : m_link(other.m_link) { } template - WeakPtr(WeakPtr&& other) requires(IsBaseOf) + LockWeakPtr(WeakPtr&& other) requires(IsBaseOf) : m_link(other.take_link()) { } template - WeakPtr& operator=(WeakPtr&& other) requires(IsBaseOf) + LockWeakPtr& operator=(WeakPtr&& other) requires(IsBaseOf) { m_link = other.take_link(); return *this; } template - WeakPtr& operator=(WeakPtr const& other) requires(IsBaseOf) + LockWeakPtr& operator=(WeakPtr const& other) requires(IsBaseOf) { if ((void const*)this != (void const*)&other) m_link = other.m_link; return *this; } - WeakPtr& operator=(std::nullptr_t) + LockWeakPtr& operator=(std::nullptr_t) { clear(); return *this; } template - WeakPtr(const U& object) requires(IsBaseOf) + LockWeakPtr(const U& object) requires(IsBaseOf) : m_link(object.template try_make_weak_ptr().release_value_but_fixme_should_propagate_errors().take_link()) { } template - WeakPtr(const U* object) requires(IsBaseOf) + LockWeakPtr(const U* object) requires(IsBaseOf) { if (object) m_link = object->template try_make_weak_ptr().release_value_but_fixme_should_propagate_errors().take_link(); } template - WeakPtr(RefPtr const& object) requires(IsBaseOf) + LockWeakPtr(LockRefPtr const& object) requires(IsBaseOf) { object.do_while_locked([&](U* obj) { if (obj) @@ -74,7 +74,7 @@ public: } template - WeakPtr(NonnullRefPtr const& object) requires(IsBaseOf) + LockWeakPtr(NonnullLockRefPtr const& object) requires(IsBaseOf) { object.do_while_locked([&](U* obj) { if (obj) @@ -83,14 +83,14 @@ public: } template - WeakPtr& operator=(const U& object) requires(IsBaseOf) + LockWeakPtr& operator=(const U& object) requires(IsBaseOf) { m_link = object.template try_make_weak_ptr().release_value_but_fixme_should_propagate_errors().take_link(); return *this; } template - WeakPtr& operator=(const U* object) requires(IsBaseOf) + LockWeakPtr& operator=(const U* object) requires(IsBaseOf) { if (object) m_link = object->template try_make_weak_ptr().release_value_but_fixme_should_propagate_errors().take_link(); @@ -100,7 +100,7 @@ public: } template - WeakPtr& operator=(RefPtr const& object) requires(IsBaseOf) + LockWeakPtr& operator=(LockRefPtr const& object) requires(IsBaseOf) { object.do_while_locked([&](U* obj) { if (obj) @@ -112,7 +112,7 @@ public: } template - WeakPtr& operator=(NonnullRefPtr const& object) requires(IsBaseOf) + LockWeakPtr& operator=(NonnullLockRefPtr const& object) requires(IsBaseOf) { object.do_while_locked([&](U* obj) { if (obj) @@ -123,13 +123,13 @@ public: return *this; } - [[nodiscard]] RefPtr strong_ref() const + [[nodiscard]] LockRefPtr strong_ref() const { // This only works with RefCounted objects, but it is the only - // safe way to get a strong reference from a WeakPtr. Any code + // safe way to get a strong reference from a LockWeakPtr. Any code // that uses objects not derived from RefCounted will have to // use unsafe_ptr(), but as the name suggests, it is not safe... - RefPtr ref; + LockRefPtr ref; // Using do_while_locked protects against a race with clear()! m_link.do_while_locked([&](WeakLink* link) { if (link) @@ -153,20 +153,20 @@ public: [[nodiscard]] bool is_null() const { return !m_link || m_link->is_null(); } void clear() { m_link = nullptr; } - [[nodiscard]] RefPtr take_link() { return move(m_link); } + [[nodiscard]] LockRefPtr take_link() { return move(m_link); } private: - WeakPtr(RefPtr const& link) + LockWeakPtr(LockRefPtr const& link) : m_link(link) { } - RefPtr m_link; + LockRefPtr m_link; }; template template -inline ErrorOr> Weakable::try_make_weak_ptr() const +inline ErrorOr> LockWeakable::try_make_weak_ptr() const { if constexpr (IsBaseOf) { // Checking m_being_destroyed isn't sufficient when dealing with @@ -176,21 +176,21 @@ inline ErrorOr> Weakable::try_make_weak_ptr() const // that we prevent the destructor and revoke_weak_ptrs from being // triggered until we're done. if (!static_cast(this)->try_ref()) - return WeakPtr {}; + return LockWeakPtr {}; } else { // For non-RefCounted types this means a weak reference can be - // obtained until the ~Weakable destructor is invoked! + // obtained until the ~LockWeakable destructor is invoked! if (m_being_destroyed.load(AK::MemoryOrder::memory_order_acquire)) - return WeakPtr {}; + return LockWeakPtr {}; } if (!m_link) { // There is a small chance that we create a new WeakLink and throw // it away because another thread beat us to it. But the window is // pretty small and the overhead isn't terrible. - m_link.assign_if_null(TRY(adopt_nonnull_ref_or_enomem(new (nothrow) WeakLink(const_cast(static_cast(*this)))))); + m_link.assign_if_null(TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) WeakLink(const_cast(static_cast(*this)))))); } - WeakPtr weak_ptr(m_link); + LockWeakPtr weak_ptr(m_link); if constexpr (IsBaseOf) { // Now drop the reference we temporarily added @@ -198,15 +198,15 @@ inline ErrorOr> Weakable::try_make_weak_ptr() const // We just dropped the last reference, which should have called // revoke_weak_ptrs, which should have invalidated our weak_ptr VERIFY(!weak_ptr.strong_ref()); - return WeakPtr {}; + return LockWeakPtr {}; } } return weak_ptr; } template -struct Formatter> : Formatter { - ErrorOr format(FormatBuilder& builder, WeakPtr const& value) +struct Formatter> : Formatter { + ErrorOr format(FormatBuilder& builder, LockWeakPtr const& value) { auto ref = value.strong_ref(); return Formatter::format(builder, ref.ptr()); @@ -214,14 +214,14 @@ struct Formatter> : Formatter { }; template -ErrorOr> try_make_weak_ptr_if_nonnull(T const* ptr) +ErrorOr> try_make_weak_ptr_if_nonnull(T const* ptr) { if (ptr) { return ptr->template try_make_weak_ptr(); } - return WeakPtr {}; + return LockWeakPtr {}; } } -using AK::WeakPtr; +using AK::LockWeakPtr; diff --git a/Kernel/Library/ThreadSafeWeakable.h b/Kernel/Library/LockWeakable.h similarity index 84% rename from Kernel/Library/ThreadSafeWeakable.h rename to Kernel/Library/LockWeakable.h index d97a064a19..ed3e4367d5 100644 --- a/Kernel/Library/ThreadSafeWeakable.h +++ b/Kernel/Library/LockWeakable.h @@ -9,30 +9,30 @@ #include #include #include -#include #include #include #include +#include namespace AK { template -class Weakable; +class LockWeakable; template -class WeakPtr; +class LockWeakPtr; class WeakLink final : public AtomicRefCounted { template - friend class Weakable; + friend class LockWeakable; template - friend class WeakPtr; + friend class LockWeakPtr; public: - template> - RefPtr strong_ref() const + template> + LockRefPtr strong_ref() const requires(IsBaseOf) { - RefPtr ref; + LockRefPtr ref; { // We don't want to be preempted while we are trying to obtain @@ -41,7 +41,7 @@ public: if (!(m_consumers.fetch_add(1u << 1, AK::MemoryOrder::memory_order_acquire) & 1u)) { T* ptr = (T*)m_ptr.load(AK::MemoryOrder::memory_order_acquire); if (ptr && ptr->try_ref()) - ref = adopt_ref(*ptr); + ref = adopt_lock_ref(*ptr); } m_consumers.fetch_sub(1u << 1, AK::MemoryOrder::memory_order_release); } @@ -91,18 +91,18 @@ private: }; template -class Weakable { +class LockWeakable { private: class Link; public: template - ErrorOr> try_make_weak_ptr() const; + ErrorOr> try_make_weak_ptr() const; protected: - Weakable() = default; + LockWeakable() = default; - ~Weakable() + ~LockWeakable() { m_being_destroyed.store(true, AK::MemoryOrder::memory_order_release); revoke_weak_ptrs(); @@ -115,10 +115,10 @@ protected: } private: - mutable RefPtr m_link; + mutable LockRefPtr m_link; Atomic m_being_destroyed { false }; }; } -using AK::Weakable; +using AK::LockWeakable; diff --git a/Kernel/Library/ThreadSafeNonnullRefPtr.h b/Kernel/Library/NonnullLockRefPtr.h similarity index 67% rename from Kernel/Library/ThreadSafeNonnullRefPtr.h rename to Kernel/Library/NonnullLockRefPtr.h index de7e08cbc2..44289a3b55 100644 --- a/Kernel/Library/ThreadSafeNonnullRefPtr.h +++ b/Kernel/Library/NonnullLockRefPtr.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #ifdef KERNEL @@ -16,104 +17,90 @@ # include #endif -#define THREADSAFENONNULLREFPTR_SCRUB_BYTE 0xa1 +#define NONNULLLOCKREFPTR_SCRUB_BYTE 0xa1 namespace AK { template class OwnPtr; template -class RefPtr; +class LockRefPtr; template -ALWAYS_INLINE void ref_if_not_null(T* ptr) -{ - if (ptr) - ptr->ref(); -} - -template -ALWAYS_INLINE void unref_if_not_null(T* ptr) -{ - if (ptr) - ptr->unref(); -} - -template -class [[nodiscard]] NonnullRefPtr { +class [[nodiscard]] NonnullLockRefPtr { template - friend class RefPtr; + friend class LockRefPtr; template - friend class NonnullRefPtr; + friend class NonnullLockRefPtr; template - friend class WeakPtr; + friend class LockWeakPtr; public: using ElementType = T; enum AdoptTag { Adopt }; - ALWAYS_INLINE NonnullRefPtr(const T& object) + ALWAYS_INLINE NonnullLockRefPtr(T const& object) : m_bits((FlatPtr)&object) { VERIFY(!(m_bits & 1)); const_cast(object).ref(); } template - ALWAYS_INLINE NonnullRefPtr(const U& object) requires(IsConvertible) - : m_bits((FlatPtr) static_cast(&object)) + ALWAYS_INLINE NonnullLockRefPtr(U const& object) requires(IsConvertible) + : m_bits((FlatPtr) static_cast(&object)) { VERIFY(!(m_bits & 1)); - const_cast(static_cast(object)).ref(); + const_cast(static_cast(object)).ref(); } - ALWAYS_INLINE NonnullRefPtr(AdoptTag, T& object) + ALWAYS_INLINE NonnullLockRefPtr(AdoptTag, T& object) : m_bits((FlatPtr)&object) { VERIFY(!(m_bits & 1)); } - ALWAYS_INLINE NonnullRefPtr(NonnullRefPtr&& other) + ALWAYS_INLINE NonnullLockRefPtr(NonnullLockRefPtr&& other) : m_bits((FlatPtr)&other.leak_ref()) { VERIFY(!(m_bits & 1)); } template - ALWAYS_INLINE NonnullRefPtr(NonnullRefPtr&& other) requires(IsConvertible) + ALWAYS_INLINE NonnullLockRefPtr(NonnullLockRefPtr&& other) requires(IsConvertible) : m_bits((FlatPtr)&other.leak_ref()) { VERIFY(!(m_bits & 1)); } - ALWAYS_INLINE NonnullRefPtr(NonnullRefPtr const& other) + ALWAYS_INLINE NonnullLockRefPtr(NonnullLockRefPtr const& other) : m_bits((FlatPtr)other.add_ref()) { VERIFY(!(m_bits & 1)); } template - ALWAYS_INLINE NonnullRefPtr(NonnullRefPtr const& other) requires(IsConvertible) + ALWAYS_INLINE NonnullLockRefPtr(NonnullLockRefPtr const& other) requires(IsConvertible) : m_bits((FlatPtr)other.add_ref()) { VERIFY(!(m_bits & 1)); } - ALWAYS_INLINE ~NonnullRefPtr() + ALWAYS_INLINE ~NonnullLockRefPtr() { assign(nullptr); #ifdef SANITIZE_PTRS - m_bits.store(explode_byte(THREADSAFENONNULLREFPTR_SCRUB_BYTE), AK::MemoryOrder::memory_order_relaxed); + m_bits.store(explode_byte(NONNULLLOCKREFPTR_SCRUB_BYTE), AK::MemoryOrder::memory_order_relaxed); #endif } template - NonnullRefPtr(OwnPtr const&) = delete; + NonnullLockRefPtr(OwnPtr const&) = delete; template - NonnullRefPtr& operator=(OwnPtr const&) = delete; + NonnullLockRefPtr& operator=(OwnPtr const&) = delete; template - NonnullRefPtr(RefPtr const&) = delete; + NonnullLockRefPtr(LockRefPtr const&) = delete; template - NonnullRefPtr& operator=(RefPtr const&) = delete; - NonnullRefPtr(RefPtr const&) = delete; - NonnullRefPtr& operator=(RefPtr const&) = delete; + NonnullLockRefPtr& operator=(LockRefPtr const&) = delete; + NonnullLockRefPtr(LockRefPtr const&) = delete; + NonnullLockRefPtr& operator=(LockRefPtr const&) = delete; - NonnullRefPtr& operator=(NonnullRefPtr const& other) + NonnullLockRefPtr& operator=(NonnullLockRefPtr const& other) { if (this != &other) assign(other.add_ref()); @@ -121,13 +108,13 @@ public: } template - NonnullRefPtr& operator=(NonnullRefPtr const& other) requires(IsConvertible) + NonnullLockRefPtr& operator=(NonnullLockRefPtr const& other) requires(IsConvertible) { assign(other.add_ref()); return *this; } - ALWAYS_INLINE NonnullRefPtr& operator=(NonnullRefPtr&& other) + ALWAYS_INLINE NonnullLockRefPtr& operator=(NonnullLockRefPtr&& other) { if (this != &other) assign(&other.leak_ref()); @@ -135,13 +122,13 @@ public: } template - NonnullRefPtr& operator=(NonnullRefPtr&& other) requires(IsConvertible) + NonnullLockRefPtr& operator=(NonnullLockRefPtr&& other) requires(IsConvertible) { assign(&other.leak_ref()); return *this; } - NonnullRefPtr& operator=(const T& object) + NonnullLockRefPtr& operator=(T const& object) { const_cast(object).ref(); assign(const_cast(&object)); @@ -159,7 +146,7 @@ public: { return as_nonnull_ptr(); } - ALWAYS_INLINE RETURNS_NONNULL const T* ptr() const + ALWAYS_INLINE RETURNS_NONNULL T const* ptr() const { return as_nonnull_ptr(); } @@ -168,7 +155,7 @@ public: { return as_nonnull_ptr(); } - ALWAYS_INLINE RETURNS_NONNULL const T* operator->() const + ALWAYS_INLINE RETURNS_NONNULL T const* operator->() const { return as_nonnull_ptr(); } @@ -177,7 +164,7 @@ public: { return *as_nonnull_ptr(); } - ALWAYS_INLINE const T& operator*() const + ALWAYS_INLINE T const& operator*() const { return *as_nonnull_ptr(); } @@ -186,7 +173,7 @@ public: { return as_nonnull_ptr(); } - ALWAYS_INLINE RETURNS_NONNULL operator const T*() const + ALWAYS_INLINE RETURNS_NONNULL operator T const*() const { return as_nonnull_ptr(); } @@ -195,7 +182,7 @@ public: { return *as_nonnull_ptr(); } - ALWAYS_INLINE operator const T&() const + ALWAYS_INLINE operator T const&() const { return *as_nonnull_ptr(); } @@ -203,7 +190,7 @@ public: operator bool() const = delete; bool operator!() const = delete; - void swap(NonnullRefPtr& other) + void swap(NonnullLockRefPtr& other) { if (this == &other) return; @@ -215,7 +202,7 @@ public: } template - void swap(NonnullRefPtr& other) requires(IsConvertible) + void swap(NonnullLockRefPtr& other) requires(IsConvertible) { // NOTE: swap is not atomic! U* other_ptr = other.exchange(nullptr); @@ -225,7 +212,7 @@ public: // clang-format off private: - NonnullRefPtr() = delete; + NonnullLockRefPtr() = delete; // clang-format on ALWAYS_INLINE T* as_ptr() const @@ -317,21 +304,21 @@ private: }; template -inline NonnullRefPtr adopt_ref(T& object) +inline NonnullLockRefPtr adopt_lock_ref(T& object) { - return NonnullRefPtr(NonnullRefPtr::Adopt, object); + return NonnullLockRefPtr(NonnullLockRefPtr::Adopt, object); } template -struct Formatter> : Formatter { - ErrorOr format(FormatBuilder& builder, NonnullRefPtr const& value) +struct Formatter> : Formatter { + ErrorOr format(FormatBuilder& builder, NonnullLockRefPtr const& value) { - return Formatter::format(builder, value.ptr()); + return Formatter::format(builder, value.ptr()); } }; template -inline void swap(NonnullRefPtr& a, NonnullRefPtr& b) requires(IsConvertible) +inline void swap(NonnullLockRefPtr& a, NonnullLockRefPtr& b) requires(IsConvertible) { a.swap(b); } @@ -339,12 +326,12 @@ inline void swap(NonnullRefPtr& a, NonnullRefPtr& b) requires(IsConvertibl } template -struct Traits> : public GenericTraits> { +struct Traits> : public GenericTraits> { using PeekType = T*; - using ConstPeekType = const T*; - static unsigned hash(NonnullRefPtr const& p) { return ptr_hash(p.ptr()); } - static bool equals(NonnullRefPtr const& a, NonnullRefPtr const& b) { return a.ptr() == b.ptr(); } + using ConstPeekType = T const*; + static unsigned hash(NonnullLockRefPtr const& p) { return ptr_hash(p.ptr()); } + static bool equals(NonnullLockRefPtr const& a, NonnullLockRefPtr const& b) { return a.ptr() == b.ptr(); } }; -using AK::adopt_ref; -using AK::NonnullRefPtr; +using AK::adopt_lock_ref; +using AK::NonnullLockRefPtr; diff --git a/Kernel/Library/NonnullLockRefPtrVector.h b/Kernel/Library/NonnullLockRefPtrVector.h new file mode 100644 index 0000000000..dea5ad2fc0 --- /dev/null +++ b/Kernel/Library/NonnullLockRefPtrVector.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2018-2022, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace AK { + +template +class NonnullLockRefPtrVector : public NonnullPtrVector, inline_capacity> { + using NonnullPtrVector, inline_capacity>::NonnullPtrVector; +}; + +} + +using AK::NonnullLockRefPtrVector; diff --git a/Kernel/Locking/Mutex.h b/Kernel/Locking/Mutex.h index 92ec8326f9..beba56f8a0 100644 --- a/Kernel/Locking/Mutex.h +++ b/Kernel/Locking/Mutex.h @@ -100,7 +100,7 @@ private: // the lock is unlocked, it just means we don't know which threads hold it. // When locked exclusively, this is always the one thread that holds the // lock. - RefPtr m_holder; + LockRefPtr m_holder; size_t m_shared_holders { 0 }; struct BlockedThreadLists { diff --git a/Kernel/Memory/AddressSpace.cpp b/Kernel/Memory/AddressSpace.cpp index 50945d8668..cc2a765a40 100644 --- a/Kernel/Memory/AddressSpace.cpp +++ b/Kernel/Memory/AddressSpace.cpp @@ -38,7 +38,7 @@ ErrorOr> AddressSpace::try_create(AddressSpace const return space; } -AddressSpace::AddressSpace(NonnullRefPtr page_directory, VirtualRange total_range) +AddressSpace::AddressSpace(NonnullLockRefPtr page_directory, VirtualRange total_range) : m_page_directory(move(page_directory)) , m_region_tree(total_range) { @@ -173,12 +173,12 @@ ErrorOr AddressSpace::allocate_region(RandomizeVirtualAddress randomize return region.leak_ptr(); } -ErrorOr AddressSpace::allocate_region_with_vmobject(VirtualRange requested_range, NonnullRefPtr vmobject, size_t offset_in_vmobject, StringView name, int prot, bool shared) +ErrorOr AddressSpace::allocate_region_with_vmobject(VirtualRange requested_range, NonnullLockRefPtr vmobject, size_t offset_in_vmobject, StringView name, int prot, bool shared) { return allocate_region_with_vmobject(RandomizeVirtualAddress::Yes, requested_range.base(), requested_range.size(), PAGE_SIZE, move(vmobject), offset_in_vmobject, name, prot, shared); } -ErrorOr AddressSpace::allocate_region_with_vmobject(RandomizeVirtualAddress randomize_virtual_address, VirtualAddress requested_address, size_t requested_size, size_t requested_alignment, NonnullRefPtr vmobject, size_t offset_in_vmobject, StringView name, int prot, bool shared) +ErrorOr AddressSpace::allocate_region_with_vmobject(RandomizeVirtualAddress randomize_virtual_address, VirtualAddress requested_address, size_t requested_size, size_t requested_alignment, NonnullLockRefPtr vmobject, size_t offset_in_vmobject, StringView name, int prot, bool shared) { if (!requested_address.is_page_aligned()) return EINVAL; diff --git a/Kernel/Memory/AddressSpace.h b/Kernel/Memory/AddressSpace.h index 12b2212659..e07cb3988a 100644 --- a/Kernel/Memory/AddressSpace.h +++ b/Kernel/Memory/AddressSpace.h @@ -9,7 +9,7 @@ #include #include -#include +#include #include #include #include @@ -33,8 +33,8 @@ public: ErrorOr unmap_mmap_range(VirtualAddress, size_t); - ErrorOr allocate_region_with_vmobject(VirtualRange requested_range, NonnullRefPtr, size_t offset_in_vmobject, StringView name, int prot, bool shared); - ErrorOr allocate_region_with_vmobject(RandomizeVirtualAddress, VirtualAddress requested_address, size_t requested_size, size_t requested_alignment, NonnullRefPtr, size_t offset_in_vmobject, StringView name, int prot, bool shared); + ErrorOr allocate_region_with_vmobject(VirtualRange requested_range, NonnullLockRefPtr, size_t offset_in_vmobject, StringView name, int prot, bool shared); + ErrorOr allocate_region_with_vmobject(RandomizeVirtualAddress, VirtualAddress requested_address, size_t requested_size, size_t requested_alignment, NonnullLockRefPtr, size_t offset_in_vmobject, StringView name, int prot, bool shared); ErrorOr allocate_region(RandomizeVirtualAddress, VirtualAddress requested_address, size_t requested_size, size_t requested_alignment, StringView name, int prot = PROT_READ | PROT_WRITE, AllocationStrategy strategy = AllocationStrategy::Reserve); void deallocate_region(Region& region); NonnullOwnPtr take_region(Region& region); @@ -65,11 +65,11 @@ public: auto& region_tree() { return m_region_tree; } private: - AddressSpace(NonnullRefPtr, VirtualRange total_range); + AddressSpace(NonnullLockRefPtr, VirtualRange total_range); mutable RecursiveSpinlock m_lock { LockRank::None }; - RefPtr m_page_directory; + LockRefPtr m_page_directory; RegionTree m_region_tree; diff --git a/Kernel/Memory/AnonymousVMObject.cpp b/Kernel/Memory/AnonymousVMObject.cpp index cfff86ff52..233a26450e 100644 --- a/Kernel/Memory/AnonymousVMObject.cpp +++ b/Kernel/Memory/AnonymousVMObject.cpp @@ -14,7 +14,7 @@ namespace Kernel::Memory { -ErrorOr> AnonymousVMObject::try_clone() +ErrorOr> AnonymousVMObject::try_clone() { // We need to acquire our lock so we copy a sane state SpinlockLocker lock(m_lock); @@ -50,7 +50,7 @@ ErrorOr> AnonymousVMObject::try_clone() // one would keep the one it still has. This ensures that the original // one and this one, as well as the clone have sufficient resources // to cow all pages as needed - auto new_shared_committed_cow_pages = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) SharedCommittedCowPages(move(committed_pages)))); + auto new_shared_committed_cow_pages = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) SharedCommittedCowPages(move(committed_pages)))); auto new_physical_pages = TRY(this->try_clone_physical_pages()); auto clone = TRY(try_create_with_shared_cow(*this, *new_shared_committed_cow_pages, move(new_physical_pages))); @@ -75,7 +75,7 @@ ErrorOr> AnonymousVMObject::try_clone() return clone; } -ErrorOr> AnonymousVMObject::try_create_with_size(size_t size, AllocationStrategy strategy) +ErrorOr> AnonymousVMObject::try_create_with_size(size_t size, AllocationStrategy strategy) { Optional committed_pages; if (strategy == AllocationStrategy::Reserve || strategy == AllocationStrategy::AllocateNow) { @@ -84,19 +84,19 @@ ErrorOr> AnonymousVMObject::try_create_with_siz auto new_physical_pages = TRY(VMObject::try_create_physical_pages(size)); - return adopt_nonnull_ref_or_enomem(new (nothrow) AnonymousVMObject(move(new_physical_pages), strategy, move(committed_pages))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) AnonymousVMObject(move(new_physical_pages), strategy, move(committed_pages))); } -ErrorOr> AnonymousVMObject::try_create_physically_contiguous_with_size(size_t size) +ErrorOr> AnonymousVMObject::try_create_physically_contiguous_with_size(size_t size) { auto contiguous_physical_pages = TRY(MM.allocate_contiguous_physical_pages(size)); - auto new_physical_pages = TRY(FixedArray>::try_create(contiguous_physical_pages.span())); + auto new_physical_pages = TRY(FixedArray>::try_create(contiguous_physical_pages.span())); - return adopt_nonnull_ref_or_enomem(new (nothrow) AnonymousVMObject(move(new_physical_pages))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) AnonymousVMObject(move(new_physical_pages))); } -ErrorOr> AnonymousVMObject::try_create_purgeable_with_size(size_t size, AllocationStrategy strategy) +ErrorOr> AnonymousVMObject::try_create_purgeable_with_size(size_t size, AllocationStrategy strategy) { Optional committed_pages; if (strategy == AllocationStrategy::Reserve || strategy == AllocationStrategy::AllocateNow) { @@ -105,18 +105,18 @@ ErrorOr> AnonymousVMObject::try_create_purgeabl auto new_physical_pages = TRY(VMObject::try_create_physical_pages(size)); - auto vmobject = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) AnonymousVMObject(move(new_physical_pages), strategy, move(committed_pages)))); + auto vmobject = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) AnonymousVMObject(move(new_physical_pages), strategy, move(committed_pages)))); vmobject->m_purgeable = true; return vmobject; } -ErrorOr> AnonymousVMObject::try_create_with_physical_pages(Span> physical_pages) +ErrorOr> AnonymousVMObject::try_create_with_physical_pages(Span> physical_pages) { - auto new_physical_pages = TRY(FixedArray>::try_create(physical_pages)); - return adopt_nonnull_ref_or_enomem(new (nothrow) AnonymousVMObject(move(new_physical_pages))); + auto new_physical_pages = TRY(FixedArray>::try_create(physical_pages)); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) AnonymousVMObject(move(new_physical_pages))); } -ErrorOr> AnonymousVMObject::try_create_for_physical_range(PhysicalAddress paddr, size_t size) +ErrorOr> AnonymousVMObject::try_create_for_physical_range(PhysicalAddress paddr, size_t size) { if (paddr.offset(size) < paddr) { dbgln("Shenanigans! try_create_for_physical_range({}, {}) would wrap around", paddr, size); @@ -126,20 +126,20 @@ ErrorOr> AnonymousVMObject::try_create_for_phys auto new_physical_pages = TRY(VMObject::try_create_physical_pages(size)); - return adopt_nonnull_ref_or_enomem(new (nothrow) AnonymousVMObject(paddr, move(new_physical_pages))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) AnonymousVMObject(paddr, move(new_physical_pages))); } -ErrorOr> AnonymousVMObject::try_create_with_shared_cow(AnonymousVMObject const& other, NonnullRefPtr shared_committed_cow_pages, FixedArray>&& new_physical_pages) +ErrorOr> AnonymousVMObject::try_create_with_shared_cow(AnonymousVMObject const& other, NonnullLockRefPtr shared_committed_cow_pages, FixedArray>&& new_physical_pages) { auto weak_parent = TRY(other.try_make_weak_ptr()); - auto vmobject = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) AnonymousVMObject(move(weak_parent), move(shared_committed_cow_pages), move(new_physical_pages)))); + auto vmobject = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) AnonymousVMObject(move(weak_parent), move(shared_committed_cow_pages), move(new_physical_pages)))); TRY(vmobject->ensure_cow_map()); return vmobject; } -AnonymousVMObject::AnonymousVMObject(FixedArray>&& new_physical_pages, AllocationStrategy strategy, Optional committed_pages) +AnonymousVMObject::AnonymousVMObject(FixedArray>&& new_physical_pages, AllocationStrategy strategy, Optional committed_pages) : VMObject(move(new_physical_pages)) , m_unused_committed_pages(move(committed_pages)) { @@ -154,7 +154,7 @@ AnonymousVMObject::AnonymousVMObject(FixedArray>&& new_phys } } -AnonymousVMObject::AnonymousVMObject(PhysicalAddress paddr, FixedArray>&& new_physical_pages) +AnonymousVMObject::AnonymousVMObject(PhysicalAddress paddr, FixedArray>&& new_physical_pages) : VMObject(move(new_physical_pages)) { VERIFY(paddr.page_base() == paddr); @@ -162,12 +162,12 @@ AnonymousVMObject::AnonymousVMObject(PhysicalAddress paddr, FixedArray>&& new_physical_pages) +AnonymousVMObject::AnonymousVMObject(FixedArray>&& new_physical_pages) : VMObject(move(new_physical_pages)) { } -AnonymousVMObject::AnonymousVMObject(WeakPtr other, NonnullRefPtr shared_committed_cow_pages, FixedArray>&& new_physical_pages) +AnonymousVMObject::AnonymousVMObject(LockWeakPtr other, NonnullLockRefPtr shared_committed_cow_pages, FixedArray>&& new_physical_pages) : VMObject(move(new_physical_pages)) , m_cow_parent(move(other)) , m_shared_committed_cow_pages(move(shared_committed_cow_pages)) @@ -270,7 +270,7 @@ ErrorOr AnonymousVMObject::set_volatile(bool is_volatile, bool& was_purged return {}; } -NonnullRefPtr AnonymousVMObject::allocate_committed_page(Badge) +NonnullLockRefPtr AnonymousVMObject::allocate_committed_page(Badge) { return m_unused_committed_pages->take_one(); } @@ -344,7 +344,7 @@ PageFaultResponse AnonymousVMObject::handle_cow_fault(size_t page_index, Virtual return PageFaultResponse::Continue; } - RefPtr page; + LockRefPtr page; if (m_shared_committed_cow_pages) { dbgln_if(PAGE_FAULT_DEBUG, " >> It's a committed COW page and it's time to COW!"); page = m_shared_committed_cow_pages->take_one(); @@ -388,7 +388,7 @@ AnonymousVMObject::SharedCommittedCowPages::SharedCommittedCowPages(CommittedPhy AnonymousVMObject::SharedCommittedCowPages::~SharedCommittedCowPages() = default; -NonnullRefPtr AnonymousVMObject::SharedCommittedCowPages::take_one() +NonnullLockRefPtr AnonymousVMObject::SharedCommittedCowPages::take_one() { SpinlockLocker locker(m_lock); return m_committed_pages.take_one(); diff --git a/Kernel/Memory/AnonymousVMObject.h b/Kernel/Memory/AnonymousVMObject.h index 71f1ef0663..40b31b6b7e 100644 --- a/Kernel/Memory/AnonymousVMObject.h +++ b/Kernel/Memory/AnonymousVMObject.h @@ -18,14 +18,14 @@ class AnonymousVMObject final : public VMObject { public: virtual ~AnonymousVMObject() override; - static ErrorOr> try_create_with_size(size_t, AllocationStrategy); - static ErrorOr> try_create_for_physical_range(PhysicalAddress paddr, size_t size); - static ErrorOr> try_create_with_physical_pages(Span>); - static ErrorOr> try_create_purgeable_with_size(size_t, AllocationStrategy); - static ErrorOr> try_create_physically_contiguous_with_size(size_t); - virtual ErrorOr> try_clone() override; + static ErrorOr> try_create_with_size(size_t, AllocationStrategy); + static ErrorOr> try_create_for_physical_range(PhysicalAddress paddr, size_t size); + static ErrorOr> try_create_with_physical_pages(Span>); + static ErrorOr> try_create_purgeable_with_size(size_t, AllocationStrategy); + static ErrorOr> try_create_physically_contiguous_with_size(size_t); + virtual ErrorOr> try_clone() override; - [[nodiscard]] NonnullRefPtr allocate_committed_page(Badge); + [[nodiscard]] NonnullLockRefPtr allocate_committed_page(Badge); PageFaultResponse handle_cow_fault(size_t, VirtualAddress); size_t cow_pages() const; bool should_cow(size_t page_index, bool) const; @@ -41,12 +41,12 @@ public: private: class SharedCommittedCowPages; - static ErrorOr> try_create_with_shared_cow(AnonymousVMObject const&, NonnullRefPtr, FixedArray>&&); + static ErrorOr> try_create_with_shared_cow(AnonymousVMObject const&, NonnullLockRefPtr, FixedArray>&&); - explicit AnonymousVMObject(FixedArray>&&, AllocationStrategy, Optional); - explicit AnonymousVMObject(PhysicalAddress, FixedArray>&&); - explicit AnonymousVMObject(FixedArray>&&); - explicit AnonymousVMObject(WeakPtr, NonnullRefPtr, FixedArray>&&); + explicit AnonymousVMObject(FixedArray>&&, AllocationStrategy, Optional); + explicit AnonymousVMObject(PhysicalAddress, FixedArray>&&); + explicit AnonymousVMObject(FixedArray>&&); + explicit AnonymousVMObject(LockWeakPtr, NonnullLockRefPtr, FixedArray>&&); virtual StringView class_name() const override { return "AnonymousVMObject"sv; } @@ -74,7 +74,7 @@ private: [[nodiscard]] bool is_empty() const { return m_committed_pages.is_empty(); } - [[nodiscard]] NonnullRefPtr take_one(); + [[nodiscard]] NonnullLockRefPtr take_one(); void uncommit_one(); private: @@ -82,8 +82,8 @@ private: CommittedPhysicalPageSet m_committed_pages; }; - WeakPtr m_cow_parent; - RefPtr m_shared_committed_cow_pages; + LockWeakPtr m_cow_parent; + LockRefPtr m_shared_committed_cow_pages; bool m_purgeable { false }; bool m_volatile { false }; diff --git a/Kernel/Memory/InodeVMObject.cpp b/Kernel/Memory/InodeVMObject.cpp index 3ef5075866..7f609c9d67 100644 --- a/Kernel/Memory/InodeVMObject.cpp +++ b/Kernel/Memory/InodeVMObject.cpp @@ -9,14 +9,14 @@ namespace Kernel::Memory { -InodeVMObject::InodeVMObject(Inode& inode, FixedArray>&& new_physical_pages, Bitmap dirty_pages) +InodeVMObject::InodeVMObject(Inode& inode, FixedArray>&& new_physical_pages, Bitmap dirty_pages) : VMObject(move(new_physical_pages)) , m_inode(inode) , m_dirty_pages(move(dirty_pages)) { } -InodeVMObject::InodeVMObject(InodeVMObject const& other, FixedArray>&& new_physical_pages, Bitmap dirty_pages) +InodeVMObject::InodeVMObject(InodeVMObject const& other, FixedArray>&& new_physical_pages, Bitmap dirty_pages) : VMObject(move(new_physical_pages)) , m_inode(other.m_inode) , m_dirty_pages(move(dirty_pages)) diff --git a/Kernel/Memory/InodeVMObject.h b/Kernel/Memory/InodeVMObject.h index 1f09c5b263..ee7124caf4 100644 --- a/Kernel/Memory/InodeVMObject.h +++ b/Kernel/Memory/InodeVMObject.h @@ -29,8 +29,8 @@ public: u32 executable_mappings() const; protected: - explicit InodeVMObject(Inode&, FixedArray>&&, Bitmap dirty_pages); - explicit InodeVMObject(InodeVMObject const&, FixedArray>&&, Bitmap dirty_pages); + explicit InodeVMObject(Inode&, FixedArray>&&, Bitmap dirty_pages); + explicit InodeVMObject(InodeVMObject const&, FixedArray>&&, Bitmap dirty_pages); InodeVMObject& operator=(InodeVMObject const&) = delete; InodeVMObject& operator=(InodeVMObject&&) = delete; @@ -38,7 +38,7 @@ protected: virtual bool is_inode() const final { return true; } - NonnullRefPtr m_inode; + NonnullLockRefPtr m_inode; Bitmap m_dirty_pages; }; diff --git a/Kernel/Memory/MemoryManager.cpp b/Kernel/Memory/MemoryManager.cpp index d15a143c91..b34e74e42f 100644 --- a/Kernel/Memory/MemoryManager.cpp +++ b/Kernel/Memory/MemoryManager.cpp @@ -512,7 +512,7 @@ UNMAP_AFTER_INIT void MemoryManager::initialize_physical_pages() auto pt_paddr = page_tables_base.offset(pt_index * PAGE_SIZE); auto physical_page_index = PhysicalAddress::physical_page_index(pt_paddr.get()); auto& physical_page_entry = m_physical_page_entries[physical_page_index]; - auto physical_page = adopt_ref(*new (&physical_page_entry.allocated.physical_page) PhysicalPage(MayReturnToFreeList::No)); + auto physical_page = adopt_lock_ref(*new (&physical_page_entry.allocated.physical_page) PhysicalPage(MayReturnToFreeList::No)); // NOTE: This leaked ref is matched by the unref in MemoryManager::release_pte() (void)physical_page.leak_ref(); @@ -757,7 +757,7 @@ ErrorOr> MemoryManager::allocate_contiguous_kernel_region( return region; } -ErrorOr> MemoryManager::allocate_dma_buffer_page(StringView name, Memory::Region::Access access, RefPtr& dma_buffer_page) +ErrorOr> MemoryManager::allocate_dma_buffer_page(StringView name, Memory::Region::Access access, LockRefPtr& dma_buffer_page) { dma_buffer_page = TRY(allocate_physical_page()); // Do not enable Cache for this region as physical memory transfers are performed (Most architectures have this behaviour by default) @@ -766,12 +766,12 @@ ErrorOr> MemoryManager::allocate_dma_buffer_page(S ErrorOr> MemoryManager::allocate_dma_buffer_page(StringView name, Memory::Region::Access access) { - RefPtr dma_buffer_page; + LockRefPtr dma_buffer_page; return allocate_dma_buffer_page(name, access, dma_buffer_page); } -ErrorOr> MemoryManager::allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access, NonnullRefPtrVector& dma_buffer_pages) +ErrorOr> MemoryManager::allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access, NonnullLockRefPtrVector& dma_buffer_pages) { VERIFY(!(size % PAGE_SIZE)); dma_buffer_pages = TRY(allocate_contiguous_physical_pages(size)); @@ -782,7 +782,7 @@ ErrorOr> MemoryManager::allocate_dma_buffer_pages( ErrorOr> MemoryManager::allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access) { VERIFY(!(size % PAGE_SIZE)); - NonnullRefPtrVector dma_buffer_pages; + NonnullLockRefPtrVector dma_buffer_pages; return allocate_dma_buffer_pages(size, name, access, dma_buffer_pages); } @@ -884,10 +884,10 @@ void MemoryManager::deallocate_physical_page(PhysicalAddress paddr) PANIC("MM: deallocate_physical_page couldn't figure out region for page @ {}", paddr); } -RefPtr MemoryManager::find_free_physical_page(bool committed) +LockRefPtr MemoryManager::find_free_physical_page(bool committed) { VERIFY(s_mm_lock.is_locked()); - RefPtr page; + LockRefPtr page; if (committed) { // Draw from the committed pages pool. We should always have these pages available VERIFY(m_system_memory_info.physical_pages_committed > 0); @@ -909,7 +909,7 @@ RefPtr MemoryManager::find_free_physical_page(bool committed) return page; } -NonnullRefPtr MemoryManager::allocate_committed_physical_page(Badge, ShouldZeroFill should_zero_fill) +NonnullLockRefPtr MemoryManager::allocate_committed_physical_page(Badge, ShouldZeroFill should_zero_fill) { SpinlockLocker lock(s_mm_lock); auto page = find_free_physical_page(true); @@ -921,7 +921,7 @@ NonnullRefPtr MemoryManager::allocate_committed_physical_page(Badg return page.release_nonnull(); } -ErrorOr> MemoryManager::allocate_physical_page(ShouldZeroFill should_zero_fill, bool* did_purge) +ErrorOr> MemoryManager::allocate_physical_page(ShouldZeroFill should_zero_fill, bool* did_purge) { SpinlockLocker lock(s_mm_lock); auto page = find_free_physical_page(false); @@ -977,7 +977,7 @@ ErrorOr> MemoryManager::allocate_physical_page(Shoul return page.release_nonnull(); } -ErrorOr> MemoryManager::allocate_contiguous_physical_pages(size_t size) +ErrorOr> MemoryManager::allocate_contiguous_physical_pages(size_t size) { VERIFY(!(size % PAGE_SIZE)); SpinlockLocker mm_lock(s_mm_lock); @@ -1189,7 +1189,7 @@ CommittedPhysicalPageSet::~CommittedPhysicalPageSet() MM.uncommit_physical_pages({}, m_page_count); } -NonnullRefPtr CommittedPhysicalPageSet::take_one() +NonnullLockRefPtr CommittedPhysicalPageSet::take_one() { VERIFY(m_page_count > 0); --m_page_count; diff --git a/Kernel/Memory/MemoryManager.h b/Kernel/Memory/MemoryManager.h index 010fae183b..cdc5eec788 100644 --- a/Kernel/Memory/MemoryManager.h +++ b/Kernel/Memory/MemoryManager.h @@ -11,8 +11,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -122,7 +122,7 @@ public: bool is_empty() const { return m_page_count == 0; } size_t page_count() const { return m_page_count; } - [[nodiscard]] NonnullRefPtr take_one(); + [[nodiscard]] NonnullLockRefPtr take_one(); void uncommit_one(); void operator=(CommittedPhysicalPageSet&&) = delete; @@ -173,15 +173,15 @@ public: ErrorOr commit_physical_pages(size_t page_count); void uncommit_physical_pages(Badge, size_t page_count); - NonnullRefPtr allocate_committed_physical_page(Badge, ShouldZeroFill = ShouldZeroFill::Yes); - ErrorOr> allocate_physical_page(ShouldZeroFill = ShouldZeroFill::Yes, bool* did_purge = nullptr); - ErrorOr> allocate_contiguous_physical_pages(size_t size); + NonnullLockRefPtr allocate_committed_physical_page(Badge, ShouldZeroFill = ShouldZeroFill::Yes); + ErrorOr> allocate_physical_page(ShouldZeroFill = ShouldZeroFill::Yes, bool* did_purge = nullptr); + ErrorOr> allocate_contiguous_physical_pages(size_t size); void deallocate_physical_page(PhysicalAddress); ErrorOr> allocate_contiguous_kernel_region(size_t, StringView name, Region::Access access, Region::Cacheable = Region::Cacheable::Yes); - ErrorOr> allocate_dma_buffer_page(StringView name, Memory::Region::Access access, RefPtr& dma_buffer_page); + ErrorOr> allocate_dma_buffer_page(StringView name, Memory::Region::Access access, LockRefPtr& dma_buffer_page); ErrorOr> allocate_dma_buffer_page(StringView name, Memory::Region::Access access); - ErrorOr> allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access, NonnullRefPtrVector& dma_buffer_pages); + ErrorOr> allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access, NonnullLockRefPtrVector& dma_buffer_pages); ErrorOr> allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access); ErrorOr> allocate_kernel_region(size_t, StringView name, Region::Access access, AllocationStrategy strategy = AllocationStrategy::Reserve, Region::Cacheable = Region::Cacheable::Yes); ErrorOr> allocate_kernel_region(PhysicalAddress, size_t, StringView name, Region::Access access, Region::Cacheable = Region::Cacheable::Yes); @@ -263,7 +263,7 @@ private: static Region* find_region_from_vaddr(VirtualAddress); - RefPtr find_free_physical_page(bool); + LockRefPtr find_free_physical_page(bool); ALWAYS_INLINE u8* quickmap_page(PhysicalPage& page) { @@ -289,10 +289,10 @@ private: VERIFY(m_system_memory_info.physical_pages == (m_system_memory_info.physical_pages_used + physical_pages_unused)); } - RefPtr m_kernel_page_directory; + LockRefPtr m_kernel_page_directory; - RefPtr m_shared_zero_page; - RefPtr m_lazy_committed_page; + LockRefPtr m_shared_zero_page; + LockRefPtr m_lazy_committed_page; SystemMemoryInfo m_system_memory_info; diff --git a/Kernel/Memory/PageDirectory.cpp b/Kernel/Memory/PageDirectory.cpp index 13e494d26a..068c9c7249 100644 --- a/Kernel/Memory/PageDirectory.cpp +++ b/Kernel/Memory/PageDirectory.cpp @@ -20,14 +20,14 @@ extern u8 end_of_kernel_image[]; namespace Kernel::Memory { -UNMAP_AFTER_INIT NonnullRefPtr PageDirectory::must_create_kernel_page_directory() +UNMAP_AFTER_INIT NonnullLockRefPtr PageDirectory::must_create_kernel_page_directory() { - return adopt_ref_if_nonnull(new (nothrow) PageDirectory).release_nonnull(); + return adopt_lock_ref_if_nonnull(new (nothrow) PageDirectory).release_nonnull(); } -ErrorOr> PageDirectory::try_create_for_userspace() +ErrorOr> PageDirectory::try_create_for_userspace() { - auto directory = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) PageDirectory)); + auto directory = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) PageDirectory)); // NOTE: Take the MM lock since we need it for quickmap. SpinlockLocker lock(s_mm_lock); diff --git a/Kernel/Memory/PageDirectory.h b/Kernel/Memory/PageDirectory.h index 84450e665b..20b4a059f3 100644 --- a/Kernel/Memory/PageDirectory.h +++ b/Kernel/Memory/PageDirectory.h @@ -10,8 +10,8 @@ #include #include #include -#include #include +#include #include #include @@ -21,9 +21,9 @@ class PageDirectory final : public AtomicRefCounted { friend class MemoryManager; public: - static ErrorOr> try_create_for_userspace(); - static NonnullRefPtr must_create_kernel_page_directory(); - static RefPtr find_current(); + static ErrorOr> try_create_for_userspace(); + static NonnullLockRefPtr must_create_kernel_page_directory(); + static LockRefPtr find_current(); ~PageDirectory(); @@ -64,13 +64,13 @@ private: AddressSpace* m_space { nullptr }; #if ARCH(X86_64) - RefPtr m_pml4t; + LockRefPtr m_pml4t; #endif - RefPtr m_directory_table; + LockRefPtr m_directory_table; #if ARCH(X86_64) - RefPtr m_directory_pages[512]; + LockRefPtr m_directory_pages[512]; #else - RefPtr m_directory_pages[4]; + LockRefPtr m_directory_pages[4]; #endif RecursiveSpinlock m_lock { LockRank::None }; }; diff --git a/Kernel/Memory/PhysicalPage.cpp b/Kernel/Memory/PhysicalPage.cpp index b4890b5c4a..15474b99c6 100644 --- a/Kernel/Memory/PhysicalPage.cpp +++ b/Kernel/Memory/PhysicalPage.cpp @@ -10,10 +10,10 @@ namespace Kernel::Memory { -NonnullRefPtr PhysicalPage::create(PhysicalAddress paddr, MayReturnToFreeList may_return_to_freelist) +NonnullLockRefPtr PhysicalPage::create(PhysicalAddress paddr, MayReturnToFreeList may_return_to_freelist) { auto& physical_page_entry = MM.get_physical_page_entry(paddr); - return adopt_ref(*new (&physical_page_entry.allocated.physical_page) PhysicalPage(may_return_to_freelist)); + return adopt_lock_ref(*new (&physical_page_entry.allocated.physical_page) PhysicalPage(may_return_to_freelist)); } PhysicalPage::PhysicalPage(MayReturnToFreeList may_return_to_freelist) diff --git a/Kernel/Memory/PhysicalPage.h b/Kernel/Memory/PhysicalPage.h index fe898c04a8..65c7e5bb37 100644 --- a/Kernel/Memory/PhysicalPage.h +++ b/Kernel/Memory/PhysicalPage.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include namespace Kernel::Memory { @@ -36,7 +36,7 @@ public: free_this(); } - static NonnullRefPtr create(PhysicalAddress, MayReturnToFreeList may_return_to_freelist = MayReturnToFreeList::Yes); + static NonnullLockRefPtr create(PhysicalAddress, MayReturnToFreeList may_return_to_freelist = MayReturnToFreeList::Yes); u32 ref_count() const { return m_ref_count.load(AK::memory_order_consume); } diff --git a/Kernel/Memory/PhysicalRegion.cpp b/Kernel/Memory/PhysicalRegion.cpp index 7f7409ee98..c245a604e4 100644 --- a/Kernel/Memory/PhysicalRegion.cpp +++ b/Kernel/Memory/PhysicalRegion.cpp @@ -5,9 +5,9 @@ */ #include -#include -#include #include +#include +#include #include #include #include @@ -76,7 +76,7 @@ OwnPtr PhysicalRegion::try_take_pages_from_beginning(unsigned pa return try_create(taken_lower, taken_upper); } -NonnullRefPtrVector PhysicalRegion::take_contiguous_free_pages(size_t count) +NonnullLockRefPtrVector PhysicalRegion::take_contiguous_free_pages(size_t count) { auto rounded_page_count = next_power_of_two(count); auto order = count_trailing_zeroes(rounded_page_count); @@ -96,7 +96,7 @@ NonnullRefPtrVector PhysicalRegion::take_contiguous_free_pages(siz if (!page_base.has_value()) return {}; - NonnullRefPtrVector physical_pages; + NonnullLockRefPtrVector physical_pages; physical_pages.ensure_capacity(count); for (size_t i = 0; i < count; ++i) @@ -104,7 +104,7 @@ NonnullRefPtrVector PhysicalRegion::take_contiguous_free_pages(siz return physical_pages; } -RefPtr PhysicalRegion::take_free_page() +LockRefPtr PhysicalRegion::take_free_page() { if (m_usable_zones.is_empty()) return nullptr; diff --git a/Kernel/Memory/PhysicalRegion.h b/Kernel/Memory/PhysicalRegion.h index 19c527f7f1..9310ae9d44 100644 --- a/Kernel/Memory/PhysicalRegion.h +++ b/Kernel/Memory/PhysicalRegion.h @@ -33,8 +33,8 @@ public: OwnPtr try_take_pages_from_beginning(unsigned); - RefPtr take_free_page(); - NonnullRefPtrVector take_contiguous_free_pages(size_t count); + LockRefPtr take_free_page(); + NonnullLockRefPtrVector take_contiguous_free_pages(size_t count); void return_page(PhysicalAddress); private: diff --git a/Kernel/Memory/PrivateInodeVMObject.cpp b/Kernel/Memory/PrivateInodeVMObject.cpp index 249a9eb8ea..65418b34db 100644 --- a/Kernel/Memory/PrivateInodeVMObject.cpp +++ b/Kernel/Memory/PrivateInodeVMObject.cpp @@ -9,26 +9,26 @@ namespace Kernel::Memory { -ErrorOr> PrivateInodeVMObject::try_create_with_inode(Inode& inode) +ErrorOr> PrivateInodeVMObject::try_create_with_inode(Inode& inode) { auto new_physical_pages = TRY(VMObject::try_create_physical_pages(inode.size())); auto dirty_pages = TRY(Bitmap::try_create(new_physical_pages.size(), false)); - return adopt_nonnull_ref_or_enomem(new (nothrow) PrivateInodeVMObject(inode, move(new_physical_pages), move(dirty_pages))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) PrivateInodeVMObject(inode, move(new_physical_pages), move(dirty_pages))); } -ErrorOr> PrivateInodeVMObject::try_clone() +ErrorOr> PrivateInodeVMObject::try_clone() { auto new_physical_pages = TRY(this->try_clone_physical_pages()); auto dirty_pages = TRY(Bitmap::try_create(new_physical_pages.size(), false)); - return adopt_nonnull_ref_or_enomem(new (nothrow) PrivateInodeVMObject(*this, move(new_physical_pages), move(dirty_pages))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) PrivateInodeVMObject(*this, move(new_physical_pages), move(dirty_pages))); } -PrivateInodeVMObject::PrivateInodeVMObject(Inode& inode, FixedArray>&& new_physical_pages, Bitmap dirty_pages) +PrivateInodeVMObject::PrivateInodeVMObject(Inode& inode, FixedArray>&& new_physical_pages, Bitmap dirty_pages) : InodeVMObject(inode, move(new_physical_pages), move(dirty_pages)) { } -PrivateInodeVMObject::PrivateInodeVMObject(PrivateInodeVMObject const& other, FixedArray>&& new_physical_pages, Bitmap dirty_pages) +PrivateInodeVMObject::PrivateInodeVMObject(PrivateInodeVMObject const& other, FixedArray>&& new_physical_pages, Bitmap dirty_pages) : InodeVMObject(other, move(new_physical_pages), move(dirty_pages)) { } diff --git a/Kernel/Memory/PrivateInodeVMObject.h b/Kernel/Memory/PrivateInodeVMObject.h index 6b480832e3..31b2df4757 100644 --- a/Kernel/Memory/PrivateInodeVMObject.h +++ b/Kernel/Memory/PrivateInodeVMObject.h @@ -17,14 +17,14 @@ class PrivateInodeVMObject final : public InodeVMObject { public: virtual ~PrivateInodeVMObject() override; - static ErrorOr> try_create_with_inode(Inode&); - virtual ErrorOr> try_clone() override; + static ErrorOr> try_create_with_inode(Inode&); + virtual ErrorOr> try_clone() override; private: virtual bool is_private_inode() const override { return true; } - explicit PrivateInodeVMObject(Inode&, FixedArray>&&, Bitmap dirty_pages); - explicit PrivateInodeVMObject(PrivateInodeVMObject const&, FixedArray>&&, Bitmap dirty_pages); + explicit PrivateInodeVMObject(Inode&, FixedArray>&&, Bitmap dirty_pages); + explicit PrivateInodeVMObject(PrivateInodeVMObject const&, FixedArray>&&, Bitmap dirty_pages); virtual StringView class_name() const override { return "PrivateInodeVMObject"sv; } diff --git a/Kernel/Memory/Region.cpp b/Kernel/Memory/Region.cpp index d82aebdc6d..6016a2c4fc 100644 --- a/Kernel/Memory/Region.cpp +++ b/Kernel/Memory/Region.cpp @@ -27,7 +27,7 @@ Region::Region() { } -Region::Region(NonnullRefPtr vmobject, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable cacheable, bool shared) +Region::Region(NonnullLockRefPtr vmobject, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable cacheable, bool shared) : m_range(VirtualRange({}, 0)) , m_offset_in_vmobject(offset_in_vmobject) , m_vmobject(move(vmobject)) @@ -39,7 +39,7 @@ Region::Region(NonnullRefPtr vmobject, size_t offset_in_vmobject, OwnP m_vmobject->add_region(*this); } -Region::Region(VirtualRange const& range, NonnullRefPtr vmobject, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable cacheable, bool shared) +Region::Region(VirtualRange const& range, NonnullLockRefPtr vmobject, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable cacheable, bool shared) : m_range(range) , m_offset_in_vmobject(offset_in_vmobject) , m_vmobject(move(vmobject)) @@ -84,7 +84,7 @@ ErrorOr> Region::create_unbacked() return adopt_nonnull_own_or_enomem(new (nothrow) Region); } -ErrorOr> Region::create_unplaced(NonnullRefPtr vmobject, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable cacheable, bool shared) +ErrorOr> Region::create_unplaced(NonnullLockRefPtr vmobject, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable cacheable, bool shared) { return adopt_nonnull_own_or_enomem(new (nothrow) Region(move(vmobject), offset_in_vmobject, move(name), access, cacheable, shared)); } @@ -137,7 +137,7 @@ ErrorOr> Region::try_clone() return clone_region; } -void Region::set_vmobject(NonnullRefPtr&& obj) +void Region::set_vmobject(NonnullLockRefPtr&& obj) { if (m_vmobject.ptr() == obj.ptr()) return; @@ -182,7 +182,7 @@ size_t Region::amount_shared() const return bytes; } -ErrorOr> Region::try_create_user_accessible(VirtualRange const& range, NonnullRefPtr vmobject, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable cacheable, bool shared) +ErrorOr> Region::try_create_user_accessible(VirtualRange const& range, NonnullLockRefPtr vmobject, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable cacheable, bool shared) { return adopt_nonnull_own_or_enomem(new (nothrow) Region(range, move(vmobject), offset_in_vmobject, move(name), access, cacheable, shared)); } @@ -202,7 +202,7 @@ ErrorOr Region::set_should_cow(size_t page_index, bool cow) return {}; } -bool Region::map_individual_page_impl(size_t page_index, RefPtr page) +bool Region::map_individual_page_impl(size_t page_index, LockRefPtr page) { VERIFY(m_page_directory->get_lock().is_locked_by_current_processor()); @@ -241,7 +241,7 @@ bool Region::map_individual_page_impl(size_t page_index, RefPtr pa bool Region::map_individual_page_impl(size_t page_index) { - RefPtr page; + LockRefPtr page; { SpinlockLocker vmobject_locker(vmobject().m_lock); page = physical_page(page_index); @@ -250,7 +250,7 @@ bool Region::map_individual_page_impl(size_t page_index) return map_individual_page_impl(page_index, page); } -bool Region::remap_vmobject_page(size_t page_index, NonnullRefPtr physical_page) +bool Region::remap_vmobject_page(size_t page_index, NonnullLockRefPtr physical_page) { SpinlockLocker page_lock(m_page_directory->get_lock()); @@ -410,7 +410,7 @@ PageFaultResponse Region::handle_zero_fault(size_t page_index_in_region, Physica if (current_thread != nullptr) current_thread->did_zero_fault(); - RefPtr new_physical_page; + LockRefPtr new_physical_page; if (page_in_slot_at_time_of_fault.is_lazy_committed_page()) { VERIFY(m_vmobject->is_anonymous()); @@ -546,14 +546,14 @@ PageFaultResponse Region::handle_inode_fault(size_t page_index_in_region) return PageFaultResponse::Continue; } -RefPtr Region::physical_page(size_t index) const +LockRefPtr Region::physical_page(size_t index) const { SpinlockLocker vmobject_locker(vmobject().m_lock); VERIFY(index < page_count()); return vmobject().physical_pages()[first_page_index() + index]; } -RefPtr& Region::physical_page_slot(size_t index) +LockRefPtr& Region::physical_page_slot(size_t index) { VERIFY(vmobject().m_lock.is_locked_by_current_processor()); VERIFY(index < page_count()); diff --git a/Kernel/Memory/Region.h b/Kernel/Memory/Region.h index ade7bc9c76..fbbf61ea5f 100644 --- a/Kernel/Memory/Region.h +++ b/Kernel/Memory/Region.h @@ -10,9 +10,9 @@ #include #include #include -#include #include #include +#include #include #include #include @@ -30,7 +30,7 @@ enum class ShouldFlushTLB { }; class Region final - : public Weakable { + : public LockWeakable { friend class AddressSpace; friend class MemoryManager; friend class RegionTree; @@ -54,9 +54,9 @@ public: Yes, }; - static ErrorOr> try_create_user_accessible(VirtualRange const&, NonnullRefPtr, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable, bool shared); + static ErrorOr> try_create_user_accessible(VirtualRange const&, NonnullLockRefPtr, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable, bool shared); static ErrorOr> create_unbacked(); - static ErrorOr> create_unplaced(NonnullRefPtr, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable = Cacheable::Yes, bool shared = false); + static ErrorOr> create_unplaced(NonnullLockRefPtr, size_t offset_in_vmobject, OwnPtr name, Region::Access access, Cacheable = Cacheable::Yes, bool shared = false); ~Region(); @@ -80,7 +80,7 @@ public: [[nodiscard]] VMObject const& vmobject() const { return *m_vmobject; } [[nodiscard]] VMObject& vmobject() { return *m_vmobject; } - void set_vmobject(NonnullRefPtr&&); + void set_vmobject(NonnullLockRefPtr&&); [[nodiscard]] bool is_shared() const { return m_shared; } void set_shared(bool shared) { m_shared = shared; } @@ -152,8 +152,8 @@ public: return size() / PAGE_SIZE; } - RefPtr physical_page(size_t index) const; - RefPtr& physical_page_slot(size_t index); + LockRefPtr physical_page(size_t index) const; + LockRefPtr& physical_page_slot(size_t index); [[nodiscard]] size_t offset_in_vmobject() const { @@ -196,10 +196,10 @@ public: private: Region(); - Region(NonnullRefPtr, size_t offset_in_vmobject, OwnPtr, Region::Access access, Cacheable, bool shared); - Region(VirtualRange const&, NonnullRefPtr, size_t offset_in_vmobject, OwnPtr, Region::Access access, Cacheable, bool shared); + Region(NonnullLockRefPtr, size_t offset_in_vmobject, OwnPtr, Region::Access access, Cacheable, bool shared); + Region(VirtualRange const&, NonnullLockRefPtr, size_t offset_in_vmobject, OwnPtr, Region::Access access, Cacheable, bool shared); - [[nodiscard]] bool remap_vmobject_page(size_t page_index, NonnullRefPtr); + [[nodiscard]] bool remap_vmobject_page(size_t page_index, NonnullLockRefPtr); void set_access_bit(Access access, bool b) { @@ -214,12 +214,12 @@ private: [[nodiscard]] PageFaultResponse handle_zero_fault(size_t page_index, PhysicalPage& page_in_slot_at_time_of_fault); [[nodiscard]] bool map_individual_page_impl(size_t page_index); - [[nodiscard]] bool map_individual_page_impl(size_t page_index, RefPtr); + [[nodiscard]] bool map_individual_page_impl(size_t page_index, LockRefPtr); - RefPtr m_page_directory; + LockRefPtr m_page_directory; VirtualRange m_range; size_t m_offset_in_vmobject { 0 }; - RefPtr m_vmobject; + LockRefPtr m_vmobject; OwnPtr m_name; u8 m_access { Region::None }; bool m_shared : 1 { false }; diff --git a/Kernel/Memory/ScatterGatherList.cpp b/Kernel/Memory/ScatterGatherList.cpp index 0b22f12f6f..8149a886b7 100644 --- a/Kernel/Memory/ScatterGatherList.cpp +++ b/Kernel/Memory/ScatterGatherList.cpp @@ -8,17 +8,17 @@ namespace Kernel::Memory { -RefPtr ScatterGatherList::try_create(AsyncBlockDeviceRequest& request, Span> allocated_pages, size_t device_block_size) +LockRefPtr ScatterGatherList::try_create(AsyncBlockDeviceRequest& request, Span> allocated_pages, size_t device_block_size) { auto maybe_vm_object = AnonymousVMObject::try_create_with_physical_pages(allocated_pages); if (maybe_vm_object.is_error()) { // FIXME: Would be nice to be able to return a ErrorOr here. return {}; } - return adopt_ref_if_nonnull(new (nothrow) ScatterGatherList(maybe_vm_object.release_value(), request, device_block_size)); + return adopt_lock_ref_if_nonnull(new (nothrow) ScatterGatherList(maybe_vm_object.release_value(), request, device_block_size)); } -ScatterGatherList::ScatterGatherList(NonnullRefPtr vm_object, AsyncBlockDeviceRequest& request, size_t device_block_size) +ScatterGatherList::ScatterGatherList(NonnullLockRefPtr vm_object, AsyncBlockDeviceRequest& request, size_t device_block_size) : m_vm_object(move(vm_object)) { auto region_or_error = MM.allocate_kernel_region_with_vmobject(m_vm_object, page_round_up((request.block_count() * device_block_size)).release_value_but_fixme_should_propagate_errors(), "AHCI Scattered DMA"sv, Region::Access::Read | Region::Access::Write, Region::Cacheable::Yes); diff --git a/Kernel/Memory/ScatterGatherList.h b/Kernel/Memory/ScatterGatherList.h index 1c57b6a2eb..1fc78bab70 100644 --- a/Kernel/Memory/ScatterGatherList.h +++ b/Kernel/Memory/ScatterGatherList.h @@ -19,14 +19,14 @@ namespace Kernel::Memory { class ScatterGatherList final : public AtomicRefCounted { public: - static RefPtr try_create(AsyncBlockDeviceRequest&, Span> allocated_pages, size_t device_block_size); + static LockRefPtr try_create(AsyncBlockDeviceRequest&, Span> allocated_pages, size_t device_block_size); VMObject const& vmobject() const { return m_vm_object; } VirtualAddress dma_region() const { return m_dma_region->vaddr(); } size_t scatters_count() const { return m_vm_object->physical_pages().size(); } private: - ScatterGatherList(NonnullRefPtr, AsyncBlockDeviceRequest&, size_t device_block_size); - NonnullRefPtr m_vm_object; + ScatterGatherList(NonnullLockRefPtr, AsyncBlockDeviceRequest&, size_t device_block_size); + NonnullLockRefPtr m_vm_object; OwnPtr m_dma_region; }; diff --git a/Kernel/Memory/SharedFramebufferVMObject.cpp b/Kernel/Memory/SharedFramebufferVMObject.cpp index feb34de139..7b4c605314 100644 --- a/Kernel/Memory/SharedFramebufferVMObject.cpp +++ b/Kernel/Memory/SharedFramebufferVMObject.cpp @@ -10,38 +10,38 @@ namespace Kernel::Memory { -ErrorOr> SharedFramebufferVMObject::try_create_for_physical_range(PhysicalAddress paddr, size_t size) +ErrorOr> SharedFramebufferVMObject::try_create_for_physical_range(PhysicalAddress paddr, size_t size) { auto real_framebuffer_vmobject = TRY(AnonymousVMObject::try_create_for_physical_range(paddr, size)); auto new_physical_pages = TRY(VMObject::try_create_physical_pages(size)); auto committed_pages = TRY(MM.commit_physical_pages(ceil_div(size, static_cast(PAGE_SIZE)))); - auto vm_object = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) SharedFramebufferVMObject(move(new_physical_pages), move(committed_pages), real_framebuffer_vmobject))); + auto vm_object = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) SharedFramebufferVMObject(move(new_physical_pages), move(committed_pages), real_framebuffer_vmobject))); TRY(vm_object->create_fake_writes_framebuffer_vm_object()); TRY(vm_object->create_real_writes_framebuffer_vm_object()); return vm_object; } -ErrorOr> SharedFramebufferVMObject::try_create_at_arbitrary_physical_range(size_t size) +ErrorOr> SharedFramebufferVMObject::try_create_at_arbitrary_physical_range(size_t size) { auto real_framebuffer_vmobject = TRY(AnonymousVMObject::try_create_with_size(size, AllocationStrategy::AllocateNow)); auto new_physical_pages = TRY(VMObject::try_create_physical_pages(size)); auto committed_pages = TRY(MM.commit_physical_pages(ceil_div(size, static_cast(PAGE_SIZE)))); - auto vm_object = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) SharedFramebufferVMObject(move(new_physical_pages), move(committed_pages), real_framebuffer_vmobject))); + auto vm_object = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) SharedFramebufferVMObject(move(new_physical_pages), move(committed_pages), real_framebuffer_vmobject))); TRY(vm_object->create_fake_writes_framebuffer_vm_object()); TRY(vm_object->create_real_writes_framebuffer_vm_object()); return vm_object; } -ErrorOr> SharedFramebufferVMObject::FakeWritesFramebufferVMObject::try_create(Badge, SharedFramebufferVMObject const& parent_object) +ErrorOr> SharedFramebufferVMObject::FakeWritesFramebufferVMObject::try_create(Badge, SharedFramebufferVMObject const& parent_object) { auto new_physical_pages = TRY(VMObject::try_create_physical_pages(0)); - return adopt_nonnull_ref_or_enomem(new (nothrow) FakeWritesFramebufferVMObject(parent_object, move(new_physical_pages))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) FakeWritesFramebufferVMObject(parent_object, move(new_physical_pages))); } -ErrorOr> SharedFramebufferVMObject::RealWritesFramebufferVMObject::try_create(Badge, SharedFramebufferVMObject const& parent_object) +ErrorOr> SharedFramebufferVMObject::RealWritesFramebufferVMObject::try_create(Badge, SharedFramebufferVMObject const& parent_object) { auto new_physical_pages = TRY(VMObject::try_create_physical_pages(0)); - return adopt_nonnull_ref_or_enomem(new (nothrow) RealWritesFramebufferVMObject(parent_object, move(new_physical_pages))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) RealWritesFramebufferVMObject(parent_object, move(new_physical_pages))); } ErrorOr SharedFramebufferVMObject::create_fake_writes_framebuffer_vm_object() @@ -56,21 +56,21 @@ ErrorOr SharedFramebufferVMObject::create_real_writes_framebuffer_vm_objec return {}; } -Span> SharedFramebufferVMObject::real_framebuffer_physical_pages() +Span> SharedFramebufferVMObject::real_framebuffer_physical_pages() { return m_real_framebuffer_vmobject->physical_pages(); } -Span const> SharedFramebufferVMObject::real_framebuffer_physical_pages() const +Span const> SharedFramebufferVMObject::real_framebuffer_physical_pages() const { return m_real_framebuffer_vmobject->physical_pages(); } -Span> SharedFramebufferVMObject::fake_sink_framebuffer_physical_pages() +Span> SharedFramebufferVMObject::fake_sink_framebuffer_physical_pages() { return m_physical_pages.span(); } -Span const> SharedFramebufferVMObject::fake_sink_framebuffer_physical_pages() const +Span const> SharedFramebufferVMObject::fake_sink_framebuffer_physical_pages() const { return m_physical_pages.span(); } @@ -92,14 +92,14 @@ void SharedFramebufferVMObject::switch_to_real_framebuffer_writes(Badge const> SharedFramebufferVMObject::physical_pages() const +Span const> SharedFramebufferVMObject::physical_pages() const { SpinlockLocker locker(m_writes_state_lock); if (m_writes_are_faked) return VMObject::physical_pages(); return m_real_framebuffer_vmobject->physical_pages(); } -Span> SharedFramebufferVMObject::physical_pages() +Span> SharedFramebufferVMObject::physical_pages() { SpinlockLocker locker(m_writes_state_lock); if (m_writes_are_faked) @@ -107,7 +107,7 @@ Span> SharedFramebufferVMObject::physical_pages() return m_real_framebuffer_vmobject->physical_pages(); } -SharedFramebufferVMObject::SharedFramebufferVMObject(FixedArray>&& new_physical_pages, CommittedPhysicalPageSet committed_pages, AnonymousVMObject& real_framebuffer_vmobject) +SharedFramebufferVMObject::SharedFramebufferVMObject(FixedArray>&& new_physical_pages, CommittedPhysicalPageSet committed_pages, AnonymousVMObject& real_framebuffer_vmobject) : VMObject(move(new_physical_pages)) , m_real_framebuffer_vmobject(real_framebuffer_vmobject) , m_committed_pages(move(committed_pages)) diff --git a/Kernel/Memory/SharedFramebufferVMObject.h b/Kernel/Memory/SharedFramebufferVMObject.h index 5fb43b1960..0823f92583 100644 --- a/Kernel/Memory/SharedFramebufferVMObject.h +++ b/Kernel/Memory/SharedFramebufferVMObject.h @@ -19,55 +19,55 @@ class SharedFramebufferVMObject final : public VMObject { public: class FakeWritesFramebufferVMObject final : public VMObject { public: - static ErrorOr> try_create(Badge, SharedFramebufferVMObject const& parent_object); + static ErrorOr> try_create(Badge, SharedFramebufferVMObject const& parent_object); private: - FakeWritesFramebufferVMObject(SharedFramebufferVMObject const& parent_object, FixedArray>&& new_physical_pages) + FakeWritesFramebufferVMObject(SharedFramebufferVMObject const& parent_object, FixedArray>&& new_physical_pages) : VMObject(move(new_physical_pages)) , m_parent_object(parent_object) { } virtual StringView class_name() const override { return "FakeWritesFramebufferVMObject"sv; } - virtual ErrorOr> try_clone() override { return Error::from_errno(ENOTIMPL); } - virtual Span const> physical_pages() const override { return m_parent_object->fake_sink_framebuffer_physical_pages(); } - virtual Span> physical_pages() override { return m_parent_object->fake_sink_framebuffer_physical_pages(); } - NonnullRefPtr m_parent_object; + virtual ErrorOr> try_clone() override { return Error::from_errno(ENOTIMPL); } + virtual Span const> physical_pages() const override { return m_parent_object->fake_sink_framebuffer_physical_pages(); } + virtual Span> physical_pages() override { return m_parent_object->fake_sink_framebuffer_physical_pages(); } + NonnullLockRefPtr m_parent_object; }; class RealWritesFramebufferVMObject final : public VMObject { public: - static ErrorOr> try_create(Badge, SharedFramebufferVMObject const& parent_object); + static ErrorOr> try_create(Badge, SharedFramebufferVMObject const& parent_object); private: - RealWritesFramebufferVMObject(SharedFramebufferVMObject const& parent_object, FixedArray>&& new_physical_pages) + RealWritesFramebufferVMObject(SharedFramebufferVMObject const& parent_object, FixedArray>&& new_physical_pages) : VMObject(move(new_physical_pages)) , m_parent_object(parent_object) { } virtual StringView class_name() const override { return "RealWritesFramebufferVMObject"sv; } - virtual ErrorOr> try_clone() override { return Error::from_errno(ENOTIMPL); } - virtual Span const> physical_pages() const override { return m_parent_object->real_framebuffer_physical_pages(); } - virtual Span> physical_pages() override { return m_parent_object->real_framebuffer_physical_pages(); } - NonnullRefPtr m_parent_object; + virtual ErrorOr> try_clone() override { return Error::from_errno(ENOTIMPL); } + virtual Span const> physical_pages() const override { return m_parent_object->real_framebuffer_physical_pages(); } + virtual Span> physical_pages() override { return m_parent_object->real_framebuffer_physical_pages(); } + NonnullLockRefPtr m_parent_object; }; virtual ~SharedFramebufferVMObject() override = default; - static ErrorOr> try_create_for_physical_range(PhysicalAddress paddr, size_t size); - static ErrorOr> try_create_at_arbitrary_physical_range(size_t size); - virtual ErrorOr> try_clone() override { return Error::from_errno(ENOTIMPL); } + static ErrorOr> try_create_for_physical_range(PhysicalAddress paddr, size_t size); + static ErrorOr> try_create_at_arbitrary_physical_range(size_t size); + virtual ErrorOr> try_clone() override { return Error::from_errno(ENOTIMPL); } void switch_to_fake_sink_framebuffer_writes(Badge); void switch_to_real_framebuffer_writes(Badge); - virtual Span const> physical_pages() const override; - virtual Span> physical_pages() override; + virtual Span const> physical_pages() const override; + virtual Span> physical_pages() override; - Span> fake_sink_framebuffer_physical_pages(); - Span const> fake_sink_framebuffer_physical_pages() const; + Span> fake_sink_framebuffer_physical_pages(); + Span const> fake_sink_framebuffer_physical_pages() const; - Span> real_framebuffer_physical_pages(); - Span const> real_framebuffer_physical_pages() const; + Span> real_framebuffer_physical_pages(); + Span const> real_framebuffer_physical_pages() const; FakeWritesFramebufferVMObject const& fake_writes_framebuffer_vmobject() const { return *m_fake_writes_framebuffer_vmobject; } FakeWritesFramebufferVMObject& fake_writes_framebuffer_vmobject() { return *m_fake_writes_framebuffer_vmobject; } @@ -76,16 +76,16 @@ public: RealWritesFramebufferVMObject& real_writes_framebuffer_vmobject() { return *m_real_writes_framebuffer_vmobject; } private: - SharedFramebufferVMObject(FixedArray>&& new_physical_pages, CommittedPhysicalPageSet, AnonymousVMObject& real_framebuffer_vmobject); + SharedFramebufferVMObject(FixedArray>&& new_physical_pages, CommittedPhysicalPageSet, AnonymousVMObject& real_framebuffer_vmobject); virtual StringView class_name() const override { return "SharedFramebufferVMObject"sv; } ErrorOr create_fake_writes_framebuffer_vm_object(); ErrorOr create_real_writes_framebuffer_vm_object(); - NonnullRefPtr m_real_framebuffer_vmobject; - RefPtr m_fake_writes_framebuffer_vmobject; - RefPtr m_real_writes_framebuffer_vmobject; + NonnullLockRefPtr m_real_framebuffer_vmobject; + LockRefPtr m_fake_writes_framebuffer_vmobject; + LockRefPtr m_real_writes_framebuffer_vmobject; bool m_writes_are_faked { false }; mutable RecursiveSpinlock m_writes_state_lock { LockRank::None }; CommittedPhysicalPageSet m_committed_pages; diff --git a/Kernel/Memory/SharedInodeVMObject.cpp b/Kernel/Memory/SharedInodeVMObject.cpp index 2f1e3e27cb..74853c8600 100644 --- a/Kernel/Memory/SharedInodeVMObject.cpp +++ b/Kernel/Memory/SharedInodeVMObject.cpp @@ -10,31 +10,31 @@ namespace Kernel::Memory { -ErrorOr> SharedInodeVMObject::try_create_with_inode(Inode& inode) +ErrorOr> SharedInodeVMObject::try_create_with_inode(Inode& inode) { size_t size = inode.size(); if (auto shared_vmobject = inode.shared_vmobject()) return shared_vmobject.release_nonnull(); auto new_physical_pages = TRY(VMObject::try_create_physical_pages(size)); auto dirty_pages = TRY(Bitmap::try_create(new_physical_pages.size(), false)); - auto vmobject = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) SharedInodeVMObject(inode, move(new_physical_pages), move(dirty_pages)))); + auto vmobject = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) SharedInodeVMObject(inode, move(new_physical_pages), move(dirty_pages)))); TRY(vmobject->inode().set_shared_vmobject(*vmobject)); return vmobject; } -ErrorOr> SharedInodeVMObject::try_clone() +ErrorOr> SharedInodeVMObject::try_clone() { auto new_physical_pages = TRY(this->try_clone_physical_pages()); auto dirty_pages = TRY(Bitmap::try_create(new_physical_pages.size(), false)); - return adopt_nonnull_ref_or_enomem(new (nothrow) SharedInodeVMObject(*this, move(new_physical_pages), move(dirty_pages))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) SharedInodeVMObject(*this, move(new_physical_pages), move(dirty_pages))); } -SharedInodeVMObject::SharedInodeVMObject(Inode& inode, FixedArray>&& new_physical_pages, Bitmap dirty_pages) +SharedInodeVMObject::SharedInodeVMObject(Inode& inode, FixedArray>&& new_physical_pages, Bitmap dirty_pages) : InodeVMObject(inode, move(new_physical_pages), move(dirty_pages)) { } -SharedInodeVMObject::SharedInodeVMObject(SharedInodeVMObject const& other, FixedArray>&& new_physical_pages, Bitmap dirty_pages) +SharedInodeVMObject::SharedInodeVMObject(SharedInodeVMObject const& other, FixedArray>&& new_physical_pages, Bitmap dirty_pages) : InodeVMObject(other, move(new_physical_pages), move(dirty_pages)) { } diff --git a/Kernel/Memory/SharedInodeVMObject.h b/Kernel/Memory/SharedInodeVMObject.h index 75d3637808..6f3c554a1d 100644 --- a/Kernel/Memory/SharedInodeVMObject.h +++ b/Kernel/Memory/SharedInodeVMObject.h @@ -15,16 +15,16 @@ class SharedInodeVMObject final : public InodeVMObject { AK_MAKE_NONMOVABLE(SharedInodeVMObject); public: - static ErrorOr> try_create_with_inode(Inode&); - virtual ErrorOr> try_clone() override; + static ErrorOr> try_create_with_inode(Inode&); + virtual ErrorOr> try_clone() override; ErrorOr sync(off_t offset_in_pages = 0, size_t pages = -1); private: virtual bool is_shared_inode() const override { return true; } - explicit SharedInodeVMObject(Inode&, FixedArray>&&, Bitmap dirty_pages); - explicit SharedInodeVMObject(SharedInodeVMObject const&, FixedArray>&&, Bitmap dirty_pages); + explicit SharedInodeVMObject(Inode&, FixedArray>&&, Bitmap dirty_pages); + explicit SharedInodeVMObject(SharedInodeVMObject const&, FixedArray>&&, Bitmap dirty_pages); virtual StringView class_name() const override { return "SharedInodeVMObject"sv; } diff --git a/Kernel/Memory/VMObject.cpp b/Kernel/Memory/VMObject.cpp index d6d09c888b..abe5fb5cc6 100644 --- a/Kernel/Memory/VMObject.cpp +++ b/Kernel/Memory/VMObject.cpp @@ -17,17 +17,17 @@ SpinlockProtected& VMObject::all_instances() return s_all_instances; } -ErrorOr>> VMObject::try_clone_physical_pages() const +ErrorOr>> VMObject::try_clone_physical_pages() const { return m_physical_pages.try_clone(); } -ErrorOr>> VMObject::try_create_physical_pages(size_t size) +ErrorOr>> VMObject::try_create_physical_pages(size_t size) { - return FixedArray>::try_create(ceil_div(size, static_cast(PAGE_SIZE))); + return FixedArray>::try_create(ceil_div(size, static_cast(PAGE_SIZE))); } -VMObject::VMObject(FixedArray>&& new_physical_pages) +VMObject::VMObject(FixedArray>&& new_physical_pages) : m_physical_pages(move(new_physical_pages)) { all_instances().with([&](auto& list) { list.append(*this); }); diff --git a/Kernel/Memory/VMObject.h b/Kernel/Memory/VMObject.h index 186e2998f6..b5801cddb2 100644 --- a/Kernel/Memory/VMObject.h +++ b/Kernel/Memory/VMObject.h @@ -8,10 +8,10 @@ #include #include -#include -#include #include #include +#include +#include #include #include @@ -19,14 +19,14 @@ namespace Kernel::Memory { class VMObject : public ListedRefCounted - , public Weakable { + , public LockWeakable { friend class MemoryManager; friend class Region; public: virtual ~VMObject(); - virtual ErrorOr> try_clone() = 0; + virtual ErrorOr> try_clone() = 0; virtual bool is_anonymous() const { return false; } virtual bool is_inode() const { return false; } @@ -35,8 +35,8 @@ public: size_t page_count() const { return m_physical_pages.size(); } - virtual Span const> physical_pages() const { return m_physical_pages.span(); } - virtual Span> physical_pages() { return m_physical_pages.span(); } + virtual Span const> physical_pages() const { return m_physical_pages.span(); } + virtual Span> physical_pages() { return m_physical_pages.span(); } size_t size() const { return m_physical_pages.size() * PAGE_SIZE; } @@ -55,15 +55,15 @@ public: } protected: - static ErrorOr>> try_create_physical_pages(size_t); - ErrorOr>> try_clone_physical_pages() const; - explicit VMObject(FixedArray>&&); + static ErrorOr>> try_create_physical_pages(size_t); + ErrorOr>> try_clone_physical_pages() const; + explicit VMObject(FixedArray>&&); template void for_each_region(Callback); IntrusiveListNode m_list_node; - FixedArray> m_physical_pages; + FixedArray> m_physical_pages; mutable RecursiveSpinlock m_lock { LockRank::None }; diff --git a/Kernel/Net/IPv4Socket.cpp b/Kernel/Net/IPv4Socket.cpp index 2cbf7d523a..7f21ea5159 100644 --- a/Kernel/Net/IPv4Socket.cpp +++ b/Kernel/Net/IPv4Socket.cpp @@ -40,7 +40,7 @@ ErrorOr> IPv4Socket::try_create_receive_buffer() return DoubleBuffer::try_create("IPv4Socket: Receive buffer"sv, 256 * KiB); } -ErrorOr> IPv4Socket::create(int type, int protocol) +ErrorOr> IPv4Socket::create(int type, int protocol) { auto receive_buffer = TRY(IPv4Socket::try_create_receive_buffer()); @@ -49,7 +49,7 @@ ErrorOr> IPv4Socket::create(int type, int protocol) if (type == SOCK_DGRAM) return TRY(UDPSocket::try_create(protocol, move(receive_buffer))); if (type == SOCK_RAW) { - auto raw_socket = adopt_ref_if_nonnull(new (nothrow) IPv4Socket(type, protocol, move(receive_buffer), {})); + auto raw_socket = adopt_lock_ref_if_nonnull(new (nothrow) IPv4Socket(type, protocol, move(receive_buffer), {})); if (raw_socket) return raw_socket.release_nonnull(); return ENOMEM; diff --git a/Kernel/Net/IPv4Socket.h b/Kernel/Net/IPv4Socket.h index 1121df9a66..1eb3a9cca5 100644 --- a/Kernel/Net/IPv4Socket.h +++ b/Kernel/Net/IPv4Socket.h @@ -28,7 +28,7 @@ struct PortAllocationResult { class IPv4Socket : public Socket { public: - static ErrorOr> create(int type, int protocol); + static ErrorOr> create(int type, int protocol); virtual ~IPv4Socket() override; virtual ErrorOr close() override; diff --git a/Kernel/Net/Intel/E1000ENetworkAdapter.cpp b/Kernel/Net/Intel/E1000ENetworkAdapter.cpp index 7b9ee770be..75e7d03829 100644 --- a/Kernel/Net/Intel/E1000ENetworkAdapter.cpp +++ b/Kernel/Net/Intel/E1000ENetworkAdapter.cpp @@ -181,7 +181,7 @@ static bool is_valid_device_id(u16 device_id) } } -UNMAP_AFTER_INIT RefPtr E1000ENetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier) +UNMAP_AFTER_INIT LockRefPtr E1000ENetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier) { if (pci_device_identifier.hardware_id().vendor_id != PCI::VendorID::Intel) return {}; @@ -192,7 +192,7 @@ UNMAP_AFTER_INIT RefPtr E1000ENetworkAdapter::try_to_initi auto interface_name_or_error = NetworkingManagement::generate_interface_name_from_pci_address(pci_device_identifier); if (interface_name_or_error.is_error()) return {}; - auto adapter = adopt_ref_if_nonnull(new (nothrow) E1000ENetworkAdapter(pci_device_identifier.address(), irq, interface_name_or_error.release_value())); + auto adapter = adopt_lock_ref_if_nonnull(new (nothrow) E1000ENetworkAdapter(pci_device_identifier.address(), irq, interface_name_or_error.release_value())); if (!adapter) return {}; if (adapter->initialize()) diff --git a/Kernel/Net/Intel/E1000ENetworkAdapter.h b/Kernel/Net/Intel/E1000ENetworkAdapter.h index c5bf889b3b..ce679dfbba 100644 --- a/Kernel/Net/Intel/E1000ENetworkAdapter.h +++ b/Kernel/Net/Intel/E1000ENetworkAdapter.h @@ -21,7 +21,7 @@ namespace Kernel { class E1000ENetworkAdapter final : public E1000NetworkAdapter { public: - static RefPtr try_to_initialize(PCI::DeviceIdentifier const&); + static LockRefPtr try_to_initialize(PCI::DeviceIdentifier const&); virtual bool initialize() override; diff --git a/Kernel/Net/Intel/E1000NetworkAdapter.cpp b/Kernel/Net/Intel/E1000NetworkAdapter.cpp index 08bbbcf584..3868d14bae 100644 --- a/Kernel/Net/Intel/E1000NetworkAdapter.cpp +++ b/Kernel/Net/Intel/E1000NetworkAdapter.cpp @@ -159,7 +159,7 @@ UNMAP_AFTER_INIT static bool is_valid_device_id(u16 device_id) } } -UNMAP_AFTER_INIT RefPtr E1000NetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier) +UNMAP_AFTER_INIT LockRefPtr E1000NetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier) { if (pci_device_identifier.hardware_id().vendor_id != PCI::VendorID::Intel) return {}; @@ -170,7 +170,7 @@ UNMAP_AFTER_INIT RefPtr E1000NetworkAdapter::try_to_initial auto interface_name_or_error = NetworkingManagement::generate_interface_name_from_pci_address(pci_device_identifier); if (interface_name_or_error.is_error()) return {}; - auto adapter = adopt_ref_if_nonnull(new (nothrow) E1000NetworkAdapter(pci_device_identifier.address(), irq, interface_name_or_error.release_value())); + auto adapter = adopt_lock_ref_if_nonnull(new (nothrow) E1000NetworkAdapter(pci_device_identifier.address(), irq, interface_name_or_error.release_value())); if (!adapter) return {}; if (adapter->initialize()) diff --git a/Kernel/Net/Intel/E1000NetworkAdapter.h b/Kernel/Net/Intel/E1000NetworkAdapter.h index ba7afbf3f2..f4d5c775e5 100644 --- a/Kernel/Net/Intel/E1000NetworkAdapter.h +++ b/Kernel/Net/Intel/E1000NetworkAdapter.h @@ -20,7 +20,7 @@ class E1000NetworkAdapter : public NetworkAdapter , public PCI::Device , public IRQHandler { public: - static RefPtr try_to_initialize(PCI::DeviceIdentifier const&); + static LockRefPtr try_to_initialize(PCI::DeviceIdentifier const&); virtual bool initialize(); diff --git a/Kernel/Net/LocalSocket.cpp b/Kernel/Net/LocalSocket.cpp index bd98a77267..67df21c712 100644 --- a/Kernel/Net/LocalSocket.cpp +++ b/Kernel/Net/LocalSocket.cpp @@ -43,11 +43,11 @@ ErrorOr LocalSocket::try_for_each(Function(LocalSocket const }); } -ErrorOr> LocalSocket::try_create(int type) +ErrorOr> LocalSocket::try_create(int type) { auto client_buffer = TRY(DoubleBuffer::try_create("LocalSocket: Client buffer"sv)); auto server_buffer = TRY(DoubleBuffer::try_create("LocalSocket: Server buffer"sv)); - return adopt_nonnull_ref_or_enomem(new (nothrow) LocalSocket(type, move(client_buffer), move(server_buffer))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) LocalSocket(type, move(client_buffer), move(server_buffer))); } ErrorOr LocalSocket::try_create_connected_pair(int type) @@ -469,7 +469,7 @@ ErrorOr LocalSocket::chown(OpenFileDescription&, UserID uid, GroupID gid) return {}; } -NonnullRefPtrVector& LocalSocket::recvfd_queue_for(OpenFileDescription const& description) +NonnullLockRefPtrVector& LocalSocket::recvfd_queue_for(OpenFileDescription const& description) { auto role = this->role(description); if (role == Role::Connected) @@ -479,7 +479,7 @@ NonnullRefPtrVector& LocalSocket::recvfd_queue_for(OpenFile VERIFY_NOT_REACHED(); } -NonnullRefPtrVector& LocalSocket::sendfd_queue_for(OpenFileDescription const& description) +NonnullLockRefPtrVector& LocalSocket::sendfd_queue_for(OpenFileDescription const& description) { auto role = this->role(description); if (role == Role::Connected) @@ -489,7 +489,7 @@ NonnullRefPtrVector& LocalSocket::sendfd_queue_for(OpenFile VERIFY_NOT_REACHED(); } -ErrorOr LocalSocket::sendfd(OpenFileDescription const& socket_description, NonnullRefPtr passing_description) +ErrorOr LocalSocket::sendfd(OpenFileDescription const& socket_description, NonnullLockRefPtr passing_description) { MutexLocker locker(mutex()); auto role = this->role(socket_description); @@ -503,7 +503,7 @@ ErrorOr LocalSocket::sendfd(OpenFileDescription const& socket_description, return {}; } -ErrorOr> LocalSocket::recvfd(OpenFileDescription const& socket_description) +ErrorOr> LocalSocket::recvfd(OpenFileDescription const& socket_description) { MutexLocker locker(mutex()); auto role = this->role(socket_description); diff --git a/Kernel/Net/LocalSocket.h b/Kernel/Net/LocalSocket.h index ac94bfcd30..451c3b3fff 100644 --- a/Kernel/Net/LocalSocket.h +++ b/Kernel/Net/LocalSocket.h @@ -15,19 +15,19 @@ namespace Kernel { class OpenFileDescription; struct SocketPair { - NonnullRefPtr description0; - NonnullRefPtr description1; + NonnullLockRefPtr description0; + NonnullLockRefPtr description1; }; class LocalSocket final : public Socket { public: - static ErrorOr> try_create(int type); + static ErrorOr> try_create(int type); static ErrorOr try_create_connected_pair(int type); virtual ~LocalSocket() override; - ErrorOr sendfd(OpenFileDescription const& socket_description, NonnullRefPtr passing_description); - ErrorOr> recvfd(OpenFileDescription const& socket_description); + ErrorOr sendfd(OpenFileDescription const& socket_description, NonnullLockRefPtr passing_description); + ErrorOr> recvfd(OpenFileDescription const& socket_description); static void for_each(Function); static ErrorOr try_for_each(Function(LocalSocket const&)>); @@ -59,8 +59,8 @@ private: bool has_attached_peer(OpenFileDescription const&) const; DoubleBuffer* receive_buffer_for(OpenFileDescription&); DoubleBuffer* send_buffer_for(OpenFileDescription&); - NonnullRefPtrVector& sendfd_queue_for(OpenFileDescription const&); - NonnullRefPtrVector& recvfd_queue_for(OpenFileDescription const&); + NonnullLockRefPtrVector& sendfd_queue_for(OpenFileDescription const&); + NonnullLockRefPtrVector& recvfd_queue_for(OpenFileDescription const&); void set_connect_side_role(Role connect_side_role, bool force_evaluate_block_conditions = false) { @@ -73,7 +73,7 @@ private: ErrorOr try_set_path(StringView); // The inode this socket is bound to. - WeakPtr m_inode; + LockWeakPtr m_inode; UserID m_prebind_uid { 0 }; GroupID m_prebind_gid { 0 }; @@ -100,8 +100,8 @@ private: NonnullOwnPtr m_for_client; NonnullOwnPtr m_for_server; - NonnullRefPtrVector m_fds_for_client; - NonnullRefPtrVector m_fds_for_server; + NonnullLockRefPtrVector m_fds_for_client; + NonnullLockRefPtrVector m_fds_for_server; IntrusiveListNode m_list_node; diff --git a/Kernel/Net/LoopbackAdapter.cpp b/Kernel/Net/LoopbackAdapter.cpp index c3e517a297..783199eae9 100644 --- a/Kernel/Net/LoopbackAdapter.cpp +++ b/Kernel/Net/LoopbackAdapter.cpp @@ -11,12 +11,12 @@ namespace Kernel { static bool s_loopback_initialized = false; -RefPtr LoopbackAdapter::try_create() +LockRefPtr LoopbackAdapter::try_create() { auto interface_name = KString::try_create("loop"sv); if (interface_name.is_error()) return {}; - return adopt_ref_if_nonnull(new LoopbackAdapter(interface_name.release_value())); + return adopt_lock_ref_if_nonnull(new LoopbackAdapter(interface_name.release_value())); } LoopbackAdapter::LoopbackAdapter(NonnullOwnPtr interface_name) diff --git a/Kernel/Net/LoopbackAdapter.h b/Kernel/Net/LoopbackAdapter.h index 20b50cf5e4..15391b7ede 100644 --- a/Kernel/Net/LoopbackAdapter.h +++ b/Kernel/Net/LoopbackAdapter.h @@ -15,7 +15,7 @@ private: LoopbackAdapter(NonnullOwnPtr); public: - static RefPtr try_create(); + static LockRefPtr try_create(); virtual ~LoopbackAdapter() override; virtual void send_raw(ReadonlyBytes) override; diff --git a/Kernel/Net/NE2000/NetworkAdapter.cpp b/Kernel/Net/NE2000/NetworkAdapter.cpp index a3cf68d1be..14bbc9ca7c 100644 --- a/Kernel/Net/NE2000/NetworkAdapter.cpp +++ b/Kernel/Net/NE2000/NetworkAdapter.cpp @@ -138,7 +138,7 @@ struct [[gnu::packed]] received_packet_header { u16 length; }; -UNMAP_AFTER_INIT RefPtr NE2000NetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier) +UNMAP_AFTER_INIT LockRefPtr NE2000NetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier) { constexpr auto ne2k_ids = Array { PCI::HardwareID { 0x10EC, 0x8029 }, // RealTek RTL-8029(AS) @@ -162,7 +162,7 @@ UNMAP_AFTER_INIT RefPtr NE2000NetworkAdapter::try_to_initi auto interface_name_or_error = NetworkingManagement::generate_interface_name_from_pci_address(pci_device_identifier); if (interface_name_or_error.is_error()) return {}; - return adopt_ref_if_nonnull(new (nothrow) NE2000NetworkAdapter(pci_device_identifier.address(), irq, interface_name_or_error.release_value())); + return adopt_lock_ref_if_nonnull(new (nothrow) NE2000NetworkAdapter(pci_device_identifier.address(), irq, interface_name_or_error.release_value())); } UNMAP_AFTER_INIT NE2000NetworkAdapter::NE2000NetworkAdapter(PCI::Address address, u8 irq, NonnullOwnPtr interface_name) diff --git a/Kernel/Net/NE2000/NetworkAdapter.h b/Kernel/Net/NE2000/NetworkAdapter.h index b4900cb094..18f5f92b2d 100644 --- a/Kernel/Net/NE2000/NetworkAdapter.h +++ b/Kernel/Net/NE2000/NetworkAdapter.h @@ -20,7 +20,7 @@ class NE2000NetworkAdapter final : public NetworkAdapter , public PCI::Device , public IRQHandler { public: - static RefPtr try_to_initialize(PCI::DeviceIdentifier const&); + static LockRefPtr try_to_initialize(PCI::DeviceIdentifier const&); virtual ~NE2000NetworkAdapter() override; diff --git a/Kernel/Net/NetworkAdapter.cpp b/Kernel/Net/NetworkAdapter.cpp index 5e9036a4cc..a2df28ac88 100644 --- a/Kernel/Net/NetworkAdapter.cpp +++ b/Kernel/Net/NetworkAdapter.cpp @@ -111,9 +111,9 @@ size_t NetworkAdapter::dequeue_packet(u8* buffer, size_t buffer_size, Time& pack return packet_size; } -RefPtr NetworkAdapter::acquire_packet_buffer(size_t size) +LockRefPtr NetworkAdapter::acquire_packet_buffer(size_t size) { - auto packet = m_unused_packets.with([size](auto& unused_packets) -> RefPtr { + auto packet = m_unused_packets.with([size](auto& unused_packets) -> LockRefPtr { if (unused_packets.is_empty()) return nullptr; @@ -135,7 +135,7 @@ RefPtr NetworkAdapter::acquire_packet_buffer(size_t size) auto buffer_or_error = KBuffer::try_create_with_size("NetworkAdapter: Packet buffer"sv, size, Memory::Region::Access::ReadWrite, AllocationStrategy::AllocateNow); if (buffer_or_error.is_error()) return {}; - packet = adopt_ref_if_nonnull(new (nothrow) PacketWithTimestamp { buffer_or_error.release_value(), kgettimeofday() }); + packet = adopt_lock_ref_if_nonnull(new (nothrow) PacketWithTimestamp { buffer_or_error.release_value(), kgettimeofday() }); if (!packet) return {}; packet->buffer->set_size(size); diff --git a/Kernel/Net/NetworkAdapter.h b/Kernel/Net/NetworkAdapter.h index d465e378ec..0b0ac82a63 100644 --- a/Kernel/Net/NetworkAdapter.h +++ b/Kernel/Net/NetworkAdapter.h @@ -12,10 +12,10 @@ #include #include #include -#include -#include #include #include +#include +#include #include #include #include @@ -39,12 +39,12 @@ struct PacketWithTimestamp final : public AtomicRefCounted NonnullOwnPtr buffer; Time timestamp; - IntrusiveListNode> packet_node; + IntrusiveListNode> packet_node; }; class NetworkAdapter : public AtomicRefCounted - , public Weakable { + , public LockWeakable { public: static constexpr i32 LINKSPEED_INVALID = -1; @@ -83,7 +83,7 @@ public: u32 packets_out() const { return m_packets_out; } u32 bytes_out() const { return m_bytes_out; } - RefPtr acquire_packet_buffer(size_t); + LockRefPtr acquire_packet_buffer(size_t); void release_packet_buffer(PacketWithTimestamp&); constexpr size_t layer3_payload_offset() const { return sizeof(EthernetFrameHeader); } diff --git a/Kernel/Net/NetworkTask.cpp b/Kernel/Net/NetworkTask.cpp index 722241b9b3..2bb134e632 100644 --- a/Kernel/Net/NetworkTask.cpp +++ b/Kernel/Net/NetworkTask.cpp @@ -30,19 +30,19 @@ static void handle_ipv4(EthernetFrameHeader const&, size_t frame_size, Time cons static void handle_icmp(EthernetFrameHeader const&, IPv4Packet const&, Time const& packet_timestamp); static void handle_udp(IPv4Packet const&, Time const& packet_timestamp); static void handle_tcp(IPv4Packet const&, Time const& packet_timestamp); -static void send_delayed_tcp_ack(RefPtr socket); -static void send_tcp_rst(IPv4Packet const& ipv4_packet, TCPPacket const& tcp_packet, RefPtr adapter); +static void send_delayed_tcp_ack(LockRefPtr socket); +static void send_tcp_rst(IPv4Packet const& ipv4_packet, TCPPacket const& tcp_packet, LockRefPtr adapter); static void flush_delayed_tcp_acks(); static void retransmit_tcp_packets(); static Thread* network_task = nullptr; -static HashTable>* delayed_ack_sockets; +static HashTable>* delayed_ack_sockets; [[noreturn]] static void NetworkTask_main(void*); void NetworkTask::spawn() { - RefPtr thread; + LockRefPtr thread; auto name = KString::try_create("Network Task"sv); if (name.is_error()) TODO(); @@ -57,7 +57,7 @@ bool NetworkTask::is_current() void NetworkTask_main(void*) { - delayed_ack_sockets = new HashTable>; + delayed_ack_sockets = new HashTable>; WaitQueue packet_wait_queue; int pending_packets = 0; @@ -229,7 +229,7 @@ void handle_icmp(EthernetFrameHeader const& eth, IPv4Packet const& ipv4_packet, dbgln_if(ICMP_DEBUG, "handle_icmp: source={}, destination={}, type={:#02x}, code={:#02x}", ipv4_packet.source().to_string(), ipv4_packet.destination().to_string(), icmp_header.type(), icmp_header.code()); { - NonnullRefPtrVector icmp_sockets; + NonnullLockRefPtrVector icmp_sockets; IPv4Socket::all_sockets().with_exclusive([&](auto& sockets) { for (auto& socket : sockets) { if (socket.protocol() == (unsigned)IPv4Protocol::ICMP) @@ -302,7 +302,7 @@ void handle_udp(IPv4Packet const& ipv4_packet, Time const& packet_timestamp) socket->did_receive(ipv4_packet.source(), udp_packet.source_port(), { &ipv4_packet, sizeof(IPv4Packet) + ipv4_packet.payload_size() }, packet_timestamp); } -void send_delayed_tcp_ack(RefPtr socket) +void send_delayed_tcp_ack(LockRefPtr socket) { VERIFY(socket->mutex().is_locked()); if (!socket->should_delay_next_ack()) { @@ -315,7 +315,7 @@ void send_delayed_tcp_ack(RefPtr socket) void flush_delayed_tcp_acks() { - Vector, 32> remaining_sockets; + Vector, 32> remaining_sockets; for (auto& socket : *delayed_ack_sockets) { MutexLocker locker(socket->mutex()); if (socket->should_delay_next_ack()) { @@ -334,7 +334,7 @@ void flush_delayed_tcp_acks() } } -void send_tcp_rst(IPv4Packet const& ipv4_packet, TCPPacket const& tcp_packet, RefPtr adapter) +void send_tcp_rst(IPv4Packet const& ipv4_packet, TCPPacket const& tcp_packet, LockRefPtr adapter) { auto routing_decision = route_to(ipv4_packet.source(), ipv4_packet.destination(), adapter); if (routing_decision.is_zero()) @@ -657,7 +657,7 @@ void retransmit_tcp_packets() { // We must keep the sockets alive until after we've unlocked the hash table // in case retransmit_packets() realizes that it wants to close the socket. - NonnullRefPtrVector sockets; + NonnullLockRefPtrVector sockets; TCPSocket::sockets_for_retransmit().for_each_shared([&](auto const& socket) { // We ignore allocation failures above the first 16 guaranteed socket slots, as // we will just retransmit their packets the next time around diff --git a/Kernel/Net/NetworkingManagement.cpp b/Kernel/Net/NetworkingManagement.cpp index 510fa10492..ca3892e62d 100644 --- a/Kernel/Net/NetworkingManagement.cpp +++ b/Kernel/Net/NetworkingManagement.cpp @@ -38,7 +38,7 @@ UNMAP_AFTER_INIT NetworkingManagement::NetworkingManagement() { } -NonnullRefPtr NetworkingManagement::loopback_adapter() const +NonnullLockRefPtr NetworkingManagement::loopback_adapter() const { return *m_loopback_adapter; } @@ -59,13 +59,13 @@ ErrorOr NetworkingManagement::try_for_each(Function(NetworkA }); } -RefPtr NetworkingManagement::from_ipv4_address(IPv4Address const& address) const +LockRefPtr NetworkingManagement::from_ipv4_address(IPv4Address const& address) const { if (address[0] == 0 && address[1] == 0 && address[2] == 0 && address[3] == 0) return m_loopback_adapter; if (address[0] == 127) return m_loopback_adapter; - return m_adapters.with([&](auto& adapters) -> RefPtr { + return m_adapters.with([&](auto& adapters) -> LockRefPtr { for (auto& adapter : adapters) { if (adapter.ipv4_address() == address || adapter.ipv4_broadcast() == address) return adapter; @@ -74,9 +74,9 @@ RefPtr NetworkingManagement::from_ipv4_address(IPv4Address const }); } -RefPtr NetworkingManagement::lookup_by_name(StringView name) const +LockRefPtr NetworkingManagement::lookup_by_name(StringView name) const { - return m_adapters.with([&](auto& adapters) -> RefPtr { + return m_adapters.with([&](auto& adapters) -> LockRefPtr { for (auto& adapter : adapters) { if (adapter.name() == name) return adapter; @@ -94,7 +94,7 @@ ErrorOr> NetworkingManagement::generate_interface_name_fr return name; } -UNMAP_AFTER_INIT RefPtr NetworkingManagement::determine_network_device(PCI::DeviceIdentifier const& device_identifier) const +UNMAP_AFTER_INIT LockRefPtr NetworkingManagement::determine_network_device(PCI::DeviceIdentifier const& device_identifier) const { if (auto candidate = E1000NetworkAdapter::try_to_initialize(device_identifier); !candidate.is_null()) return candidate; diff --git a/Kernel/Net/NetworkingManagement.h b/Kernel/Net/NetworkingManagement.h index 1d145f8503..2876993dfd 100644 --- a/Kernel/Net/NetworkingManagement.h +++ b/Kernel/Net/NetworkingManagement.h @@ -8,10 +8,10 @@ #include #include -#include -#include #include #include +#include +#include #include #include #include @@ -34,16 +34,16 @@ public: void for_each(Function); ErrorOr try_for_each(Function(NetworkAdapter&)>); - RefPtr from_ipv4_address(IPv4Address const&) const; - RefPtr lookup_by_name(StringView) const; + LockRefPtr from_ipv4_address(IPv4Address const&) const; + LockRefPtr lookup_by_name(StringView) const; - NonnullRefPtr loopback_adapter() const; + NonnullLockRefPtr loopback_adapter() const; private: - RefPtr determine_network_device(PCI::DeviceIdentifier const&) const; + LockRefPtr determine_network_device(PCI::DeviceIdentifier const&) const; - SpinlockProtected> m_adapters { LockRank::None }; - RefPtr m_loopback_adapter; + SpinlockProtected> m_adapters { LockRank::None }; + LockRefPtr m_loopback_adapter; }; } diff --git a/Kernel/Net/Realtek/RTL8139NetworkAdapter.cpp b/Kernel/Net/Realtek/RTL8139NetworkAdapter.cpp index 038464fd83..b66496aca1 100644 --- a/Kernel/Net/Realtek/RTL8139NetworkAdapter.cpp +++ b/Kernel/Net/Realtek/RTL8139NetworkAdapter.cpp @@ -113,7 +113,7 @@ namespace Kernel { #define RX_BUFFER_SIZE 32768 #define TX_BUFFER_SIZE PACKET_SIZE_MAX -UNMAP_AFTER_INIT RefPtr RTL8139NetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier) +UNMAP_AFTER_INIT LockRefPtr RTL8139NetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier) { constexpr PCI::HardwareID rtl8139_id = { 0x10EC, 0x8139 }; if (pci_device_identifier.hardware_id() != rtl8139_id) @@ -123,7 +123,7 @@ UNMAP_AFTER_INIT RefPtr RTL8139NetworkAdapter::try_to_ini auto interface_name_or_error = NetworkingManagement::generate_interface_name_from_pci_address(pci_device_identifier); if (interface_name_or_error.is_error()) return {}; - return adopt_ref_if_nonnull(new (nothrow) RTL8139NetworkAdapter(pci_device_identifier.address(), irq, interface_name_or_error.release_value())); + return adopt_lock_ref_if_nonnull(new (nothrow) RTL8139NetworkAdapter(pci_device_identifier.address(), irq, interface_name_or_error.release_value())); } UNMAP_AFTER_INIT RTL8139NetworkAdapter::RTL8139NetworkAdapter(PCI::Address address, u8 irq, NonnullOwnPtr interface_name) diff --git a/Kernel/Net/Realtek/RTL8139NetworkAdapter.h b/Kernel/Net/Realtek/RTL8139NetworkAdapter.h index 8613d89cae..506590a962 100644 --- a/Kernel/Net/Realtek/RTL8139NetworkAdapter.h +++ b/Kernel/Net/Realtek/RTL8139NetworkAdapter.h @@ -22,7 +22,7 @@ class RTL8139NetworkAdapter final : public NetworkAdapter , public PCI::Device , public IRQHandler { public: - static RefPtr try_to_initialize(PCI::DeviceIdentifier const&); + static LockRefPtr try_to_initialize(PCI::DeviceIdentifier const&); virtual ~RTL8139NetworkAdapter() override; diff --git a/Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp b/Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp index 4d3f52511d..d8317a9be5 100644 --- a/Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp +++ b/Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp @@ -182,7 +182,7 @@ namespace Kernel { #define TX_BUFFER_SIZE 0x1FF8 #define RX_BUFFER_SIZE 0x1FF8 // FIXME: this should be increased (0x3FFF) -UNMAP_AFTER_INIT RefPtr RTL8168NetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier) +UNMAP_AFTER_INIT LockRefPtr RTL8168NetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier) { if (pci_device_identifier.hardware_id().vendor_id != PCI::VendorID::Realtek) return {}; @@ -193,7 +193,7 @@ UNMAP_AFTER_INIT RefPtr RTL8168NetworkAdapter::try_to_ini auto interface_name_or_error = NetworkingManagement::generate_interface_name_from_pci_address(pci_device_identifier); if (interface_name_or_error.is_error()) return {}; - return adopt_ref_if_nonnull(new (nothrow) RTL8168NetworkAdapter(pci_device_identifier.address(), irq, interface_name_or_error.release_value())); + return adopt_lock_ref_if_nonnull(new (nothrow) RTL8168NetworkAdapter(pci_device_identifier.address(), irq, interface_name_or_error.release_value())); } bool RTL8168NetworkAdapter::determine_supported_version() const diff --git a/Kernel/Net/Realtek/RTL8168NetworkAdapter.h b/Kernel/Net/Realtek/RTL8168NetworkAdapter.h index 01106f3640..9eb9ed6c19 100644 --- a/Kernel/Net/Realtek/RTL8168NetworkAdapter.h +++ b/Kernel/Net/Realtek/RTL8168NetworkAdapter.h @@ -22,7 +22,7 @@ class RTL8168NetworkAdapter final : public NetworkAdapter , public PCI::Device , public IRQHandler { public: - static RefPtr try_to_initialize(PCI::DeviceIdentifier const&); + static LockRefPtr try_to_initialize(PCI::DeviceIdentifier const&); virtual ~RTL8168NetworkAdapter() override; diff --git a/Kernel/Net/Routing.cpp b/Kernel/Net/Routing.cpp index 5924c5e599..5711cd1359 100644 --- a/Kernel/Net/Routing.cpp +++ b/Kernel/Net/Routing.cpp @@ -135,11 +135,11 @@ SpinlockProtected& routing_table() return *s_routing_table; } -ErrorOr update_routing_table(IPv4Address const& destination, IPv4Address const& gateway, IPv4Address const& netmask, u16 flags, RefPtr adapter, UpdateTable update) +ErrorOr update_routing_table(IPv4Address const& destination, IPv4Address const& gateway, IPv4Address const& netmask, u16 flags, LockRefPtr adapter, UpdateTable update) { dbgln_if(ROUTING_DEBUG, "update_routing_table {} {} {} {} {} {}", destination, gateway, netmask, flags, adapter, update == UpdateTable::Set ? "Set" : "Delete"); - auto route_entry = adopt_ref_if_nonnull(new (nothrow) Route { destination, gateway, netmask, flags, adapter.release_nonnull() }); + auto route_entry = adopt_lock_ref_if_nonnull(new (nothrow) Route { destination, gateway, netmask, flags, adapter.release_nonnull() }); if (!route_entry) return ENOMEM; @@ -178,7 +178,7 @@ static MACAddress multicast_ethernet_address(IPv4Address const& address) return MACAddress { 0x01, 0x00, 0x5e, (u8)(address[1] & 0x7f), address[2], address[3] }; } -RoutingDecision route_to(IPv4Address const& target, IPv4Address const& source, RefPtr const through, AllowUsingGateway allow_using_gateway) +RoutingDecision route_to(IPv4Address const& target, IPv4Address const& source, LockRefPtr const through, AllowUsingGateway allow_using_gateway) { auto matches = [&](auto& adapter) { if (!through) @@ -200,8 +200,8 @@ RoutingDecision route_to(IPv4Address const& target, IPv4Address const& source, R auto target_addr = target.to_u32(); auto source_addr = source.to_u32(); - RefPtr local_adapter = nullptr; - RefPtr chosen_route = nullptr; + LockRefPtr local_adapter = nullptr; + LockRefPtr chosen_route = nullptr; NetworkingManagement::the().for_each([source_addr, &target_addr, &local_adapter, &matches, &through](NetworkAdapter& adapter) { auto adapter_addr = adapter.ipv4_address().to_u32(); @@ -263,7 +263,7 @@ RoutingDecision route_to(IPv4Address const& target, IPv4Address const& source, R return { nullptr, {} }; } - RefPtr adapter = nullptr; + LockRefPtr adapter = nullptr; IPv4Address next_hop_ip; if (local_adapter) { diff --git a/Kernel/Net/Routing.h b/Kernel/Net/Routing.h index fc3d4402cf..b1cd26b4d6 100644 --- a/Kernel/Net/Routing.h +++ b/Kernel/Net/Routing.h @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include #include #include @@ -15,7 +15,7 @@ namespace Kernel { struct Route final : public AtomicRefCounted { - Route(IPv4Address const& destination, IPv4Address const& gateway, IPv4Address const& netmask, u16 flags, NonnullRefPtr adapter) + Route(IPv4Address const& destination, IPv4Address const& gateway, IPv4Address const& netmask, u16 flags, NonnullLockRefPtr adapter) : destination(destination) , gateway(gateway) , netmask(netmask) @@ -38,14 +38,14 @@ struct Route final : public AtomicRefCounted { const IPv4Address gateway; const IPv4Address netmask; const u16 flags; - NonnullRefPtr adapter; + NonnullLockRefPtr adapter; - IntrusiveListNode> route_list_node {}; + IntrusiveListNode> route_list_node {}; using RouteList = IntrusiveList<&Route::route_list_node>; }; struct RoutingDecision { - RefPtr adapter; + LockRefPtr adapter; MACAddress next_hop; bool is_zero() const; @@ -57,14 +57,14 @@ enum class UpdateTable { }; void update_arp_table(IPv4Address const&, MACAddress const&, UpdateTable update); -ErrorOr update_routing_table(IPv4Address const& destination, IPv4Address const& gateway, IPv4Address const& netmask, u16 flags, RefPtr const adapter, UpdateTable update); +ErrorOr update_routing_table(IPv4Address const& destination, IPv4Address const& gateway, IPv4Address const& netmask, u16 flags, LockRefPtr const adapter, UpdateTable update); enum class AllowUsingGateway { Yes, No, }; -RoutingDecision route_to(IPv4Address const& target, IPv4Address const& source, RefPtr const through = nullptr, AllowUsingGateway = AllowUsingGateway::Yes); +RoutingDecision route_to(IPv4Address const& target, IPv4Address const& source, LockRefPtr const through = nullptr, AllowUsingGateway = AllowUsingGateway::Yes); SpinlockProtected>& arp_table(); SpinlockProtected& routing_table(); diff --git a/Kernel/Net/Socket.cpp b/Kernel/Net/Socket.cpp index 1b8e75c13a..614eee1cda 100644 --- a/Kernel/Net/Socket.cpp +++ b/Kernel/Net/Socket.cpp @@ -17,7 +17,7 @@ namespace Kernel { -ErrorOr> Socket::create(int domain, int type, int protocol) +ErrorOr> Socket::create(int domain, int type, int protocol) { switch (domain) { case AF_LOCAL: @@ -46,7 +46,7 @@ void Socket::set_setup_state(SetupState new_setup_state) evaluate_block_conditions(); } -RefPtr Socket::accept() +LockRefPtr Socket::accept() { MutexLocker locker(mutex()); if (m_pending.is_empty()) @@ -63,7 +63,7 @@ RefPtr Socket::accept() return client; } -ErrorOr Socket::queue_connection_from(NonnullRefPtr peer) +ErrorOr Socket::queue_connection_from(NonnullLockRefPtr peer) { dbgln_if(SOCKET_DEBUG, "Socket({}) queueing connection", this); MutexLocker locker(mutex()); diff --git a/Kernel/Net/Socket.h b/Kernel/Net/Socket.h index 8622d52af4..df17360dee 100644 --- a/Kernel/Net/Socket.h +++ b/Kernel/Net/Socket.h @@ -7,10 +7,10 @@ #pragma once #include -#include -#include #include #include +#include +#include #include #include #include @@ -21,7 +21,7 @@ class OpenFileDescription; class Socket : public File { public: - static ErrorOr> create(int domain, int type, int protocol); + static ErrorOr> create(int domain, int type, int protocol); virtual ~Socket() override; int domain() const { return m_domain; } @@ -68,7 +68,7 @@ public: void set_connected(bool); bool can_accept() const { return !m_pending.is_empty(); } - RefPtr accept(); + LockRefPtr accept(); ErrorOr shutdown(int how); @@ -91,7 +91,7 @@ public: ProcessID acceptor_pid() const { return m_acceptor.pid; } UserID acceptor_uid() const { return m_acceptor.uid; } GroupID acceptor_gid() const { return m_acceptor.gid; } - RefPtr const bound_interface() const { return m_bound_interface; } + LockRefPtr const bound_interface() const { return m_bound_interface; } Mutex& mutex() { return m_mutex; } @@ -112,7 +112,7 @@ public: protected: Socket(int domain, int type, int protocol); - ErrorOr queue_connection_from(NonnullRefPtr); + ErrorOr queue_connection_from(NonnullLockRefPtr); size_t backlog() const { return m_backlog; } void set_backlog(size_t backlog) { m_backlog = backlog; } @@ -172,7 +172,7 @@ private: bool m_shut_down_for_reading { false }; bool m_shut_down_for_writing { false }; - RefPtr m_bound_interface { nullptr }; + LockRefPtr m_bound_interface { nullptr }; Time m_receive_timeout {}; Time m_send_timeout {}; @@ -180,7 +180,7 @@ private: ErrorOr m_so_error; - NonnullRefPtrVector m_pending; + NonnullLockRefPtrVector m_pending; }; // This is a special variant of TRY() that also updates the socket's SO_ERROR field on error. diff --git a/Kernel/Net/TCPSocket.cpp b/Kernel/Net/TCPSocket.cpp index 8ecbf3c111..b19e450f49 100644 --- a/Kernel/Net/TCPSocket.cpp +++ b/Kernel/Net/TCPSocket.cpp @@ -88,9 +88,9 @@ void TCPSocket::set_state(State new_state) evaluate_block_conditions(); } -static Singleton>>> s_socket_closing; +static Singleton>>> s_socket_closing; -MutexProtected>>& TCPSocket::closing_sockets() +MutexProtected>>& TCPSocket::closing_sockets() { return *s_socket_closing; } @@ -102,9 +102,9 @@ MutexProtected>& TCPSocket::sockets_by_tupl return *s_socket_tuples; } -RefPtr TCPSocket::from_tuple(IPv4SocketTuple const& tuple) +LockRefPtr TCPSocket::from_tuple(IPv4SocketTuple const& tuple) { - return sockets_by_tuple().with_shared([&](auto const& table) -> RefPtr { + return sockets_by_tuple().with_shared([&](auto const& table) -> LockRefPtr { auto exact_match = table.get(tuple); if (exact_match.has_value()) return { *exact_match.value() }; @@ -122,10 +122,10 @@ RefPtr TCPSocket::from_tuple(IPv4SocketTuple const& tuple) return {}; }); } -ErrorOr> TCPSocket::try_create_client(IPv4Address const& new_local_address, u16 new_local_port, IPv4Address const& new_peer_address, u16 new_peer_port) +ErrorOr> TCPSocket::try_create_client(IPv4Address const& new_local_address, u16 new_local_port, IPv4Address const& new_peer_address, u16 new_peer_port) { auto tuple = IPv4SocketTuple(new_local_address, new_local_port, new_peer_address, new_peer_port); - return sockets_by_tuple().with_exclusive([&](auto& table) -> ErrorOr> { + return sockets_by_tuple().with_exclusive([&](auto& table) -> ErrorOr> { if (table.contains(tuple)) return EEXIST; @@ -154,7 +154,7 @@ void TCPSocket::release_to_originator() m_originator.clear(); } -void TCPSocket::release_for_accept(NonnullRefPtr socket) +void TCPSocket::release_for_accept(NonnullLockRefPtr socket) { VERIFY(m_pending_release_for_accept.contains(socket->tuple())); m_pending_release_for_accept.remove(socket->tuple()); @@ -175,11 +175,11 @@ TCPSocket::~TCPSocket() dbgln_if(TCP_SOCKET_DEBUG, "~TCPSocket in state {}", to_string(state())); } -ErrorOr> TCPSocket::try_create(int protocol, NonnullOwnPtr receive_buffer) +ErrorOr> TCPSocket::try_create(int protocol, NonnullOwnPtr receive_buffer) { // Note: Scratch buffer is only used for SOCK_STREAM sockets. auto scratch_buffer = TRY(KBuffer::try_create_with_size("TCPSocket: Scratch buffer"sv, 65536)); - return adopt_nonnull_ref_or_enomem(new (nothrow) TCPSocket(protocol, move(receive_buffer), move(scratch_buffer))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) TCPSocket(protocol, move(receive_buffer), move(scratch_buffer))); } ErrorOr TCPSocket::protocol_size(ReadonlyBytes raw_ipv4_packet) diff --git a/Kernel/Net/TCPSocket.h b/Kernel/Net/TCPSocket.h index c2bfbdfb02..b27e09cb2b 100644 --- a/Kernel/Net/TCPSocket.h +++ b/Kernel/Net/TCPSocket.h @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include @@ -20,7 +20,7 @@ class TCPSocket final : public IPv4Socket { public: static void for_each(Function); static ErrorOr try_for_each(Function(TCPSocket const&)>); - static ErrorOr> try_create(int protocol, NonnullOwnPtr receive_buffer); + static ErrorOr> try_create(int protocol, NonnullOwnPtr receive_buffer); virtual ~TCPSocket() override; virtual bool unref() const override; @@ -146,15 +146,15 @@ public: bool should_delay_next_ack() const; static MutexProtected>& sockets_by_tuple(); - static RefPtr from_tuple(IPv4SocketTuple const& tuple); + static LockRefPtr from_tuple(IPv4SocketTuple const& tuple); - static MutexProtected>>& closing_sockets(); + static MutexProtected>>& closing_sockets(); - ErrorOr> try_create_client(IPv4Address const& local_address, u16 local_port, IPv4Address const& peer_address, u16 peer_port); + ErrorOr> try_create_client(IPv4Address const& local_address, u16 local_port, IPv4Address const& peer_address, u16 peer_port); void set_originator(TCPSocket& originator) { m_originator = originator; } bool has_originator() { return !!m_originator; } void release_to_originator(); - void release_for_accept(NonnullRefPtr); + void release_for_accept(NonnullLockRefPtr); void retransmit_packets(); @@ -185,11 +185,11 @@ private: void enqueue_for_retransmit(); void dequeue_for_retransmit(); - WeakPtr m_originator; - HashMap> m_pending_release_for_accept; + LockWeakPtr m_originator; + HashMap> m_pending_release_for_accept; Direction m_direction { Direction::Unspecified }; Error m_error { Error::None }; - RefPtr m_adapter; + LockRefPtr m_adapter; u32 m_sequence_number { 0 }; u32 m_ack_number { 0 }; State m_state { State::Closed }; @@ -200,9 +200,9 @@ private: struct OutgoingPacket { u32 ack_number { 0 }; - RefPtr buffer; + LockRefPtr buffer; size_t ipv4_payload_offset; - WeakPtr adapter; + LockWeakPtr adapter; int tx_counter { 0 }; }; diff --git a/Kernel/Net/UDPSocket.cpp b/Kernel/Net/UDPSocket.cpp index 88fc3388e2..a109414568 100644 --- a/Kernel/Net/UDPSocket.cpp +++ b/Kernel/Net/UDPSocket.cpp @@ -38,9 +38,9 @@ MutexProtected>& UDPSocket::sockets_by_port() return *s_map; } -RefPtr UDPSocket::from_port(u16 port) +LockRefPtr UDPSocket::from_port(u16 port) { - return sockets_by_port().with_shared([&](auto const& table) -> RefPtr { + return sockets_by_port().with_shared([&](auto const& table) -> LockRefPtr { auto it = table.find(port); if (it == table.end()) return {}; @@ -60,9 +60,9 @@ UDPSocket::~UDPSocket() }); } -ErrorOr> UDPSocket::try_create(int protocol, NonnullOwnPtr receive_buffer) +ErrorOr> UDPSocket::try_create(int protocol, NonnullOwnPtr receive_buffer) { - return adopt_nonnull_ref_or_enomem(new (nothrow) UDPSocket(protocol, move(receive_buffer))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) UDPSocket(protocol, move(receive_buffer))); } ErrorOr UDPSocket::protocol_size(ReadonlyBytes raw_ipv4_packet) diff --git a/Kernel/Net/UDPSocket.h b/Kernel/Net/UDPSocket.h index d904f97e24..3cdb9f60ea 100644 --- a/Kernel/Net/UDPSocket.h +++ b/Kernel/Net/UDPSocket.h @@ -14,10 +14,10 @@ namespace Kernel { class UDPSocket final : public IPv4Socket { public: - static ErrorOr> try_create(int protocol, NonnullOwnPtr receive_buffer); + static ErrorOr> try_create(int protocol, NonnullOwnPtr receive_buffer); virtual ~UDPSocket() override; - static RefPtr from_port(u16); + static LockRefPtr from_port(u16); static void for_each(Function); static ErrorOr try_for_each(Function(UDPSocket const&)>); diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 99fddecda9..71dac127ad 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -126,13 +126,13 @@ void Process::kill_all_threads() void Process::register_new(Process& process) { // Note: this is essentially the same like process->ref() - RefPtr new_process = process; + LockRefPtr new_process = process; all_instances().with([&](auto& list) { list.prepend(process); }); } -ErrorOr> Process::try_create_user_process(RefPtr& first_thread, StringView path, UserID uid, GroupID gid, NonnullOwnPtrVector arguments, NonnullOwnPtrVector environment, TTY* tty) +ErrorOr> Process::try_create_user_process(LockRefPtr& first_thread, StringView path, UserID uid, GroupID gid, NonnullOwnPtrVector arguments, NonnullOwnPtrVector environment, TTY* tty) { auto parts = path.split_view('/'); if (arguments.is_empty()) { @@ -181,7 +181,7 @@ ErrorOr> Process::try_create_user_process(RefPtr& return process; } -RefPtr Process::create_kernel_process(RefPtr& first_thread, NonnullOwnPtr name, void (*entry)(void*), void* entry_data, u32 affinity, RegisterProcess do_register) +LockRefPtr Process::create_kernel_process(LockRefPtr& first_thread, NonnullOwnPtr name, void (*entry)(void*), void* entry_data, u32 affinity, RegisterProcess do_register) { auto process_or_error = Process::try_create(first_thread, move(name), UserID(0), GroupID(0), ProcessID(0), true); if (process_or_error.is_error()) @@ -220,16 +220,16 @@ void Process::unprotect_data() }); } -ErrorOr> Process::try_create(RefPtr& first_thread, NonnullOwnPtr name, UserID uid, GroupID gid, ProcessID ppid, bool is_kernel_process, RefPtr current_directory, RefPtr executable, TTY* tty, Process* fork_parent) +ErrorOr> Process::try_create(LockRefPtr& first_thread, NonnullOwnPtr name, UserID uid, GroupID gid, ProcessID ppid, bool is_kernel_process, LockRefPtr current_directory, LockRefPtr executable, TTY* tty, Process* fork_parent) { auto space = TRY(Memory::AddressSpace::try_create(fork_parent ? &fork_parent->address_space() : nullptr)); auto unveil_tree = UnveilNode { TRY(KString::try_create("/"sv)), UnveilMetadata(TRY(KString::try_create("/"sv))) }; - auto process = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) Process(move(name), uid, gid, ppid, is_kernel_process, move(current_directory), move(executable), tty, move(unveil_tree)))); + auto process = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) Process(move(name), uid, gid, ppid, is_kernel_process, move(current_directory), move(executable), tty, move(unveil_tree)))); TRY(process->attach_resources(move(space), first_thread, fork_parent)); return process; } -Process::Process(NonnullOwnPtr name, UserID uid, GroupID gid, ProcessID ppid, bool is_kernel_process, RefPtr current_directory, RefPtr executable, TTY* tty, UnveilNode unveil_tree) +Process::Process(NonnullOwnPtr name, UserID uid, GroupID gid, ProcessID ppid, bool is_kernel_process, LockRefPtr current_directory, LockRefPtr executable, TTY* tty, UnveilNode unveil_tree) : m_name(move(name)) , m_is_kernel_process(is_kernel_process) , m_executable(move(executable)) @@ -253,7 +253,7 @@ Process::Process(NonnullOwnPtr name, UserID uid, GroupID gid, ProcessID dbgln_if(PROCESS_DEBUG, "Created new process {}({})", m_name, this->pid().value()); } -ErrorOr Process::attach_resources(NonnullOwnPtr&& preallocated_space, RefPtr& first_thread, Process* fork_parent) +ErrorOr Process::attach_resources(NonnullOwnPtr&& preallocated_space, LockRefPtr& first_thread, Process* fork_parent) { m_space = move(preallocated_space); @@ -418,9 +418,9 @@ void Process::crash(int signal, FlatPtr ip, bool out_of_memory) VERIFY_NOT_REACHED(); } -RefPtr Process::from_pid(ProcessID pid) +LockRefPtr Process::from_pid(ProcessID pid) { - return all_instances().with([&](auto const& list) -> RefPtr { + return all_instances().with([&](auto const& list) -> LockRefPtr { for (auto const& process : list) { if (process.pid() == pid) return &process; @@ -462,13 +462,13 @@ Process::OpenFileDescriptionAndFlags& Process::OpenFileDescriptions::at(size_t i return m_fds_metadatas[i]; } -ErrorOr> Process::OpenFileDescriptions::open_file_description(int fd) const +ErrorOr> Process::OpenFileDescriptions::open_file_description(int fd) const { if (fd < 0) return EBADF; if (static_cast(fd) >= m_fds_metadatas.size()) return EBADF; - RefPtr description = m_fds_metadatas[fd].description(); + LockRefPtr description = m_fds_metadatas[fd].description(); if (!description) return EBADF; return description.release_nonnull(); @@ -539,9 +539,9 @@ siginfo_t Process::wait_info() const return siginfo; } -NonnullRefPtr Process::current_directory() +NonnullLockRefPtr Process::current_directory() { - return m_current_directory.with([&](auto& current_directory) -> NonnullRefPtr { + return m_current_directory.with([&](auto& current_directory) -> NonnullLockRefPtr { if (!current_directory) current_directory = VirtualFileSystem::the().root_custody(); return *current_directory; @@ -582,7 +582,7 @@ ErrorOr Process::dump_perfcore() // Try to generate a filename which isn't already used. auto base_filename = TRY(KString::formatted("{}_{}", name(), pid().value())); auto perfcore_filename = TRY(KString::formatted("{}.profile", base_filename)); - RefPtr description; + LockRefPtr description; for (size_t attempt = 1; attempt <= 10; ++attempt) { auto description_or_error = VirtualFileSystem::the().open(perfcore_filename->view(), O_CREAT | O_EXCL, 0400, current_directory(), UidAndGid { 0, 0 }); if (!description_or_error.is_error()) { @@ -683,7 +683,7 @@ void Process::disowned_by_waiter(Process& process) void Process::unblock_waiters(Thread::WaitBlocker::UnblockFlags flags, u8 signal) { - RefPtr waiter_process; + LockRefPtr waiter_process; if (auto* my_tracer = tracer()) waiter_process = Process::from_pid(my_tracer->tracer_pid()); else @@ -772,7 +772,7 @@ ErrorOr Process::send_signal(u8 signal, Process* sender) return ESRCH; } -RefPtr Process::create_kernel_thread(void (*entry)(void*), void* entry_data, u32 priority, NonnullOwnPtr name, u32 affinity, bool joinable) +LockRefPtr Process::create_kernel_thread(void (*entry)(void*), void* entry_data, u32 priority, NonnullOwnPtr name, u32 affinity, bool joinable) { VERIFY((priority >= THREAD_PRIORITY_MIN) && (priority <= THREAD_PRIORITY_MAX)); @@ -805,7 +805,7 @@ void Process::OpenFileDescriptionAndFlags::clear() m_flags = 0; } -void Process::OpenFileDescriptionAndFlags::set(NonnullRefPtr&& description, u32 flags) +void Process::OpenFileDescriptionAndFlags::set(NonnullLockRefPtr&& description, u32 flags) { // FIXME: Verify Process::m_fds_lock is locked! m_description = move(description); diff --git a/Kernel/Process.h b/Kernel/Process.h index 940fe4ffa9..7c821cd155 100644 --- a/Kernel/Process.h +++ b/Kernel/Process.h @@ -10,12 +10,9 @@ #include #include #include -#include #include #include #include -#include -#include #include #include #include @@ -25,6 +22,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -103,7 +103,7 @@ struct LoadResult; class Process final : public ListedRefCounted - , public Weakable { + , public LockWeakable { class ProtectedValues { public: @@ -188,19 +188,19 @@ public: }; template - static RefPtr create_kernel_process(RefPtr& first_thread, NonnullOwnPtr name, EntryFunction entry, u32 affinity = THREAD_AFFINITY_DEFAULT, RegisterProcess do_register = RegisterProcess::Yes) + static LockRefPtr create_kernel_process(LockRefPtr& first_thread, NonnullOwnPtr name, EntryFunction entry, u32 affinity = THREAD_AFFINITY_DEFAULT, RegisterProcess do_register = RegisterProcess::Yes) { auto* entry_func = new EntryFunction(move(entry)); return create_kernel_process(first_thread, move(name), &Process::kernel_process_trampoline, entry_func, affinity, do_register); } - static RefPtr create_kernel_process(RefPtr& first_thread, NonnullOwnPtr name, void (*entry)(void*), void* entry_data = nullptr, u32 affinity = THREAD_AFFINITY_DEFAULT, RegisterProcess do_register = RegisterProcess::Yes); - static ErrorOr> try_create_user_process(RefPtr& first_thread, StringView path, UserID, GroupID, NonnullOwnPtrVector arguments, NonnullOwnPtrVector environment, TTY*); + static LockRefPtr create_kernel_process(LockRefPtr& first_thread, NonnullOwnPtr name, void (*entry)(void*), void* entry_data = nullptr, u32 affinity = THREAD_AFFINITY_DEFAULT, RegisterProcess do_register = RegisterProcess::Yes); + static ErrorOr> try_create_user_process(LockRefPtr& first_thread, StringView path, UserID, GroupID, NonnullOwnPtrVector arguments, NonnullOwnPtrVector environment, TTY*); static void register_new(Process&); ~Process(); - RefPtr create_kernel_thread(void (*entry)(void*), void* entry_data, u32 priority, NonnullOwnPtr name, u32 affinity = THREAD_AFFINITY_DEFAULT, bool joinable = true); + LockRefPtr create_kernel_thread(void (*entry)(void*), void* entry_data, u32 priority, NonnullOwnPtr name, u32 affinity = THREAD_AFFINITY_DEFAULT, bool joinable = true); bool is_profiling() const { return m_profiling; } void set_profiling(bool profiling) { m_profiling = profiling; } @@ -217,7 +217,7 @@ public: bool is_kernel_process() const { return m_is_kernel_process; } bool is_user_process() const { return !m_is_kernel_process; } - static RefPtr from_pid(ProcessID); + static LockRefPtr from_pid(ProcessID); static SessionID get_sid_from_pgid(ProcessGroupID pgid); StringView name() const { return m_name->view(); } @@ -450,7 +450,7 @@ public: u32 m_ticks_in_user_for_dead_children { 0 }; u32 m_ticks_in_kernel_for_dead_children { 0 }; - NonnullRefPtr current_directory(); + NonnullLockRefPtr current_directory(); Custody* executable() { return m_executable.ptr(); } Custody const* executable() const { return m_executable.ptr(); } @@ -461,7 +461,7 @@ public: ErrorOr exec(NonnullOwnPtr path, NonnullOwnPtrVector arguments, NonnullOwnPtrVector environment, Thread*& new_main_thread, u32& prev_flags, int recursion_depth = 0); - ErrorOr load(NonnullRefPtr main_program_description, RefPtr interpreter_description, const ElfW(Ehdr) & main_program_header); + ErrorOr load(NonnullLockRefPtr main_program_description, LockRefPtr interpreter_description, const ElfW(Ehdr) & main_program_header); bool is_superuser() const { return euid() == 0; } @@ -532,7 +532,7 @@ public: ErrorOr set_coredump_property(NonnullOwnPtr key, NonnullOwnPtr value); ErrorOr try_set_coredump_property(StringView key, StringView value); - NonnullRefPtrVector const& threads_for_coredump(Badge) const { return m_threads_for_coredump; } + NonnullLockRefPtrVector const& threads_for_coredump(Badge) const { return m_threads_for_coredump; } PerformanceEventBuffer* perf_events() { return m_perf_event_buffer; } PerformanceEventBuffer const* perf_events() const { return m_perf_event_buffer; } @@ -557,9 +557,9 @@ private: bool add_thread(Thread&); bool remove_thread(Thread&); - Process(NonnullOwnPtr name, UserID, GroupID, ProcessID ppid, bool is_kernel_process, RefPtr current_directory, RefPtr executable, TTY* tty, UnveilNode unveil_tree); - static ErrorOr> try_create(RefPtr& first_thread, NonnullOwnPtr name, UserID, GroupID, ProcessID ppid, bool is_kernel_process, RefPtr current_directory = nullptr, RefPtr executable = nullptr, TTY* = nullptr, Process* fork_parent = nullptr); - ErrorOr attach_resources(NonnullOwnPtr&&, RefPtr& first_thread, Process* fork_parent); + Process(NonnullOwnPtr name, UserID, GroupID, ProcessID ppid, bool is_kernel_process, LockRefPtr current_directory, LockRefPtr executable, TTY* tty, UnveilNode unveil_tree); + static ErrorOr> try_create(LockRefPtr& first_thread, NonnullOwnPtr name, UserID, GroupID, ProcessID ppid, bool is_kernel_process, LockRefPtr current_directory = nullptr, LockRefPtr executable = nullptr, TTY* = nullptr, Process* fork_parent = nullptr); + ErrorOr attach_resources(NonnullOwnPtr&&, LockRefPtr& first_thread, Process* fork_parent); static ProcessID allocate_pid(); void kill_threads_except_self(); @@ -569,19 +569,19 @@ private: bool create_perf_events_buffer_if_needed(); void delete_perf_events_buffer(); - ErrorOr do_exec(NonnullRefPtr main_program_description, NonnullOwnPtrVector arguments, NonnullOwnPtrVector environment, RefPtr interpreter_description, Thread*& new_main_thread, u32& prev_flags, const ElfW(Ehdr) & main_program_header); + ErrorOr do_exec(NonnullLockRefPtr main_program_description, NonnullOwnPtrVector arguments, NonnullOwnPtrVector environment, LockRefPtr interpreter_description, Thread*& new_main_thread, u32& prev_flags, const ElfW(Ehdr) & main_program_header); ErrorOr do_write(OpenFileDescription&, UserOrKernelBuffer const&, size_t); ErrorOr do_statvfs(FileSystem const& path, Custody const*, statvfs* buf); - ErrorOr> find_elf_interpreter_for_executable(StringView path, ElfW(Ehdr) const& main_executable_header, size_t main_executable_header_size, size_t file_size); + ErrorOr> find_elf_interpreter_for_executable(StringView path, ElfW(Ehdr) const& main_executable_header, size_t main_executable_header_size, size_t file_size); ErrorOr do_kill(Process&, int signal); ErrorOr do_killpg(ProcessGroupID pgrp, int signal); ErrorOr do_killall(int signal); ErrorOr do_killself(int signal); - ErrorOr do_waitid(Variant, NonnullRefPtr> waitee, int options); + ErrorOr do_waitid(Variant, NonnullLockRefPtr> waitee, int options); static ErrorOr> get_syscall_path_argument(Userspace user_path, size_t path_length); static ErrorOr> get_syscall_path_argument(Syscall::StringArgument const&); @@ -598,7 +598,7 @@ private: ErrorOr read_impl(int fd, Userspace buffer, size_t size); public: - NonnullRefPtr procfs_traits() const { return *m_procfs_traits; } + NonnullLockRefPtr procfs_traits() const { return *m_procfs_traits; } ErrorOr procfs_get_fds_stats(KBufferBuilder& builder) const; ErrorOr procfs_get_perf_events(KBufferBuilder& builder) const; ErrorOr procfs_get_unveil_stats(KBufferBuilder& builder) const; @@ -610,11 +610,11 @@ public: mode_t binary_link_required_mode() const; ErrorOr procfs_get_thread_stack(ThreadID thread_id, KBufferBuilder& builder) const; ErrorOr traverse_stacks_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)> callback) const; - ErrorOr> lookup_stacks_directory(ProcFS const&, StringView name) const; + ErrorOr> lookup_stacks_directory(ProcFS const&, StringView name) const; ErrorOr procfs_get_file_description_link(unsigned fd, KBufferBuilder& builder) const; ErrorOr traverse_file_descriptions_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)> callback) const; - ErrorOr> lookup_file_descriptions_directory(ProcFS const&, StringView name) const; - ErrorOr> lookup_children_directory(ProcFS const&, StringView name) const; + ErrorOr> lookup_file_descriptions_directory(ProcFS const&, StringView name) const; + ErrorOr> lookup_children_directory(ProcFS const&, StringView name) const; ErrorOr traverse_children_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)> callback) const; ErrorOr procfs_get_child_proccess_link(ProcessID child_pid, KBufferBuilder& builder) const; @@ -634,7 +634,7 @@ private: OwnPtr m_space; - RefPtr m_pg; + LockRefPtr m_pg; AtomicEdgeAction m_protected_data_refs; void protect_data(); @@ -666,10 +666,10 @@ public: void set_flags(u32 flags) { m_flags = flags; } void clear(); - void set(NonnullRefPtr&&, u32 flags = 0); + void set(NonnullLockRefPtr&&, u32 flags = 0); private: - RefPtr m_description; + LockRefPtr m_description; bool m_is_allocated { false }; u32 m_flags { 0 }; }; @@ -720,7 +720,7 @@ public: m_fds_metadatas.clear(); } - ErrorOr> open_file_description(int fd) const; + ErrorOr> open_file_description(int fd) const; private: static constexpr size_t s_max_open_file_descriptors { FD_SETSIZE }; @@ -769,13 +769,13 @@ public: class ProcessProcFSTraits : public ProcFSExposedComponent { public: - static ErrorOr> try_create(Badge, WeakPtr process) + static ErrorOr> try_create(Badge, LockWeakPtr process) { - return adopt_nonnull_ref_or_enomem(new (nothrow) ProcessProcFSTraits(move(process))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcessProcFSTraits(move(process))); } virtual InodeIndex component_index() const override; - virtual ErrorOr> to_inode(ProcFS const& procfs_instance) const override; + virtual ErrorOr> to_inode(ProcFS const& procfs_instance) const override; virtual ErrorOr traverse_as_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)>) const override; virtual mode_t required_mode() const override { return 0555; } @@ -783,25 +783,25 @@ public: virtual GroupID owner_group() const override; private: - explicit ProcessProcFSTraits(WeakPtr process) + explicit ProcessProcFSTraits(LockWeakPtr process) : m_process(move(process)) { } // NOTE: We need to weakly hold on to the process, because otherwise // we would be creating a reference cycle. - WeakPtr m_process; + LockWeakPtr m_process; }; MutexProtected& fds() { return m_fds; } MutexProtected const& fds() const { return m_fds; } - ErrorOr> open_file_description(int fd) + ErrorOr> open_file_description(int fd) { return m_fds.with_shared([fd](auto& fds) { return fds.open_file_description(fd); }); } - ErrorOr> open_file_description(int fd) const + ErrorOr> open_file_description(int fd) const { return m_fds.with_shared([fd](auto& fds) { return fds.open_file_description(fd); }); } @@ -825,23 +825,23 @@ private: Atomic m_is_stopped { false }; bool m_should_generate_coredump { false }; - RefPtr m_executable; + LockRefPtr m_executable; - SpinlockProtected> m_current_directory; + SpinlockProtected> m_current_directory; NonnullOwnPtrVector m_arguments; NonnullOwnPtrVector m_environment; - RefPtr m_tty; + LockRefPtr m_tty; - WeakPtr m_master_tls_region; + LockWeakPtr m_master_tls_region; size_t m_master_tls_size { 0 }; size_t m_master_tls_alignment { 0 }; Mutex m_big_lock { "Process"sv, Mutex::MutexBehavior::BigLock }; Mutex m_ptrace_lock { "ptrace"sv }; - RefPtr m_alarm_timer; + LockRefPtr m_alarm_timer; SpinlockProtected m_unveil_data; @@ -860,9 +860,9 @@ private: }; SpinlockProtected> m_coredump_properties { LockRank::None }; - NonnullRefPtrVector m_threads_for_coredump; + NonnullLockRefPtrVector m_threads_for_coredump; - mutable RefPtr m_procfs_traits; + mutable LockRefPtr m_procfs_traits; struct SignalActionData { VirtualAddress handler_or_sigaction; int flags { 0 }; diff --git a/Kernel/ProcessExposed.cpp b/Kernel/ProcessExposed.cpp index d3e883b1e2..e79abb1ca5 100644 --- a/Kernel/ProcessExposed.cpp +++ b/Kernel/ProcessExposed.cpp @@ -205,17 +205,17 @@ ErrorOr ProcFSExposedLink::read_bytes(off_t offset, size_t count, UserOr return nread; } -ErrorOr> ProcFSExposedLink::to_inode(ProcFS const& procfs_instance) const +ErrorOr> ProcFSExposedLink::to_inode(ProcFS const& procfs_instance) const { return TRY(ProcFSLinkInode::try_create(procfs_instance, *this)); } -ErrorOr> ProcFSExposedComponent::to_inode(ProcFS const& procfs_instance) const +ErrorOr> ProcFSExposedComponent::to_inode(ProcFS const& procfs_instance) const { return TRY(ProcFSGlobalInode::try_create(procfs_instance, *this)); } -ErrorOr> ProcFSExposedDirectory::to_inode(ProcFS const& procfs_instance) const +ErrorOr> ProcFSExposedDirectory::to_inode(ProcFS const& procfs_instance) const { return TRY(ProcFSDirectoryInode::try_create(procfs_instance, *this)); } @@ -225,7 +225,7 @@ void ProcFSExposedDirectory::add_component(ProcFSExposedComponent const&) TODO(); } -ErrorOr> ProcFSExposedDirectory::lookup(StringView name) +ErrorOr> ProcFSExposedDirectory::lookup(StringView name) { for (auto& component : m_components) { if (component.name() == name) { diff --git a/Kernel/ProcessExposed.h b/Kernel/ProcessExposed.h index e4779c7339..76604ae48a 100644 --- a/Kernel/ProcessExposed.h +++ b/Kernel/ProcessExposed.h @@ -9,12 +9,12 @@ #include #include #include -#include #include #include #include #include #include +#include #include #include @@ -63,7 +63,7 @@ public: private: Mutex m_lock; - NonnullRefPtr m_root_directory; + NonnullLockRefPtr m_root_directory; }; class ProcFSExposedComponent : public AtomicRefCounted { @@ -71,7 +71,7 @@ public: StringView name() const { return m_name->view(); } virtual ErrorOr read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const { VERIFY_NOT_REACHED(); } virtual ErrorOr traverse_as_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)>) const { VERIFY_NOT_REACHED(); } - virtual ErrorOr> lookup(StringView) { VERIFY_NOT_REACHED(); }; + virtual ErrorOr> lookup(StringView) { VERIFY_NOT_REACHED(); }; virtual ErrorOr write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) { return EROFS; } virtual ErrorOr truncate(u64) { return EPERM; } virtual ErrorOr set_mtime(time_t) { return ENOTIMPL; } @@ -87,7 +87,7 @@ public: return {}; } - virtual ErrorOr> to_inode(ProcFS const& procfs_instance) const; + virtual ErrorOr> to_inode(ProcFS const& procfs_instance) const; virtual InodeIndex component_index() const { return m_component_index; } @@ -104,12 +104,12 @@ private: class ProcFSExposedDirectory : public ProcFSExposedComponent - , public Weakable { + , public LockWeakable { friend class ProcFSComponentRegistry; public: virtual ErrorOr traverse_as_directory(FileSystemID, Function(FileSystem::DirectoryEntryView const&)>) const override; - virtual ErrorOr> lookup(StringView name) override; + virtual ErrorOr> lookup(StringView name) override; void add_component(ProcFSExposedComponent const&); virtual void prepare_for_deletion() override @@ -120,18 +120,18 @@ public: } virtual mode_t required_mode() const override { return 0555; } - virtual ErrorOr> to_inode(ProcFS const& procfs_instance) const override final; + virtual ErrorOr> to_inode(ProcFS const& procfs_instance) const override final; protected: explicit ProcFSExposedDirectory(StringView name); ProcFSExposedDirectory(StringView name, ProcFSExposedDirectory const& parent_directory); - NonnullRefPtrVector m_components; - WeakPtr m_parent_directory; + NonnullLockRefPtrVector m_components; + LockWeakPtr m_parent_directory; }; class ProcFSExposedLink : public ProcFSExposedComponent { public: - virtual ErrorOr> to_inode(ProcFS const& procfs_instance) const override final; + virtual ErrorOr> to_inode(ProcFS const& procfs_instance) const override final; virtual ErrorOr read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription* description) const override; @@ -149,8 +149,8 @@ class ProcFSRootDirectory final : public ProcFSExposedDirectory { friend class ProcFSComponentRegistry; public: - virtual ErrorOr> lookup(StringView name) override; - static NonnullRefPtr must_create(); + virtual ErrorOr> lookup(StringView name) override; + static NonnullLockRefPtr must_create(); virtual ~ProcFSRootDirectory(); diff --git a/Kernel/ProcessGroup.cpp b/Kernel/ProcessGroup.cpp index d9b6aa60b8..7463ed41a6 100644 --- a/Kernel/ProcessGroup.cpp +++ b/Kernel/ProcessGroup.cpp @@ -24,31 +24,31 @@ ProcessGroup::~ProcessGroup() }); } -ErrorOr> ProcessGroup::try_create(ProcessGroupID pgid) +ErrorOr> ProcessGroup::try_create(ProcessGroupID pgid) { - auto process_group = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) ProcessGroup(pgid))); + auto process_group = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcessGroup(pgid))); process_groups().with([&](auto& groups) { groups.prepend(*process_group); }); return process_group; } -ErrorOr> ProcessGroup::try_find_or_create(ProcessGroupID pgid) +ErrorOr> ProcessGroup::try_find_or_create(ProcessGroupID pgid) { - return process_groups().with([&](auto& groups) -> ErrorOr> { + return process_groups().with([&](auto& groups) -> ErrorOr> { for (auto& group : groups) { if (group.pgid() == pgid) return group; } - auto process_group = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) ProcessGroup(pgid))); + auto process_group = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) ProcessGroup(pgid))); groups.prepend(*process_group); return process_group; }); } -RefPtr ProcessGroup::from_pgid(ProcessGroupID pgid) +LockRefPtr ProcessGroup::from_pgid(ProcessGroupID pgid) { - return process_groups().with([&](auto& groups) -> RefPtr { + return process_groups().with([&](auto& groups) -> LockRefPtr { for (auto& group : groups) { if (group.pgid() == pgid) return &group; diff --git a/Kernel/ProcessGroup.h b/Kernel/ProcessGroup.h index 37b0e0a1a2..b2746f59b7 100644 --- a/Kernel/ProcessGroup.h +++ b/Kernel/ProcessGroup.h @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include @@ -16,7 +16,7 @@ namespace Kernel { class ProcessGroup : public AtomicRefCounted - , public Weakable { + , public LockWeakable { AK_MAKE_NONMOVABLE(ProcessGroup); AK_MAKE_NONCOPYABLE(ProcessGroup); @@ -24,9 +24,9 @@ class ProcessGroup public: ~ProcessGroup(); - static ErrorOr> try_create(ProcessGroupID); - static ErrorOr> try_find_or_create(ProcessGroupID); - static RefPtr from_pgid(ProcessGroupID); + static ErrorOr> try_create(ProcessGroupID); + static ErrorOr> try_find_or_create(ProcessGroupID); + static LockRefPtr from_pgid(ProcessGroupID); ProcessGroupID const& pgid() const { return m_pgid; } diff --git a/Kernel/ProcessProcFSTraits.cpp b/Kernel/ProcessProcFSTraits.cpp index 78a04f5469..c894fe0667 100644 --- a/Kernel/ProcessProcFSTraits.cpp +++ b/Kernel/ProcessProcFSTraits.cpp @@ -36,7 +36,7 @@ InodeIndex Process::ProcessProcFSTraits::component_index() const return SegmentedProcFSIndex::build_segmented_index_for_pid_directory(process->pid()); } -ErrorOr> Process::ProcessProcFSTraits::to_inode(ProcFS const& procfs_instance) const +ErrorOr> Process::ProcessProcFSTraits::to_inode(ProcFS const& procfs_instance) const { auto process = m_process.strong_ref(); if (!process) diff --git a/Kernel/ProcessSpecificExposed.cpp b/Kernel/ProcessSpecificExposed.cpp index 86359a78a0..8e25c28c20 100644 --- a/Kernel/ProcessSpecificExposed.cpp +++ b/Kernel/ProcessSpecificExposed.cpp @@ -57,14 +57,14 @@ ErrorOr Process::traverse_stacks_directory(FileSystemID fsid, Function> Process::lookup_stacks_directory(ProcFS const& procfs, StringView name) const +ErrorOr> Process::lookup_stacks_directory(ProcFS const& procfs, StringView name) const { auto maybe_needle = name.to_uint(); if (!maybe_needle.has_value()) return ENOENT; auto needle = maybe_needle.release_value(); - ErrorOr> thread_stack_inode { ENOENT }; + ErrorOr> thread_stack_inode { ENOENT }; for_each_thread([&](Thread const& thread) { int tid = thread.tid().value(); VERIFY(!(tid < 0)); @@ -96,7 +96,7 @@ ErrorOr Process::traverse_children_directory(FileSystemID fsid, Function> Process::lookup_children_directory(ProcFS const& procfs, StringView name) const +ErrorOr> Process::lookup_children_directory(ProcFS const& procfs, StringView name) const { auto maybe_pid = name.to_uint(); if (!maybe_pid.has_value()) @@ -145,7 +145,7 @@ ErrorOr Process::traverse_file_descriptions_directory(FileSystemID fsid, F return {}; } -ErrorOr> Process::lookup_file_descriptions_directory(ProcFS const& procfs, StringView name) const +ErrorOr> Process::lookup_file_descriptions_directory(ProcFS const& procfs, StringView name) const { auto maybe_index = name.to_uint(); if (!maybe_index.has_value()) @@ -233,7 +233,7 @@ ErrorOr Process::procfs_get_fds_stats(KBufferBuilder& builder) const return {}; } bool cloexec = file_description_metadata.flags() & FD_CLOEXEC; - RefPtr description = file_description_metadata.description(); + LockRefPtr description = file_description_metadata.description(); auto description_object = TRY(array.add_object()); TRY(description_object.add("fd"sv, count)); // TODO: Better OOM handling. diff --git a/Kernel/Scheduler.cpp b/Kernel/Scheduler.cpp index 4fb95329eb..1c8789b972 100644 --- a/Kernel/Scheduler.cpp +++ b/Kernel/Scheduler.cpp @@ -394,7 +394,7 @@ UNMAP_AFTER_INIT void Scheduler::initialize() current_time = current_time_monotonic; } - RefPtr idle_thread; + LockRefPtr idle_thread; g_finalizer_wait_queue = new WaitQueue; g_finalizer_has_work.store(false, AK::MemoryOrder::memory_order_release); diff --git a/Kernel/Storage/ATA/AHCI/Controller.cpp b/Kernel/Storage/ATA/AHCI/Controller.cpp index 439cc58277..6b375ecdeb 100644 --- a/Kernel/Storage/ATA/AHCI/Controller.cpp +++ b/Kernel/Storage/ATA/AHCI/Controller.cpp @@ -7,19 +7,19 @@ #include #include #include -#include #include #include #include +#include #include #include #include namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr AHCIController::initialize(PCI::DeviceIdentifier const& pci_device_identifier) +UNMAP_AFTER_INIT NonnullLockRefPtr AHCIController::initialize(PCI::DeviceIdentifier const& pci_device_identifier) { - auto controller = adopt_ref_if_nonnull(new (nothrow) AHCIController(pci_device_identifier)).release_nonnull(); + auto controller = adopt_lock_ref_if_nonnull(new (nothrow) AHCIController(pci_device_identifier)).release_nonnull(); controller->initialize_hba(pci_device_identifier); return controller; } @@ -192,7 +192,7 @@ void AHCIController::enable_global_interrupts() const hba().control_regs.ghc = hba().control_regs.ghc | (1 << 1); } -RefPtr AHCIController::device_by_port(u32 port_index) const +LockRefPtr AHCIController::device_by_port(u32 port_index) const { SpinlockLocker locker(m_hba_control_lock); auto port = m_ports[port_index]; @@ -202,9 +202,9 @@ RefPtr AHCIController::device_by_port(u32 port_index) const return port->connected_device(); } -RefPtr AHCIController::device(u32 index) const +LockRefPtr AHCIController::device(u32 index) const { - NonnullRefPtrVector connected_devices; + NonnullLockRefPtrVector connected_devices; u32 pi = hba().control_regs.pi; u32 bit = bit_scan_forward(pi); while (bit) { diff --git a/Kernel/Storage/ATA/AHCI/Controller.h b/Kernel/Storage/ATA/AHCI/Controller.h index 10dfda9508..aacd58d181 100644 --- a/Kernel/Storage/ATA/AHCI/Controller.h +++ b/Kernel/Storage/ATA/AHCI/Controller.h @@ -7,8 +7,8 @@ #pragma once #include -#include #include +#include #include #include #include @@ -24,10 +24,10 @@ class AHCIController final : public ATAController friend class AHCIInterruptHandler; public: - static NonnullRefPtr initialize(PCI::DeviceIdentifier const& pci_device_identifier); + static NonnullLockRefPtr initialize(PCI::DeviceIdentifier const& pci_device_identifier); virtual ~AHCIController() override; - virtual RefPtr device(u32 index) const override; + virtual LockRefPtr device(u32 index) const override; virtual bool reset() override; virtual bool shutdown() override; virtual size_t devices_count() const override; @@ -44,13 +44,13 @@ private: void initialize_hba(PCI::DeviceIdentifier const&); AHCI::HBADefinedCapabilities capabilities() const; - RefPtr device_by_port(u32 index) const; + LockRefPtr device_by_port(u32 index) const; volatile AHCI::PortRegisters& port(size_t port_number) const; NonnullOwnPtr default_hba_region() const; volatile AHCI::HBA& hba() const; - Array, 32> m_ports; + Array, 32> m_ports; NonnullOwnPtr m_hba_region; AHCI::HBADefinedCapabilities m_hba_capabilities; diff --git a/Kernel/Storage/ATA/AHCI/InterruptHandler.h b/Kernel/Storage/ATA/AHCI/InterruptHandler.h index 5483ba7329..d889688732 100644 --- a/Kernel/Storage/ATA/AHCI/InterruptHandler.h +++ b/Kernel/Storage/ATA/AHCI/InterruptHandler.h @@ -6,10 +6,10 @@ #pragma once -#include #include #include #include +#include #include #include #include @@ -53,7 +53,7 @@ private: AHCI::MaskedBitField create_pending_ports_interrupts_bitfield() const; // Data members - NonnullRefPtr m_parent_controller; + NonnullLockRefPtr m_parent_controller; AHCI::MaskedBitField m_taken_ports; AHCI::MaskedBitField m_pending_ports_interrupts; }; diff --git a/Kernel/Storage/ATA/AHCI/Port.cpp b/Kernel/Storage/ATA/AHCI/Port.cpp index 97a77b0cdb..e21f89127a 100644 --- a/Kernel/Storage/ATA/AHCI/Port.cpp +++ b/Kernel/Storage/ATA/AHCI/Port.cpp @@ -20,10 +20,10 @@ namespace Kernel { -UNMAP_AFTER_INIT ErrorOr> AHCIPort::create(AHCIController const& controller, AHCI::HBADefinedCapabilities hba_capabilities, volatile AHCI::PortRegisters& registers, u32 port_index) +UNMAP_AFTER_INIT ErrorOr> AHCIPort::create(AHCIController const& controller, AHCI::HBADefinedCapabilities hba_capabilities, volatile AHCI::PortRegisters& registers, u32 port_index) { auto identify_buffer_page = MUST(MM.allocate_physical_page()); - auto port = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) AHCIPort(controller, move(identify_buffer_page), hba_capabilities, registers, port_index))); + auto port = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) AHCIPort(controller, move(identify_buffer_page), hba_capabilities, registers, port_index))); TRY(port->allocate_resources_and_initialize_ports()); return port; } @@ -54,7 +54,7 @@ ErrorOr AHCIPort::allocate_resources_and_initialize_ports() return {}; } -UNMAP_AFTER_INIT AHCIPort::AHCIPort(AHCIController const& controller, NonnullRefPtr identify_buffer_page, AHCI::HBADefinedCapabilities hba_capabilities, volatile AHCI::PortRegisters& registers, u32 port_index) +UNMAP_AFTER_INIT AHCIPort::AHCIPort(AHCIController const& controller, NonnullLockRefPtr identify_buffer_page, AHCI::HBADefinedCapabilities hba_capabilities, volatile AHCI::PortRegisters& registers, u32 port_index) : m_port_index(port_index) , m_hba_capabilities(hba_capabilities) , m_identify_buffer_page(move(identify_buffer_page)) @@ -180,7 +180,7 @@ void AHCIPort::recover_from_fatal_error() { MutexLocker locker(m_lock); SpinlockLocker lock(m_hard_lock); - RefPtr controller = m_parent_controller.strong_ref(); + LockRefPtr controller = m_parent_controller.strong_ref(); if (!controller) { dmesgln("AHCI Port {}: fatal error, controller not available", representative_port_index()); return; @@ -355,7 +355,7 @@ bool AHCIPort::initialize() // FIXME: We don't support ATAPI devices yet, so for now we don't "create" them if (!is_atapi_attached()) { - RefPtr controller = m_parent_controller.strong_ref(); + LockRefPtr controller = m_parent_controller.strong_ref(); if (!controller) { dmesgln("AHCI Port {}: Device found, but parent controller is not available, abort.", representative_port_index()); return false; @@ -496,7 +496,7 @@ Optional AHCIPort::prepare_and_set_scatter_li VERIFY(m_lock.is_locked()); VERIFY(request.block_count() > 0); - NonnullRefPtrVector allocated_dma_regions; + NonnullLockRefPtrVector allocated_dma_regions; for (size_t index = 0; index < calculate_descriptors_count(request.block_count()); index++) { allocated_dma_regions.append(m_dma_buffers.at(index)); } @@ -662,7 +662,7 @@ bool AHCIPort::identify_device() if (!spin_until_ready()) return false; - RefPtr controller = m_parent_controller.strong_ref(); + LockRefPtr controller = m_parent_controller.strong_ref(); if (!controller) return false; diff --git a/Kernel/Storage/ATA/AHCI/Port.h b/Kernel/Storage/ATA/AHCI/Port.h index 26c0939ec2..bc5c81d68c 100644 --- a/Kernel/Storage/ATA/AHCI/Port.h +++ b/Kernel/Storage/ATA/AHCI/Port.h @@ -7,11 +7,11 @@ #pragma once #include -#include -#include -#include #include #include +#include +#include +#include #include #include #include @@ -33,18 +33,18 @@ class AsyncBlockDeviceRequest; class AHCIInterruptHandler; class AHCIPort : public AtomicRefCounted - , public Weakable { + , public LockWeakable { friend class AHCIController; public: - static ErrorOr> create(AHCIController const&, AHCI::HBADefinedCapabilities, volatile AHCI::PortRegisters&, u32 port_index); + static ErrorOr> create(AHCIController const&, AHCI::HBADefinedCapabilities, volatile AHCI::PortRegisters&, u32 port_index); u32 port_index() const { return m_port_index; } u32 representative_port_index() const { return port_index() + 1; } bool is_operable() const; bool is_atapi_attached() const { return m_port_registers.sig == (u32)ATA::DeviceSignature::ATAPI; }; - RefPtr connected_device() const { return m_connected_device; } + LockRefPtr connected_device() const { return m_connected_device; } bool reset(); bool initialize_without_reset(); @@ -56,7 +56,7 @@ private: bool is_phy_enabled() const { return (m_port_registers.ssts & 0xf) == 3; } bool initialize(); - AHCIPort(AHCIController const&, NonnullRefPtr identify_buffer_page, AHCI::HBADefinedCapabilities, volatile AHCI::PortRegisters&, u32 port_index); + AHCIPort(AHCIController const&, NonnullLockRefPtr identify_buffer_page, AHCI::HBADefinedCapabilities, volatile AHCI::PortRegisters&, u32 port_index); ALWAYS_INLINE void clear_sata_error_register() const; @@ -105,18 +105,18 @@ private: // Data members EntropySource m_entropy_source; - RefPtr m_current_request; + LockRefPtr m_current_request; Spinlock m_hard_lock { LockRank::None }; Mutex m_lock { "AHCIPort"sv }; mutable bool m_wait_for_completion { false }; - NonnullRefPtrVector m_dma_buffers; - NonnullRefPtrVector m_command_table_pages; - RefPtr m_command_list_page; + NonnullLockRefPtrVector m_dma_buffers; + NonnullLockRefPtrVector m_command_table_pages; + LockRefPtr m_command_list_page; OwnPtr m_command_list_region; - RefPtr m_fis_receive_page; - RefPtr m_connected_device; + LockRefPtr m_fis_receive_page; + LockRefPtr m_connected_device; u32 m_port_index; @@ -125,14 +125,14 @@ private: // it's probably better to just "cache" this here instead. AHCI::HBADefinedCapabilities const m_hba_capabilities; - NonnullRefPtr m_identify_buffer_page; + NonnullLockRefPtr m_identify_buffer_page; volatile AHCI::PortRegisters& m_port_registers; - WeakPtr m_parent_controller; + LockWeakPtr m_parent_controller; AHCI::PortInterruptStatusBitField m_interrupt_status; AHCI::PortInterruptEnableBitField m_interrupt_enable; - RefPtr m_current_scatter_list; + LockRefPtr m_current_scatter_list; bool m_disabled_by_firmware { false }; }; } diff --git a/Kernel/Storage/ATA/ATAController.h b/Kernel/Storage/ATA/ATAController.h index 02885d77a2..7a314ef087 100644 --- a/Kernel/Storage/ATA/ATAController.h +++ b/Kernel/Storage/ATA/ATAController.h @@ -7,9 +7,9 @@ #pragma once #include -#include #include #include +#include #include namespace Kernel { @@ -19,7 +19,7 @@ class AsyncBlockDeviceRequest; class ATADevice; class ATAController : public StorageController - , public Weakable { + , public LockWeakable { public: virtual void start_request(ATADevice const&, AsyncBlockDeviceRequest&) = 0; diff --git a/Kernel/Storage/ATA/ATADevice.h b/Kernel/Storage/ATA/ATADevice.h index 5700353dad..debd0acc2a 100644 --- a/Kernel/Storage/ATA/ATADevice.h +++ b/Kernel/Storage/ATA/ATADevice.h @@ -38,7 +38,7 @@ public: protected: ATADevice(ATAController const&, Address, MinorNumber, u16, u16, u64, NonnullOwnPtr); - WeakPtr m_controller; + LockWeakPtr m_controller; const Address m_ata_address; const u16 m_capabilities; }; diff --git a/Kernel/Storage/ATA/ATADiskDevice.cpp b/Kernel/Storage/ATA/ATADiskDevice.cpp index ca9c33c333..7fd895eb1b 100644 --- a/Kernel/Storage/ATA/ATADiskDevice.cpp +++ b/Kernel/Storage/ATA/ATADiskDevice.cpp @@ -12,7 +12,7 @@ namespace Kernel { -NonnullRefPtr ATADiskDevice::create(ATAController const& controller, ATADevice::Address ata_address, u16 capabilities, u16 logical_sector_size, u64 max_addressable_block) +NonnullLockRefPtr ATADiskDevice::create(ATAController const& controller, ATADevice::Address ata_address, u16 capabilities, u16 logical_sector_size, u64 max_addressable_block) { auto minor_device_number = StorageManagement::generate_storage_minor_number(); diff --git a/Kernel/Storage/ATA/ATADiskDevice.h b/Kernel/Storage/ATA/ATADiskDevice.h index 595ebe2e8a..33f8c7b307 100644 --- a/Kernel/Storage/ATA/ATADiskDevice.h +++ b/Kernel/Storage/ATA/ATADiskDevice.h @@ -18,7 +18,7 @@ class ATADiskDevice final : public ATADevice { friend class DeviceManagement; public: - static NonnullRefPtr create(ATAController const&, ATADevice::Address, u16 capabilities, u16 logical_sector_size, u64 max_addressable_block); + static NonnullLockRefPtr create(ATAController const&, ATADevice::Address, u16 capabilities, u16 logical_sector_size, u64 max_addressable_block); virtual ~ATADiskDevice() override; // ^StorageDevice diff --git a/Kernel/Storage/ATA/ATAPort.cpp b/Kernel/Storage/ATA/ATAPort.cpp index 0b0c5ebd46..7f89a9d64c 100644 --- a/Kernel/Storage/ATA/ATAPort.cpp +++ b/Kernel/Storage/ATA/ATAPort.cpp @@ -26,7 +26,7 @@ public: }; private: - RefPtr m_port; + LockRefPtr m_port; }; class ATAPortInterruptCleaner { @@ -42,7 +42,7 @@ public: }; private: - RefPtr m_port; + LockRefPtr m_port; }; void ATAPort::fix_name_string_in_identify_device_block() @@ -99,7 +99,7 @@ ErrorOr ATAPort::detect_connected_devices() return {}; } -RefPtr ATAPort::connected_device(size_t device_index) const +LockRefPtr ATAPort::connected_device(size_t device_index) const { MutexLocker locker(m_lock); if (m_ata_devices.size() > device_index) diff --git a/Kernel/Storage/ATA/ATAPort.h b/Kernel/Storage/ATA/ATAPort.h index 88d133b43f..0ae444012b 100644 --- a/Kernel/Storage/ATA/ATAPort.h +++ b/Kernel/Storage/ATA/ATAPort.h @@ -14,7 +14,7 @@ class AsyncBlockDeviceRequest; class ATAPort : public AtomicRefCounted - , public Weakable { + , public LockWeakable { friend class ATAPortInterruptDisabler; friend class ATAPortInterruptCleaner; @@ -50,7 +50,7 @@ public: }; public: - RefPtr connected_device(size_t device_index) const; + LockRefPtr connected_device(size_t device_index) const; virtual ~ATAPort() = default; @@ -139,18 +139,18 @@ protected: EntropySource m_entropy_source; - RefPtr m_current_request; + LockRefPtr m_current_request; u64 m_current_request_block_index { 0 }; bool m_current_request_flushing_cache { false }; OwnPtr m_prdt_region; OwnPtr m_dma_buffer_region; - RefPtr m_prdt_page; - RefPtr m_dma_buffer_page; + LockRefPtr m_prdt_page; + LockRefPtr m_dma_buffer_page; const u8 m_port_index; - NonnullRefPtrVector m_ata_devices; + NonnullLockRefPtrVector m_ata_devices; NonnullOwnPtr m_ata_identify_data_buffer; - NonnullRefPtr m_parent_ata_controller; + NonnullLockRefPtr m_parent_ata_controller; }; } diff --git a/Kernel/Storage/ATA/GenericIDE/Channel.cpp b/Kernel/Storage/ATA/GenericIDE/Channel.cpp index 854e57e058..c89ef74d6f 100644 --- a/Kernel/Storage/ATA/GenericIDE/Channel.cpp +++ b/Kernel/Storage/ATA/GenericIDE/Channel.cpp @@ -23,16 +23,16 @@ namespace Kernel { #define PATA_PRIMARY_IRQ 14 #define PATA_SECONDARY_IRQ 15 -UNMAP_AFTER_INIT NonnullRefPtr IDEChannel::create(IDEController const& controller, IOAddressGroup io_group, ChannelType type) +UNMAP_AFTER_INIT NonnullLockRefPtr IDEChannel::create(IDEController const& controller, IOAddressGroup io_group, ChannelType type) { auto ata_identify_data_buffer = KBuffer::try_create_with_size("ATA Identify Page"sv, 4096, Memory::Region::Access::ReadWrite, AllocationStrategy::AllocateNow).release_value(); - return adopt_ref(*new IDEChannel(controller, io_group, type, move(ata_identify_data_buffer))); + return adopt_lock_ref(*new IDEChannel(controller, io_group, type, move(ata_identify_data_buffer))); } -UNMAP_AFTER_INIT NonnullRefPtr IDEChannel::create(IDEController const& controller, u8 irq, IOAddressGroup io_group, ChannelType type) +UNMAP_AFTER_INIT NonnullLockRefPtr IDEChannel::create(IDEController const& controller, u8 irq, IOAddressGroup io_group, ChannelType type) { auto ata_identify_data_buffer = KBuffer::try_create_with_size("ATA Identify Page"sv, 4096, Memory::Region::Access::ReadWrite, AllocationStrategy::AllocateNow).release_value(); - return adopt_ref(*new IDEChannel(controller, irq, io_group, type, move(ata_identify_data_buffer))); + return adopt_lock_ref(*new IDEChannel(controller, irq, io_group, type, move(ata_identify_data_buffer))); } StringView IDEChannel::channel_type_string() const diff --git a/Kernel/Storage/ATA/GenericIDE/Channel.h b/Kernel/Storage/ATA/GenericIDE/Channel.h index 63b1538ebc..d77a2b3bf3 100644 --- a/Kernel/Storage/ATA/GenericIDE/Channel.h +++ b/Kernel/Storage/ATA/GenericIDE/Channel.h @@ -18,10 +18,10 @@ #pragma once #include -#include #include #include #include +#include #include #include #include @@ -103,8 +103,8 @@ public: }; public: - static NonnullRefPtr create(IDEController const&, IOAddressGroup, ChannelType type); - static NonnullRefPtr create(IDEController const&, u8 irq, IOAddressGroup, ChannelType type); + static NonnullLockRefPtr create(IDEController const&, IOAddressGroup, ChannelType type); + static NonnullLockRefPtr create(IDEController const&, u8 irq, IOAddressGroup, ChannelType type); virtual ~IDEChannel() override; diff --git a/Kernel/Storage/ATA/GenericIDE/Controller.cpp b/Kernel/Storage/ATA/GenericIDE/Controller.cpp index 0fcdc69068..e9d73510fe 100644 --- a/Kernel/Storage/ATA/GenericIDE/Controller.cpp +++ b/Kernel/Storage/ATA/GenericIDE/Controller.cpp @@ -5,10 +5,10 @@ */ #include -#include #include #include #include +#include #include #include #include @@ -16,9 +16,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr IDEController::initialize() +UNMAP_AFTER_INIT NonnullLockRefPtr IDEController::initialize() { - return adopt_ref(*new IDEController()); + return adopt_lock_ref(*new IDEController()); } bool IDEController::reset() @@ -70,7 +70,7 @@ void IDEController::complete_current_request(AsyncDeviceRequest::RequestResult) UNMAP_AFTER_INIT IDEController::IDEController() = default; UNMAP_AFTER_INIT IDEController::~IDEController() = default; -RefPtr IDEController::device_by_channel_and_position(u32 index) const +LockRefPtr IDEController::device_by_channel_and_position(u32 index) const { switch (index) { case 0: @@ -85,9 +85,9 @@ RefPtr IDEController::device_by_channel_and_position(u32 index) c VERIFY_NOT_REACHED(); } -RefPtr IDEController::device(u32 index) const +LockRefPtr IDEController::device(u32 index) const { - NonnullRefPtrVector connected_devices; + NonnullLockRefPtrVector connected_devices; for (size_t index = 0; index < 4; index++) { auto checked_device = device_by_channel_and_position(index); if (checked_device.is_null()) diff --git a/Kernel/Storage/ATA/GenericIDE/Controller.h b/Kernel/Storage/ATA/GenericIDE/Controller.h index f1c96d6298..406bcad5d4 100644 --- a/Kernel/Storage/ATA/GenericIDE/Controller.h +++ b/Kernel/Storage/ATA/GenericIDE/Controller.h @@ -7,8 +7,8 @@ #pragma once #include -#include #include +#include #include #include @@ -18,10 +18,10 @@ class AsyncBlockDeviceRequest; class IDEChannel; class IDEController : public ATAController { public: - static NonnullRefPtr initialize(); + static NonnullLockRefPtr initialize(); virtual ~IDEController() override; - virtual RefPtr device(u32 index) const override final; + virtual LockRefPtr device(u32 index) const override final; virtual bool reset() override final; virtual bool shutdown() override final; virtual size_t devices_count() const override final; @@ -31,7 +31,7 @@ public: protected: IDEController(); - RefPtr device_by_channel_and_position(u32 index) const; - NonnullRefPtrVector m_channels; + LockRefPtr device_by_channel_and_position(u32 index) const; + NonnullLockRefPtrVector m_channels; }; } diff --git a/Kernel/Storage/ATA/GenericIDE/ISAController.cpp b/Kernel/Storage/ATA/GenericIDE/ISAController.cpp index 71c6c63472..ee8c48520b 100644 --- a/Kernel/Storage/ATA/GenericIDE/ISAController.cpp +++ b/Kernel/Storage/ATA/GenericIDE/ISAController.cpp @@ -5,10 +5,10 @@ */ #include -#include #include #include #include +#include #include #include #include @@ -16,9 +16,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr ISAIDEController::initialize() +UNMAP_AFTER_INIT NonnullLockRefPtr ISAIDEController::initialize() { - return adopt_ref(*new ISAIDEController()); + return adopt_lock_ref(*new ISAIDEController()); } UNMAP_AFTER_INIT ISAIDEController::ISAIDEController() diff --git a/Kernel/Storage/ATA/GenericIDE/ISAController.h b/Kernel/Storage/ATA/GenericIDE/ISAController.h index eb1206bd5b..9be7b3b37e 100644 --- a/Kernel/Storage/ATA/GenericIDE/ISAController.h +++ b/Kernel/Storage/ATA/GenericIDE/ISAController.h @@ -7,8 +7,8 @@ #pragma once #include -#include #include +#include #include #include @@ -18,12 +18,12 @@ class AsyncBlockDeviceRequest; class ISAIDEController final : public IDEController { public: - static NonnullRefPtr initialize(); + static NonnullLockRefPtr initialize(); private: ISAIDEController(); - RefPtr device_by_channel_and_position(u32 index) const; + LockRefPtr device_by_channel_and_position(u32 index) const; void initialize_channels(); }; } diff --git a/Kernel/Storage/ATA/GenericIDE/PCIController.cpp b/Kernel/Storage/ATA/GenericIDE/PCIController.cpp index 52cd9bb6e5..33d2011478 100644 --- a/Kernel/Storage/ATA/GenericIDE/PCIController.cpp +++ b/Kernel/Storage/ATA/GenericIDE/PCIController.cpp @@ -5,10 +5,10 @@ */ #include -#include #include #include #include +#include #include #include #include @@ -16,9 +16,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr PCIIDEController::initialize(PCI::DeviceIdentifier const& device_identifier, bool force_pio) +UNMAP_AFTER_INIT NonnullLockRefPtr PCIIDEController::initialize(PCI::DeviceIdentifier const& device_identifier, bool force_pio) { - return adopt_ref(*new PCIIDEController(device_identifier, force_pio)); + return adopt_lock_ref(*new PCIIDEController(device_identifier, force_pio)); } UNMAP_AFTER_INIT PCIIDEController::PCIIDEController(PCI::DeviceIdentifier const& device_identifier, bool force_pio) diff --git a/Kernel/Storage/ATA/GenericIDE/PCIController.h b/Kernel/Storage/ATA/GenericIDE/PCIController.h index 3676a873c4..900cb4993c 100644 --- a/Kernel/Storage/ATA/GenericIDE/PCIController.h +++ b/Kernel/Storage/ATA/GenericIDE/PCIController.h @@ -7,8 +7,8 @@ #pragma once #include -#include #include +#include #include #include @@ -19,7 +19,7 @@ class AsyncBlockDeviceRequest; class PCIIDEController final : public IDEController , public PCI::Device { public: - static NonnullRefPtr initialize(PCI::DeviceIdentifier const&, bool force_pio); + static NonnullLockRefPtr initialize(PCI::DeviceIdentifier const&, bool force_pio); bool is_bus_master_capable() const; bool is_pci_native_mode_enabled() const; @@ -29,7 +29,7 @@ private: bool is_pci_native_mode_enabled_on_secondary_channel() const; PCIIDEController(PCI::DeviceIdentifier const&, bool force_pio); - RefPtr device_by_channel_and_position(u32 index) const; + LockRefPtr device_by_channel_and_position(u32 index) const; void initialize(bool force_pio); void detect_disks(); diff --git a/Kernel/Storage/DiskPartition.cpp b/Kernel/Storage/DiskPartition.cpp index 49d39294b5..8c23c97be1 100644 --- a/Kernel/Storage/DiskPartition.cpp +++ b/Kernel/Storage/DiskPartition.cpp @@ -11,7 +11,7 @@ namespace Kernel { -NonnullRefPtr DiskPartition::create(BlockDevice& device, MinorNumber minor_number, Partition::DiskPartitionMetadata metadata) +NonnullLockRefPtr DiskPartition::create(BlockDevice& device, MinorNumber minor_number, Partition::DiskPartitionMetadata metadata) { auto partition_or_error = DeviceManagement::try_create_device(device, minor_number, metadata); // FIXME: Find a way to propagate errors diff --git a/Kernel/Storage/DiskPartition.h b/Kernel/Storage/DiskPartition.h index 440f56cd78..ebb78f6f6e 100644 --- a/Kernel/Storage/DiskPartition.h +++ b/Kernel/Storage/DiskPartition.h @@ -6,9 +6,9 @@ #pragma once -#include -#include #include +#include +#include #include namespace Kernel { @@ -17,7 +17,7 @@ class DiskPartition final : public BlockDevice { friend class DeviceManagement; public: - static NonnullRefPtr create(BlockDevice&, MinorNumber, Partition::DiskPartitionMetadata); + static NonnullLockRefPtr create(BlockDevice&, MinorNumber, Partition::DiskPartitionMetadata); virtual ~DiskPartition(); virtual void start_request(AsyncBlockDeviceRequest&) override; @@ -34,7 +34,7 @@ private: DiskPartition(BlockDevice&, MinorNumber, Partition::DiskPartitionMetadata); virtual StringView class_name() const override; - WeakPtr m_device; + LockWeakPtr m_device; Partition::DiskPartitionMetadata m_metadata; }; diff --git a/Kernel/Storage/NVMe/NVMeController.cpp b/Kernel/Storage/NVMe/NVMeController.cpp index e60731bb44..92cc8b9f65 100644 --- a/Kernel/Storage/NVMe/NVMeController.cpp +++ b/Kernel/Storage/NVMe/NVMeController.cpp @@ -7,7 +7,6 @@ #include "NVMeController.h" #include "AK/Format.h" -#include #include #include #include @@ -16,14 +15,15 @@ #include #include #include +#include #include namespace Kernel { Atomic NVMeController::s_controller_id {}; -UNMAP_AFTER_INIT ErrorOr> NVMeController::try_initialize(Kernel::PCI::DeviceIdentifier const& device_identifier, bool is_queue_polled) +UNMAP_AFTER_INIT ErrorOr> NVMeController::try_initialize(Kernel::PCI::DeviceIdentifier const& device_identifier, bool is_queue_polled) { - auto controller = TRY(adopt_nonnull_ref_or_enomem(new NVMeController(device_identifier))); + auto controller = TRY(adopt_nonnull_lock_ref_or_enomem(new NVMeController(device_identifier))); TRY(controller->initialize(is_queue_polled)); NVMeController::s_controller_id++; return controller; @@ -49,7 +49,7 @@ UNMAP_AFTER_INIT ErrorOr NVMeController::initialize(bool is_queue_polled) // Map only until doorbell register for the controller // Queues will individually map the doorbell register respectively - m_controller_regs = TRY(Memory::map_typed_writable(PhysicalAddress(m_bar))); + m_controller_regs = TRY(Memory::map_typed_writable(PhysicalAddress(m_bar))); auto caps = m_controller_regs->cap; m_ready_timeout = Time::from_milliseconds((CAP_TO(caps) + 1) * 500); // CAP.TO is in 500ms units @@ -152,7 +152,7 @@ UNMAP_AFTER_INIT u32 NVMeController::get_admin_q_dept() UNMAP_AFTER_INIT ErrorOr NVMeController::identify_and_init_namespaces() { - RefPtr prp_dma_buffer; + LockRefPtr prp_dma_buffer; OwnPtr prp_dma_region; auto namespace_data_struct = TRY(ByteBuffer::create_zeroed(NVMe_IDENTIFY_SIZE)); u32 active_namespace_list[NVMe_IDENTIFY_SIZE / sizeof(u32)]; @@ -225,7 +225,7 @@ UNMAP_AFTER_INIT Tuple NVMeController::get_ns_features(IdentifyNamespac return Tuple(namespace_size, lba_size); } -RefPtr NVMeController::device(u32 index) const +LockRefPtr NVMeController::device(u32 index) const { return m_namespaces.at(index); } @@ -259,9 +259,9 @@ UNMAP_AFTER_INIT ErrorOr NVMeController::create_admin_queue(Optional i { auto qdepth = get_admin_q_dept(); OwnPtr cq_dma_region; - NonnullRefPtrVector cq_dma_pages; + NonnullLockRefPtrVector cq_dma_pages; OwnPtr sq_dma_region; - NonnullRefPtrVector sq_dma_pages; + NonnullLockRefPtrVector sq_dma_pages; auto cq_size = round_up_to_power_of_two(CQ_SIZE(qdepth), 4096); auto sq_size = round_up_to_power_of_two(SQ_SIZE(qdepth), 4096); if (!reset_controller()) { @@ -281,7 +281,7 @@ UNMAP_AFTER_INIT ErrorOr NVMeController::create_admin_queue(Optional i auto buffer = TRY(MM.allocate_dma_buffer_pages(sq_size, "Admin SQ queue"sv, Memory::Region::Access::ReadWrite, sq_dma_pages)); sq_dma_region = move(buffer); } - auto doorbell_regs = TRY(Memory::map_typed_writable(PhysicalAddress(m_bar + REG_SQ0TDBL_START))); + auto doorbell_regs = TRY(Memory::map_typed_writable(PhysicalAddress(m_bar + REG_SQ0TDBL_START))); m_controller_regs->acq = reinterpret_cast(AK::convert_between_host_and_little_endian(cq_dma_pages.first().paddr().as_ptr())); m_controller_regs->asq = reinterpret_cast(AK::convert_between_host_and_little_endian(sq_dma_pages.first().paddr().as_ptr())); @@ -300,9 +300,9 @@ UNMAP_AFTER_INIT ErrorOr NVMeController::create_admin_queue(Optional i UNMAP_AFTER_INIT ErrorOr NVMeController::create_io_queue(u8 qid, Optional irq) { OwnPtr cq_dma_region; - NonnullRefPtrVector cq_dma_pages; + NonnullLockRefPtrVector cq_dma_pages; OwnPtr sq_dma_region; - NonnullRefPtrVector sq_dma_pages; + NonnullLockRefPtrVector sq_dma_pages; auto cq_size = round_up_to_power_of_two(CQ_SIZE(IO_QUEUE_SIZE), 4096); auto sq_size = round_up_to_power_of_two(SQ_SIZE(IO_QUEUE_SIZE), 4096); @@ -349,7 +349,7 @@ UNMAP_AFTER_INIT ErrorOr NVMeController::create_io_queue(u8 qid, Optional< } auto queue_doorbell_offset = REG_SQ0TDBL_START + ((2 * qid) * (4 << m_dbl_stride)); - auto doorbell_regs = TRY(Memory::map_typed_writable(PhysicalAddress(m_bar + queue_doorbell_offset))); + auto doorbell_regs = TRY(Memory::map_typed_writable(PhysicalAddress(m_bar + queue_doorbell_offset))); m_queues.append(TRY(NVMeQueue::try_create(qid, irq, IO_QUEUE_SIZE, move(cq_dma_region), cq_dma_pages, move(sq_dma_region), sq_dma_pages, move(doorbell_regs)))); dbgln_if(NVME_DEBUG, "NVMe: Created IO Queue with QID{}", m_queues.size()); diff --git a/Kernel/Storage/NVMe/NVMeController.h b/Kernel/Storage/NVMe/NVMeController.h index 198da902b1..4210fc5ea9 100644 --- a/Kernel/Storage/NVMe/NVMeController.h +++ b/Kernel/Storage/NVMe/NVMeController.h @@ -6,14 +6,14 @@ #pragma once -#include -#include #include -#include #include #include #include #include +#include +#include +#include #include #include #include @@ -26,10 +26,10 @@ namespace Kernel { class NVMeController : public PCI::Device , public StorageController { public: - static ErrorOr> try_initialize(PCI::DeviceIdentifier const&, bool is_queue_polled); + static ErrorOr> try_initialize(PCI::DeviceIdentifier const&, bool is_queue_polled); ErrorOr initialize(bool is_queue_polled); explicit NVMeController(PCI::DeviceIdentifier const&); - RefPtr device(u32 index) const override; + LockRefPtr device(u32 index) const override; size_t devices_count() const override; protected: @@ -68,10 +68,10 @@ private: private: PCI::DeviceIdentifier m_pci_device_id; - RefPtr m_admin_queue; - NonnullRefPtrVector m_queues; - NonnullRefPtrVector m_namespaces; - Memory::TypedMapping m_controller_regs; + LockRefPtr m_admin_queue; + NonnullLockRefPtrVector m_queues; + NonnullLockRefPtrVector m_namespaces; + Memory::TypedMapping m_controller_regs; bool m_admin_queue_ready { false }; size_t m_device_count { 0 }; AK::Time m_ready_timeout; diff --git a/Kernel/Storage/NVMe/NVMeInterruptQueue.cpp b/Kernel/Storage/NVMe/NVMeInterruptQueue.cpp index 105c4a6251..310a491da6 100644 --- a/Kernel/Storage/NVMe/NVMeInterruptQueue.cpp +++ b/Kernel/Storage/NVMe/NVMeInterruptQueue.cpp @@ -11,7 +11,7 @@ namespace Kernel { -UNMAP_AFTER_INIT NVMeInterruptQueue::NVMeInterruptQueue(NonnullOwnPtr rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u8 irq, u32 q_depth, OwnPtr cq_dma_region, NonnullRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullRefPtrVector sq_dma_page, Memory::TypedMapping db_regs) +UNMAP_AFTER_INIT NVMeInterruptQueue::NVMeInterruptQueue(NonnullOwnPtr rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u8 irq, u32 q_depth, OwnPtr cq_dma_region, NonnullLockRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullLockRefPtrVector sq_dma_page, Memory::TypedMapping db_regs) : NVMeQueue(move(rw_dma_region), rw_dma_page, qid, q_depth, move(cq_dma_region), cq_dma_page, move(sq_dma_region), sq_dma_page, move(db_regs)) , IRQHandler(irq) { diff --git a/Kernel/Storage/NVMe/NVMeInterruptQueue.h b/Kernel/Storage/NVMe/NVMeInterruptQueue.h index 9b562efb58..b69370cc66 100644 --- a/Kernel/Storage/NVMe/NVMeInterruptQueue.h +++ b/Kernel/Storage/NVMe/NVMeInterruptQueue.h @@ -13,7 +13,7 @@ namespace Kernel { class NVMeInterruptQueue : public NVMeQueue , public IRQHandler { public: - NVMeInterruptQueue(NonnullOwnPtr rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u8 irq, u32 q_depth, OwnPtr cq_dma_region, NonnullRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullRefPtrVector sq_dma_page, Memory::TypedMapping db_regs); + NVMeInterruptQueue(NonnullOwnPtr rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u8 irq, u32 q_depth, OwnPtr cq_dma_region, NonnullLockRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullLockRefPtrVector sq_dma_page, Memory::TypedMapping db_regs); void submit_sqe(NVMeSubmission& submission) override; virtual ~NVMeInterruptQueue() override {}; diff --git a/Kernel/Storage/NVMe/NVMeNameSpace.cpp b/Kernel/Storage/NVMe/NVMeNameSpace.cpp index 86f312784f..f91d157434 100644 --- a/Kernel/Storage/NVMe/NVMeNameSpace.cpp +++ b/Kernel/Storage/NVMe/NVMeNameSpace.cpp @@ -12,7 +12,7 @@ namespace Kernel { -UNMAP_AFTER_INIT ErrorOr> NVMeNameSpace::try_create(NVMeController const& controller, NonnullRefPtrVector queues, u8 controller_id, u16 nsid, size_t storage_size, size_t lba_size) +UNMAP_AFTER_INIT ErrorOr> NVMeNameSpace::try_create(NVMeController const& controller, NonnullLockRefPtrVector queues, u8 controller_id, u16 nsid, size_t storage_size, size_t lba_size) { auto minor_number = StorageManagement::generate_storage_minor_number(); auto major_number = StorageManagement::storage_type_major_number(); @@ -21,7 +21,7 @@ UNMAP_AFTER_INIT ErrorOr> NVMeNameSpace::try_create return device; } -UNMAP_AFTER_INIT NVMeNameSpace::NVMeNameSpace(LUNAddress logical_unit_number_address, NonnullRefPtrVector queues, size_t max_addresable_block, size_t lba_size, size_t major_number, size_t minor_number, u16 nsid, NonnullOwnPtr dev_name) +UNMAP_AFTER_INIT NVMeNameSpace::NVMeNameSpace(LUNAddress logical_unit_number_address, NonnullLockRefPtrVector queues, size_t max_addresable_block, size_t lba_size, size_t major_number, size_t minor_number, u16 nsid, NonnullOwnPtr dev_name) : StorageDevice(logical_unit_number_address, major_number, minor_number, lba_size, max_addresable_block, move(dev_name)) , m_nsid(nsid) , m_queues(move(queues)) diff --git a/Kernel/Storage/NVMe/NVMeNameSpace.h b/Kernel/Storage/NVMe/NVMeNameSpace.h index b6df088a62..150f94172e 100644 --- a/Kernel/Storage/NVMe/NVMeNameSpace.h +++ b/Kernel/Storage/NVMe/NVMeNameSpace.h @@ -7,11 +7,11 @@ #pragma once #include "AK/kmalloc.h" -#include -#include #include -#include #include +#include +#include +#include #include #include #include @@ -24,16 +24,16 @@ class NVMeNameSpace : public StorageDevice { friend class DeviceManagement; public: - static ErrorOr> try_create(NVMeController const&, NonnullRefPtrVector queues, u8 controller_id, u16 nsid, size_t storage_size, size_t lba_size); + static ErrorOr> try_create(NVMeController const&, NonnullLockRefPtrVector queues, u8 controller_id, u16 nsid, size_t storage_size, size_t lba_size); CommandSet command_set() const override { return CommandSet::NVMe; }; void start_request(AsyncBlockDeviceRequest& request) override; private: - NVMeNameSpace(LUNAddress, NonnullRefPtrVector queues, size_t storage_size, size_t lba_size, size_t major_number, size_t minor_number, u16 nsid, NonnullOwnPtr early_device_name); + NVMeNameSpace(LUNAddress, NonnullLockRefPtrVector queues, size_t storage_size, size_t lba_size, size_t major_number, size_t minor_number, u16 nsid, NonnullOwnPtr early_device_name); u16 m_nsid; - NonnullRefPtrVector m_queues; + NonnullLockRefPtrVector m_queues; }; } diff --git a/Kernel/Storage/NVMe/NVMePollQueue.cpp b/Kernel/Storage/NVMe/NVMePollQueue.cpp index 7219034666..fa9aec2496 100644 --- a/Kernel/Storage/NVMe/NVMePollQueue.cpp +++ b/Kernel/Storage/NVMe/NVMePollQueue.cpp @@ -10,7 +10,7 @@ #include "NVMeDefinitions.h" namespace Kernel { -UNMAP_AFTER_INIT NVMePollQueue::NVMePollQueue(NonnullOwnPtr rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr cq_dma_region, NonnullRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullRefPtrVector sq_dma_page, Memory::TypedMapping db_regs) +UNMAP_AFTER_INIT NVMePollQueue::NVMePollQueue(NonnullOwnPtr rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr cq_dma_region, NonnullLockRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullLockRefPtrVector sq_dma_page, Memory::TypedMapping db_regs) : NVMeQueue(move(rw_dma_region), rw_dma_page, qid, q_depth, move(cq_dma_region), cq_dma_page, move(sq_dma_region), sq_dma_page, move(db_regs)) { } diff --git a/Kernel/Storage/NVMe/NVMePollQueue.h b/Kernel/Storage/NVMe/NVMePollQueue.h index 458f11c14f..8a68881309 100644 --- a/Kernel/Storage/NVMe/NVMePollQueue.h +++ b/Kernel/Storage/NVMe/NVMePollQueue.h @@ -12,7 +12,7 @@ namespace Kernel { class NVMePollQueue : public NVMeQueue { public: - NVMePollQueue(NonnullOwnPtr rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr cq_dma_region, NonnullRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullRefPtrVector sq_dma_page, Memory::TypedMapping db_regs); + NVMePollQueue(NonnullOwnPtr rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr cq_dma_region, NonnullLockRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullLockRefPtrVector sq_dma_page, Memory::TypedMapping db_regs); void submit_sqe(NVMeSubmission& submission) override; virtual ~NVMePollQueue() override {}; diff --git a/Kernel/Storage/NVMe/NVMeQueue.cpp b/Kernel/Storage/NVMe/NVMeQueue.cpp index 1892f6e6f8..b160e86d57 100644 --- a/Kernel/Storage/NVMe/NVMeQueue.cpp +++ b/Kernel/Storage/NVMe/NVMeQueue.cpp @@ -13,20 +13,20 @@ #include namespace Kernel { -ErrorOr> NVMeQueue::try_create(u16 qid, Optional irq, u32 q_depth, OwnPtr cq_dma_region, NonnullRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullRefPtrVector sq_dma_page, Memory::TypedMapping db_regs) +ErrorOr> NVMeQueue::try_create(u16 qid, Optional irq, u32 q_depth, OwnPtr cq_dma_region, NonnullLockRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullLockRefPtrVector sq_dma_page, Memory::TypedMapping db_regs) { // Note: Allocate DMA region for RW operation. For now the requests don't exceed more than 4096 bytes (Storage device takes care of it) - RefPtr rw_dma_page; + LockRefPtr rw_dma_page; auto rw_dma_region = TRY(MM.allocate_dma_buffer_page("NVMe Queue Read/Write DMA"sv, Memory::Region::Access::ReadWrite, rw_dma_page)); if (!irq.has_value()) { - auto queue = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) NVMePollQueue(move(rw_dma_region), *rw_dma_page, qid, q_depth, move(cq_dma_region), cq_dma_page, move(sq_dma_region), sq_dma_page, move(db_regs)))); + auto queue = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) NVMePollQueue(move(rw_dma_region), *rw_dma_page, qid, q_depth, move(cq_dma_region), cq_dma_page, move(sq_dma_region), sq_dma_page, move(db_regs)))); return queue; } - auto queue = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) NVMeInterruptQueue(move(rw_dma_region), *rw_dma_page, qid, irq.value(), q_depth, move(cq_dma_region), cq_dma_page, move(sq_dma_region), sq_dma_page, move(db_regs)))); + auto queue = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) NVMeInterruptQueue(move(rw_dma_region), *rw_dma_page, qid, irq.value(), q_depth, move(cq_dma_region), cq_dma_page, move(sq_dma_region), sq_dma_page, move(db_regs)))); return queue; } -UNMAP_AFTER_INIT NVMeQueue::NVMeQueue(NonnullOwnPtr rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr cq_dma_region, NonnullRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullRefPtrVector sq_dma_page, Memory::TypedMapping db_regs) +UNMAP_AFTER_INIT NVMeQueue::NVMeQueue(NonnullOwnPtr rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr cq_dma_region, NonnullLockRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullLockRefPtrVector sq_dma_page, Memory::TypedMapping db_regs) : m_current_request(nullptr) , m_rw_dma_region(move(rw_dma_region)) , m_qid(qid) diff --git a/Kernel/Storage/NVMe/NVMeQueue.h b/Kernel/Storage/NVMe/NVMeQueue.h index aa0e3727dc..7f1a792079 100644 --- a/Kernel/Storage/NVMe/NVMeQueue.h +++ b/Kernel/Storage/NVMe/NVMeQueue.h @@ -7,13 +7,13 @@ #pragma once #include -#include -#include #include -#include #include #include #include +#include +#include +#include #include #include #include @@ -29,7 +29,7 @@ struct DoorbellRegister { class AsyncBlockDeviceRequest; class NVMeQueue : public AtomicRefCounted { public: - static ErrorOr> try_create(u16 qid, Optional irq, u32 q_depth, OwnPtr cq_dma_region, NonnullRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullRefPtrVector sq_dma_page, Memory::TypedMapping db_regs); + static ErrorOr> try_create(u16 qid, Optional irq, u32 q_depth, OwnPtr cq_dma_region, NonnullLockRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullLockRefPtrVector sq_dma_page, Memory::TypedMapping 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 rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr cq_dma_region, NonnullRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullRefPtrVector sq_dma_page, Memory::TypedMapping db_regs); + NVMeQueue(NonnullOwnPtr rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr cq_dma_region, NonnullLockRefPtrVector cq_dma_page, OwnPtr sq_dma_region, NonnullLockRefPtrVector sq_dma_page, Memory::TypedMapping db_regs); private: bool cqe_available(); @@ -56,7 +56,7 @@ private: protected: Spinlock m_cq_lock { LockRank::Interrupts }; - RefPtr m_current_request; + LockRefPtr m_current_request; NonnullOwnPtr m_rw_dma_region; Spinlock m_request_lock { LockRank::None }; @@ -70,12 +70,12 @@ private: u32 m_qdepth {}; Spinlock m_sq_lock { LockRank::Interrupts }; OwnPtr m_cq_dma_region; - NonnullRefPtrVector m_cq_dma_page; + NonnullLockRefPtrVector m_cq_dma_page; Span m_sqe_array; OwnPtr m_sq_dma_region; - NonnullRefPtrVector m_sq_dma_page; + NonnullLockRefPtrVector m_sq_dma_page; Span m_cqe_array; Memory::TypedMapping m_db_regs; - NonnullRefPtr m_rw_dma_page; + NonnullLockRefPtr m_rw_dma_page; }; } diff --git a/Kernel/Storage/Ramdisk/Controller.cpp b/Kernel/Storage/Ramdisk/Controller.cpp index 45de8cde44..701f87a9a0 100644 --- a/Kernel/Storage/Ramdisk/Controller.cpp +++ b/Kernel/Storage/Ramdisk/Controller.cpp @@ -5,15 +5,15 @@ */ #include -#include #include +#include #include namespace Kernel { -NonnullRefPtr RamdiskController::initialize() +NonnullLockRefPtr RamdiskController::initialize() { - return adopt_ref(*new RamdiskController()); + return adopt_lock_ref(*new RamdiskController()); } bool RamdiskController::reset() @@ -57,7 +57,7 @@ RamdiskController::RamdiskController() RamdiskController::~RamdiskController() = default; -RefPtr RamdiskController::device(u32 index) const +LockRefPtr RamdiskController::device(u32 index) const { if (index >= m_devices.size()) return nullptr; diff --git a/Kernel/Storage/Ramdisk/Controller.h b/Kernel/Storage/Ramdisk/Controller.h index 879c18adfc..56c31a0c03 100644 --- a/Kernel/Storage/Ramdisk/Controller.h +++ b/Kernel/Storage/Ramdisk/Controller.h @@ -7,8 +7,8 @@ #pragma once #include -#include #include +#include #include #include #include @@ -19,10 +19,10 @@ class AsyncBlockDeviceRequest; class RamdiskController final : public StorageController { public: - static NonnullRefPtr initialize(); + static NonnullLockRefPtr initialize(); virtual ~RamdiskController() override; - virtual RefPtr device(u32 index) const override; + virtual LockRefPtr device(u32 index) const override; virtual bool reset() override; virtual bool shutdown() override; virtual size_t devices_count() const override; @@ -31,6 +31,6 @@ public: private: RamdiskController(); - NonnullRefPtrVector m_devices; + NonnullLockRefPtrVector m_devices; }; } diff --git a/Kernel/Storage/Ramdisk/Device.cpp b/Kernel/Storage/Ramdisk/Device.cpp index d888137706..b1ae1a7d1a 100644 --- a/Kernel/Storage/Ramdisk/Device.cpp +++ b/Kernel/Storage/Ramdisk/Device.cpp @@ -13,7 +13,7 @@ namespace Kernel { -NonnullRefPtr RamdiskDevice::create(RamdiskController const& controller, NonnullOwnPtr&& region, int major, int minor) +NonnullLockRefPtr RamdiskDevice::create(RamdiskController const& controller, NonnullOwnPtr&& region, int major, int minor) { auto device_name = MUST(KString::formatted("ramdisk{}", minor)); diff --git a/Kernel/Storage/Ramdisk/Device.h b/Kernel/Storage/Ramdisk/Device.h index 0e4ef6cca9..c99ecba111 100644 --- a/Kernel/Storage/Ramdisk/Device.h +++ b/Kernel/Storage/Ramdisk/Device.h @@ -18,7 +18,7 @@ class RamdiskDevice final : public StorageDevice { friend class DeviceManagement; public: - static NonnullRefPtr create(RamdiskController const&, NonnullOwnPtr&& region, int major, int minor); + static NonnullLockRefPtr create(RamdiskController const&, NonnullOwnPtr&& region, int major, int minor); virtual ~RamdiskDevice() override; // ^DiskDevice diff --git a/Kernel/Storage/StorageController.h b/Kernel/Storage/StorageController.h index f89b41317a..dd7d73102c 100644 --- a/Kernel/Storage/StorageController.h +++ b/Kernel/Storage/StorageController.h @@ -7,10 +7,10 @@ #pragma once #include -#include #include #include #include +#include #include #include #include @@ -26,7 +26,7 @@ class StorageController : public AtomicRefCounted { public: virtual ~StorageController() = default; - virtual RefPtr device(u32 index) const = 0; + virtual LockRefPtr device(u32 index) const = 0; virtual size_t devices_count() const = 0; u32 controller_id() const { return m_controller_id; } diff --git a/Kernel/Storage/StorageDevice.h b/Kernel/Storage/StorageDevice.h index 8a070612f2..feac7f4a06 100644 --- a/Kernel/Storage/StorageDevice.h +++ b/Kernel/Storage/StorageDevice.h @@ -66,9 +66,9 @@ public: // FIXME: Remove this method after figuring out another scheme for naming. StringView early_storage_name() const; - NonnullRefPtrVector const& partitions() const { return m_partitions; } + NonnullLockRefPtrVector const& partitions() const { return m_partitions; } - void add_partition(NonnullRefPtr disk_partition) { MUST(m_partitions.try_append(disk_partition)); } + void add_partition(NonnullLockRefPtr disk_partition) { MUST(m_partitions.try_append(disk_partition)); } LUNAddress const& logical_unit_number_address() const { return m_logical_unit_number_address; } @@ -88,8 +88,8 @@ private: virtual void after_inserting() override; virtual void will_be_destroyed() override; - mutable IntrusiveListNode> m_list_node; - NonnullRefPtrVector m_partitions; + mutable IntrusiveListNode> m_list_node; + NonnullLockRefPtrVector m_partitions; // FIXME: Remove this method after figuring out another scheme for naming. NonnullOwnPtr m_early_storage_device_name; diff --git a/Kernel/Storage/StorageManagement.cpp b/Kernel/Storage/StorageManagement.cpp index 2e5691849b..50fefd7bbc 100644 --- a/Kernel/Storage/StorageManagement.cpp +++ b/Kernel/Storage/StorageManagement.cpp @@ -230,7 +230,7 @@ UNMAP_AFTER_INIT void StorageManagement::determine_boot_device_with_partition_uu } } -RefPtr StorageManagement::boot_block_device() const +LockRefPtr StorageManagement::boot_block_device() const { return m_boot_block_device.strong_ref(); } @@ -254,7 +254,7 @@ u32 StorageManagement::generate_controller_id() return s_controller_id.fetch_add(1); } -NonnullRefPtr StorageManagement::root_filesystem() const +NonnullLockRefPtr StorageManagement::root_filesystem() const { auto boot_device_description = boot_block_device(); if (!boot_device_description) { diff --git a/Kernel/Storage/StorageManagement.h b/Kernel/Storage/StorageManagement.h index 0e6f43b310..238dfe9055 100644 --- a/Kernel/Storage/StorageManagement.h +++ b/Kernel/Storage/StorageManagement.h @@ -7,10 +7,10 @@ #pragma once #include -#include -#include #include #include +#include +#include #include #include #include @@ -26,7 +26,7 @@ public: void initialize(StringView boot_argument, bool force_pio, bool nvme_poll); static StorageManagement& the(); - NonnullRefPtr root_filesystem() const; + NonnullLockRefPtr root_filesystem() const; static MajorNumber storage_type_major_number(); static MinorNumber generate_storage_minor_number(); @@ -51,11 +51,11 @@ private: ErrorOr> try_to_initialize_partition_table(StorageDevice const&) const; - RefPtr boot_block_device() const; + LockRefPtr boot_block_device() const; StringView m_boot_argument; - WeakPtr m_boot_block_device; - NonnullRefPtrVector m_controllers; + LockWeakPtr m_boot_block_device; + NonnullLockRefPtrVector m_controllers; IntrusiveList<&StorageDevice::m_list_node> m_storage_devices; }; diff --git a/Kernel/Syscalls/alarm.cpp b/Kernel/Syscalls/alarm.cpp index 52f730cf80..2ff757cd4d 100644 --- a/Kernel/Syscalls/alarm.cpp +++ b/Kernel/Syscalls/alarm.cpp @@ -31,7 +31,7 @@ ErrorOr Process::sys$alarm(unsigned seconds) auto deadline = TimeManagement::the().current_time(CLOCK_REALTIME_COARSE); deadline = deadline + Time::from_seconds(seconds); if (!m_alarm_timer) { - m_alarm_timer = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) Timer)); + m_alarm_timer = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) Timer)); } auto timer_was_added = TimerQueue::the().add_timer_without_id(*m_alarm_timer, CLOCK_REALTIME_COARSE, deadline, [this]() { MUST(send_signal(SIGALRM, nullptr)); diff --git a/Kernel/Syscalls/chdir.cpp b/Kernel/Syscalls/chdir.cpp index 852392358b..445a4fc03e 100644 --- a/Kernel/Syscalls/chdir.cpp +++ b/Kernel/Syscalls/chdir.cpp @@ -15,10 +15,10 @@ ErrorOr Process::sys$chdir(Userspace user_path, size_t pat VERIFY_NO_PROCESS_BIG_LOCK(this); TRY(require_promise(Pledge::rpath)); auto path = TRY(get_syscall_path_argument(user_path, path_length)); - auto current_directory = m_current_directory.with([](auto& current_directory) -> NonnullRefPtr { + auto current_directory = m_current_directory.with([](auto& current_directory) -> NonnullLockRefPtr { return *current_directory; }); - RefPtr new_directory = TRY(VirtualFileSystem::the().open_directory(path->view(), *current_directory)); + LockRefPtr new_directory = TRY(VirtualFileSystem::the().open_directory(path->view(), *current_directory)); m_current_directory.with([&](auto& current_directory) { // NOTE: We use swap() here to avoid manipulating the ref counts while holding the lock. swap(current_directory, new_directory); diff --git a/Kernel/Syscalls/chmod.cpp b/Kernel/Syscalls/chmod.cpp index c1f2e2fc8d..564b87a61e 100644 --- a/Kernel/Syscalls/chmod.cpp +++ b/Kernel/Syscalls/chmod.cpp @@ -18,7 +18,7 @@ ErrorOr Process::sys$chmod(Userspace u auto params = TRY(copy_typed_from_user(user_params)); auto path = TRY(get_syscall_path_argument(params.path)); - RefPtr base; + LockRefPtr base; if (params.dirfd == AT_FDCWD) { base = current_directory(); } else { diff --git a/Kernel/Syscalls/chown.cpp b/Kernel/Syscalls/chown.cpp index b58919c53d..70c49b2876 100644 --- a/Kernel/Syscalls/chown.cpp +++ b/Kernel/Syscalls/chown.cpp @@ -4,9 +4,9 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include #include #include +#include #include namespace Kernel { @@ -27,7 +27,7 @@ ErrorOr Process::sys$chown(Userspace u auto params = TRY(copy_typed_from_user(user_params)); auto path = TRY(get_syscall_path_argument(params.path)); - RefPtr base; + LockRefPtr base; if (params.dirfd == AT_FDCWD) { base = current_directory(); } else { diff --git a/Kernel/Syscalls/execve.cpp b/Kernel/Syscalls/execve.cpp index 795d1b2aa3..9e2eb436cd 100644 --- a/Kernel/Syscalls/execve.cpp +++ b/Kernel/Syscalls/execve.cpp @@ -7,10 +7,10 @@ #include #include -#include #include #include #include +#include #include #include #include @@ -36,10 +36,10 @@ struct LoadResult { FlatPtr load_base { 0 }; FlatPtr entry_eip { 0 }; size_t size { 0 }; - WeakPtr tls_region; + LockWeakPtr tls_region; size_t tls_size { 0 }; size_t tls_alignment { 0 }; - WeakPtr stack_region; + LockWeakPtr stack_region; }; static constexpr size_t auxiliary_vector_size = 15; @@ -410,8 +410,8 @@ static ErrorOr load_elf_object(NonnullOwnPtr n } ErrorOr -Process::load(NonnullRefPtr main_program_description, - RefPtr interpreter_description, const ElfW(Ehdr) & main_program_header) +Process::load(NonnullLockRefPtr main_program_description, + LockRefPtr interpreter_description, const ElfW(Ehdr) & main_program_header) { auto new_space = TRY(Memory::AddressSpace::try_create(nullptr)); @@ -458,8 +458,8 @@ void Process::clear_signal_handlers_for_exec() } } -ErrorOr Process::do_exec(NonnullRefPtr main_program_description, NonnullOwnPtrVector arguments, NonnullOwnPtrVector environment, - RefPtr interpreter_description, Thread*& new_main_thread, u32& prev_flags, const ElfW(Ehdr) & main_program_header) +ErrorOr Process::do_exec(NonnullLockRefPtr main_program_description, NonnullOwnPtrVector arguments, NonnullOwnPtrVector environment, + LockRefPtr interpreter_description, Thread*& new_main_thread, u32& prev_flags, const ElfW(Ehdr) & main_program_header) { VERIFY(is_user_process()); VERIFY(!Processor::in_critical()); @@ -726,7 +726,7 @@ static ErrorOr> find_shebang_interpreter_for_execut return ENOEXEC; } -ErrorOr> Process::find_elf_interpreter_for_executable(StringView path, ElfW(Ehdr) const& main_executable_header, size_t main_executable_header_size, size_t file_size) +ErrorOr> Process::find_elf_interpreter_for_executable(StringView path, ElfW(Ehdr) const& main_executable_header, size_t main_executable_header_size, size_t file_size) { // Not using ErrorOr here because we'll want to do the same thing in userspace in the RTLD StringBuilder interpreter_path_builder; diff --git a/Kernel/Syscalls/fork.cpp b/Kernel/Syscalls/fork.cpp index 3194db0967..0a7fc74a8d 100644 --- a/Kernel/Syscalls/fork.cpp +++ b/Kernel/Syscalls/fork.cpp @@ -17,7 +17,7 @@ ErrorOr Process::sys$fork(RegisterState& regs) { VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this); TRY(require_promise(Pledge::proc)); - RefPtr child_first_thread; + LockRefPtr child_first_thread; ArmedScopeGuard thread_finalizer_guard = [&child_first_thread]() { SpinlockLocker lock(g_scheduler_lock); diff --git a/Kernel/Syscalls/futex.cpp b/Kernel/Syscalls/futex.cpp index 99b0256a86..8289385065 100644 --- a/Kernel/Syscalls/futex.cpp +++ b/Kernel/Syscalls/futex.cpp @@ -13,7 +13,7 @@ namespace Kernel { -static Singleton>>> s_global_futex_queues; +static Singleton>>> s_global_futex_queues; void Process::clear_futex_queues_on_exec() { @@ -122,16 +122,16 @@ ErrorOr Process::sys$futex(Userspace u } } - auto find_futex_queue = [&](GlobalFutexKey futex_key, bool create_if_not_found, bool* did_create = nullptr) -> ErrorOr> { + auto find_futex_queue = [&](GlobalFutexKey futex_key, bool create_if_not_found, bool* did_create = nullptr) -> ErrorOr> { VERIFY(!create_if_not_found || did_create != nullptr); - return s_global_futex_queues->with([&](auto& queues) -> ErrorOr> { + return s_global_futex_queues->with([&](auto& queues) -> ErrorOr> { auto it = queues.find(futex_key); if (it != queues.end()) return it->value; if (!create_if_not_found) return nullptr; *did_create = true; - auto futex_queue = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) FutexQueue)); + auto futex_queue = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) FutexQueue)); auto result = TRY(queues.try_set(futex_key, futex_queue)); VERIFY(result == AK::HashSetResult::InsertedNewEntry); return futex_queue; @@ -169,7 +169,7 @@ ErrorOr Process::sys$futex(Userspace u auto do_wait = [&](u32 bitset) -> ErrorOr { bool did_create; - RefPtr futex_queue; + LockRefPtr futex_queue; auto futex_key = TRY(get_futex_key(user_address, shared)); do { auto user_value = user_atomic_load_relaxed(params.userspace_address); @@ -216,7 +216,7 @@ ErrorOr Process::sys$futex(Userspace u if (!futex_queue) return 0; - RefPtr target_futex_queue; + LockRefPtr target_futex_queue; bool is_empty = false; bool is_target_empty = false; auto futex_key2 = TRY(get_futex_key(user_address2, shared)); diff --git a/Kernel/Syscalls/mmap.cpp b/Kernel/Syscalls/mmap.cpp index 928700f5e1..aab05f47c2 100644 --- a/Kernel/Syscalls/mmap.cpp +++ b/Kernel/Syscalls/mmap.cpp @@ -203,7 +203,7 @@ ErrorOr Process::sys$mmap(Userspace use if (map_anonymous) { auto strategy = map_noreserve ? AllocationStrategy::None : AllocationStrategy::Reserve; - RefPtr vmobject; + LockRefPtr vmobject; if (flags & MAP_PURGEABLE) { vmobject = TRY(Memory::AnonymousVMObject::try_create_purgeable_with_size(rounded_size, strategy)); } else { @@ -459,7 +459,7 @@ ErrorOr Process::sys$mremap(Userspace auto range = old_region->range(); auto old_prot = region_access_flags_to_prot(old_region->access()); auto old_offset = old_region->offset_in_vmobject(); - NonnullRefPtr inode = static_cast(old_region->vmobject()).inode(); + NonnullLockRefPtr inode = static_cast(old_region->vmobject()).inode(); auto new_vmobject = TRY(Memory::PrivateInodeVMObject::try_create_with_inode(inode)); auto old_name = old_region->take_name(); diff --git a/Kernel/Syscalls/mount.cpp b/Kernel/Syscalls/mount.cpp index 0a78956619..5443e30e8e 100644 --- a/Kernel/Syscalls/mount.cpp +++ b/Kernel/Syscalls/mount.cpp @@ -24,8 +24,8 @@ struct FileSystemInitializer { bool requires_open_file_description { false }; bool requires_block_device { false }; bool requires_seekable_file { false }; - ErrorOr> (*create_with_fd)(OpenFileDescription&) = nullptr; - ErrorOr> (*create)(void) = nullptr; + ErrorOr> (*create_with_fd)(OpenFileDescription&) = nullptr; + ErrorOr> (*create)(void) = nullptr; }; static constexpr FileSystemInitializer s_initializers[] = { @@ -39,14 +39,14 @@ static constexpr FileSystemInitializer s_initializers[] = { { "iso9660"sv, "ISO9660FS"sv, true, true, true, ISO9660FS::try_create, {} }, }; -static ErrorOr> create_filesystem_instance(StringView fs_type, OpenFileDescription* possible_description) +static ErrorOr> create_filesystem_instance(StringView fs_type, OpenFileDescription* possible_description) { for (auto& initializer_entry : s_initializers) { if (fs_type != initializer_entry.short_name && fs_type != initializer_entry.name) continue; if (!initializer_entry.requires_open_file_description) { VERIFY(initializer_entry.create); - NonnullRefPtr fs = TRY(initializer_entry.create()); + NonnullLockRefPtr fs = TRY(initializer_entry.create()); return fs; } VERIFY(initializer_entry.create_with_fd); @@ -60,7 +60,7 @@ static ErrorOr> create_filesystem_instance(StringView dbgln("mount: this is not a seekable file"); return ENODEV; } - NonnullRefPtr fs = TRY(initializer_entry.create_with_fd(description)); + NonnullLockRefPtr fs = TRY(initializer_entry.create_with_fd(description)); return fs; } return ENODEV; @@ -107,7 +107,7 @@ ErrorOr Process::sys$mount(Userspace u return 0; } - RefPtr fs; + LockRefPtr fs; if (!description_or_error.is_error()) { auto description = description_or_error.release_value(); diff --git a/Kernel/Syscalls/open.cpp b/Kernel/Syscalls/open.cpp index 04b8c43443..77294cd0f7 100644 --- a/Kernel/Syscalls/open.cpp +++ b/Kernel/Syscalls/open.cpp @@ -54,7 +54,7 @@ ErrorOr Process::sys$open(Userspace use dbgln_if(IO_DEBUG, "sys$open(dirfd={}, path='{}', options={}, mode={})", dirfd, path->view(), options, mode); auto fd_allocation = TRY(allocate_fd()); - RefPtr base; + LockRefPtr base; if (dirfd == AT_FDCWD) { base = current_directory(); } else { diff --git a/Kernel/Syscalls/poll.cpp b/Kernel/Syscalls/poll.cpp index 68d963ef7b..fd9bfbe7a6 100644 --- a/Kernel/Syscalls/poll.cpp +++ b/Kernel/Syscalls/poll.cpp @@ -50,7 +50,7 @@ ErrorOr Process::sys$poll(Userspace use TRY(m_fds.with_shared([&](auto& fds) -> ErrorOr { for (size_t i = 0; i < params.nfds; i++) { auto& pfd = fds_copy[i]; - RefPtr description; + LockRefPtr description; auto description_or_error = fds.open_file_description(pfd.fd); if (!description_or_error.is_error()) description = description_or_error.release_value(); diff --git a/Kernel/Syscalls/purge.cpp b/Kernel/Syscalls/purge.cpp index e241aa3605..0cf7a5ede2 100644 --- a/Kernel/Syscalls/purge.cpp +++ b/Kernel/Syscalls/purge.cpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include +#include #include #include #include @@ -20,7 +20,7 @@ ErrorOr Process::sys$purge(int mode) return EPERM; size_t purged_page_count = 0; if (mode & PURGE_ALL_VOLATILE) { - NonnullRefPtrVector vmobjects; + NonnullLockRefPtrVector vmobjects; { ErrorOr result; Memory::MemoryManager::for_each_vmobject([&](auto& vmobject) { @@ -43,7 +43,7 @@ ErrorOr Process::sys$purge(int mode) } } if (mode & PURGE_ALL_CLEAN_INODE) { - NonnullRefPtrVector vmobjects; + NonnullLockRefPtrVector vmobjects; { ErrorOr result; Memory::MemoryManager::for_each_vmobject([&](auto& vmobject) { diff --git a/Kernel/Syscalls/read.cpp b/Kernel/Syscalls/read.cpp index 06253ce9ab..f272b0c6de 100644 --- a/Kernel/Syscalls/read.cpp +++ b/Kernel/Syscalls/read.cpp @@ -13,7 +13,7 @@ namespace Kernel { using BlockFlags = Thread::FileBlocker::BlockFlags; -static ErrorOr> open_readable_file_description(auto& fds, int fd) +static ErrorOr> open_readable_file_description(auto& fds, int fd) { auto description = TRY(fds.with_shared([&](auto& fds) { return fds.open_file_description(fd); })); if (!description->is_readable()) diff --git a/Kernel/Syscalls/socket.cpp b/Kernel/Syscalls/socket.cpp index fa9114a3d7..f0491f1096 100644 --- a/Kernel/Syscalls/socket.cpp +++ b/Kernel/Syscalls/socket.cpp @@ -19,7 +19,7 @@ namespace Kernel { TRY(require_promise(Pledge::unix)); \ } while (0) -static void setup_socket_fd(Process::OpenFileDescriptions& fds, int fd, NonnullRefPtr description, int type) +static void setup_socket_fd(Process::OpenFileDescriptions& fds, int fd, NonnullLockRefPtr description, int type) { description->set_readable(true); description->set_writable(true); @@ -92,7 +92,7 @@ ErrorOr Process::sys$accept4(Userspace(user_address_size))); ScopedDescriptionAllocation fd_allocation; - RefPtr accepting_socket_description; + LockRefPtr accepting_socket_description; TRY(m_fds.with_exclusive([&](auto& fds) -> ErrorOr { fd_allocation = TRY(fds.allocate()); @@ -103,7 +103,7 @@ ErrorOr Process::sys$accept4(Userspacesocket(); - RefPtr accepted_socket; + LockRefPtr accepted_socket; for (;;) { accepted_socket = socket.accept(); if (accepted_socket) diff --git a/Kernel/Syscalls/stat.cpp b/Kernel/Syscalls/stat.cpp index bff2b782a4..39eea5b7e9 100644 --- a/Kernel/Syscalls/stat.cpp +++ b/Kernel/Syscalls/stat.cpp @@ -4,9 +4,9 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#include #include #include +#include #include namespace Kernel { @@ -29,7 +29,7 @@ ErrorOr Process::sys$stat(Userspace use auto path = TRY(get_syscall_path_argument(params.path)); - RefPtr base; + LockRefPtr base; if (params.dirfd == AT_FDCWD) { base = current_directory(); } else { diff --git a/Kernel/Syscalls/unlink.cpp b/Kernel/Syscalls/unlink.cpp index 5f3a62330e..21a5edbc3c 100644 --- a/Kernel/Syscalls/unlink.cpp +++ b/Kernel/Syscalls/unlink.cpp @@ -19,7 +19,7 @@ ErrorOr Process::sys$unlink(int dirfd, Userspace user_path if (flags & ~AT_REMOVEDIR) return Error::from_errno(EINVAL); - RefPtr base; + LockRefPtr base; if (dirfd == AT_FDCWD) { base = current_directory(); } else { diff --git a/Kernel/Syscalls/unveil.cpp b/Kernel/Syscalls/unveil.cpp index 4ffb3cc73a..a993f00952 100644 --- a/Kernel/Syscalls/unveil.cpp +++ b/Kernel/Syscalls/unveil.cpp @@ -79,7 +79,7 @@ ErrorOr Process::sys$unveil(Userspace // However, if the user specified unveil() with "c" permissions, we don't set errno if ENOENT is encountered, // because they most likely intend the program to create the file for them later on. // If this case is encountered, the parent node of the path is returned and the custody of that inode is used instead. - RefPtr parent_custody; // Parent inode in case of ENOENT + LockRefPtr parent_custody; // Parent inode in case of ENOENT OwnPtr new_unveiled_path; auto custody_or_error = VirtualFileSystem::the().resolve_path_without_veil(path->view(), VirtualFileSystem::the().root_custody(), &parent_custody); if (!custody_or_error.is_error()) { diff --git a/Kernel/Syscalls/utimensat.cpp b/Kernel/Syscalls/utimensat.cpp index 1cd3760bb0..45bfd1cb1b 100644 --- a/Kernel/Syscalls/utimensat.cpp +++ b/Kernel/Syscalls/utimensat.cpp @@ -40,8 +40,8 @@ ErrorOr Process::sys$utimensat(Userspace path; - RefPtr description; - RefPtr base; + LockRefPtr description; + LockRefPtr base; auto path_or_error = get_syscall_path_argument(params.path); if (path_or_error.is_error()) { diff --git a/Kernel/Syscalls/waitid.cpp b/Kernel/Syscalls/waitid.cpp index ac3e7c500b..d8f9367d90 100644 --- a/Kernel/Syscalls/waitid.cpp +++ b/Kernel/Syscalls/waitid.cpp @@ -10,7 +10,7 @@ namespace Kernel { -ErrorOr Process::do_waitid(Variant, NonnullRefPtr> waitee, int options) +ErrorOr Process::do_waitid(Variant, NonnullLockRefPtr> waitee, int options) { ErrorOr result = siginfo_t {}; if (Thread::current()->block({}, options, move(waitee), result).was_interrupted()) @@ -25,7 +25,7 @@ ErrorOr Process::sys$waitid(Userspace TRY(require_promise(Pledge::proc)); auto params = TRY(copy_typed_from_user(user_params)); - Variant, NonnullRefPtr> waitee; + Variant, NonnullLockRefPtr> waitee; switch (params.idtype) { case P_ALL: break; diff --git a/Kernel/TTY/ConsoleManagement.h b/Kernel/TTY/ConsoleManagement.h index c2a79176a7..ed890d85a9 100644 --- a/Kernel/TTY/ConsoleManagement.h +++ b/Kernel/TTY/ConsoleManagement.h @@ -6,9 +6,9 @@ #pragma once -#include -#include #include +#include +#include #include namespace Kernel { @@ -31,13 +31,13 @@ public: void switch_to_debug() { switch_to(1); } - NonnullRefPtr first_tty() const { return m_consoles[0]; } - NonnullRefPtr debug_tty() const { return m_consoles[1]; } + NonnullLockRefPtr first_tty() const { return m_consoles[0]; } + NonnullLockRefPtr debug_tty() const { return m_consoles[1]; } RecursiveSpinlock& tty_write_lock() { return m_tty_write_lock; } private: - NonnullRefPtrVector m_consoles; + NonnullLockRefPtrVector m_consoles; VirtualConsole* m_active_console { nullptr }; Spinlock m_lock { LockRank::None }; RecursiveSpinlock m_tty_write_lock { LockRank::None }; diff --git a/Kernel/TTY/MasterPTY.cpp b/Kernel/TTY/MasterPTY.cpp index 4de08e07a1..c286a1765c 100644 --- a/Kernel/TTY/MasterPTY.cpp +++ b/Kernel/TTY/MasterPTY.cpp @@ -16,11 +16,11 @@ namespace Kernel { -ErrorOr> MasterPTY::try_create(unsigned int index) +ErrorOr> MasterPTY::try_create(unsigned int index) { auto buffer = TRY(DoubleBuffer::try_create("MasterPTY: Buffer"sv)); - auto master_pty = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) MasterPTY(index, move(buffer)))); - auto slave_pty = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) SlavePTY(*master_pty, index))); + auto master_pty = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) MasterPTY(index, move(buffer)))); + auto slave_pty = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) SlavePTY(*master_pty, index))); master_pty->m_slave = slave_pty; master_pty->after_inserting(); slave_pty->after_inserting(); diff --git a/Kernel/TTY/MasterPTY.h b/Kernel/TTY/MasterPTY.h index 45528fb5c3..edb7fb3b34 100644 --- a/Kernel/TTY/MasterPTY.h +++ b/Kernel/TTY/MasterPTY.h @@ -16,7 +16,7 @@ class SlavePTY; class MasterPTY final : public CharacterDevice { public: - static ErrorOr> try_create(unsigned index); + static ErrorOr> try_create(unsigned index); virtual ~MasterPTY() override; unsigned index() const { return m_index; } @@ -39,7 +39,7 @@ private: virtual ErrorOr ioctl(OpenFileDescription&, unsigned request, Userspace arg) override; virtual StringView class_name() const override { return "MasterPTY"sv; } - RefPtr m_slave; + LockRefPtr m_slave; unsigned m_index; bool m_closed { false }; NonnullOwnPtr m_buffer; diff --git a/Kernel/TTY/PTYMultiplexer.cpp b/Kernel/TTY/PTYMultiplexer.cpp index 4e64577cce..d831926e58 100644 --- a/Kernel/TTY/PTYMultiplexer.cpp +++ b/Kernel/TTY/PTYMultiplexer.cpp @@ -38,9 +38,9 @@ UNMAP_AFTER_INIT void PTYMultiplexer::initialize() the().after_inserting(); } -ErrorOr> PTYMultiplexer::open(int options) +ErrorOr> PTYMultiplexer::open(int options) { - return m_freelist.with([&](auto& freelist) -> ErrorOr> { + return m_freelist.with([&](auto& freelist) -> ErrorOr> { if (freelist.is_empty()) return EBUSY; diff --git a/Kernel/TTY/PTYMultiplexer.h b/Kernel/TTY/PTYMultiplexer.h index 0955fd68dc..18c21e1000 100644 --- a/Kernel/TTY/PTYMultiplexer.h +++ b/Kernel/TTY/PTYMultiplexer.h @@ -22,7 +22,7 @@ public: static PTYMultiplexer& the(); // ^CharacterDevice - virtual ErrorOr> open(int options) override; + virtual ErrorOr> open(int options) override; virtual ErrorOr read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override { return 0; } virtual ErrorOr write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override { return 0; } virtual bool can_read(OpenFileDescription const&, u64) const override { return true; } diff --git a/Kernel/TTY/SlavePTY.h b/Kernel/TTY/SlavePTY.h index 0901034ec6..15c0862674 100644 --- a/Kernel/TTY/SlavePTY.h +++ b/Kernel/TTY/SlavePTY.h @@ -41,7 +41,7 @@ private: friend class MasterPTY; SlavePTY(MasterPTY&, unsigned index); - RefPtr m_master; + LockRefPtr m_master; time_t m_time_of_last_write { 0 }; unsigned m_index { 0 }; diff --git a/Kernel/TTY/TTY.h b/Kernel/TTY/TTY.h index 76a811373a..9fcdc6fcab 100644 --- a/Kernel/TTY/TTY.h +++ b/Kernel/TTY/TTY.h @@ -7,9 +7,9 @@ #pragma once #include -#include #include #include +#include #include #include @@ -89,8 +89,8 @@ private: // FIXME: use something like AK::Bitmap but which takes a size template parameter u8 m_special_character_bitmask[TTY_BUFFER_SIZE / 8]; - WeakPtr m_original_process_parent; - WeakPtr m_pg; + LockWeakPtr m_original_process_parent; + LockWeakPtr m_pg; termios m_termios; unsigned short m_rows { 0 }; unsigned short m_columns { 0 }; diff --git a/Kernel/TTY/VirtualConsole.cpp b/Kernel/TTY/VirtualConsole.cpp index 16986626fd..707a1814ad 100644 --- a/Kernel/TTY/VirtualConsole.cpp +++ b/Kernel/TTY/VirtualConsole.cpp @@ -107,7 +107,7 @@ ErrorOr> VirtualConsole::pseudo_name() const return KString::formatted("tty:{}", m_index); } -UNMAP_AFTER_INIT NonnullRefPtr VirtualConsole::create(size_t index) +UNMAP_AFTER_INIT NonnullLockRefPtr VirtualConsole::create(size_t index) { auto virtual_console_or_error = DeviceManagement::try_create_device(index); // FIXME: Find a way to propagate errors @@ -115,7 +115,7 @@ UNMAP_AFTER_INIT NonnullRefPtr VirtualConsole::create(size_t ind return virtual_console_or_error.release_value(); } -UNMAP_AFTER_INIT NonnullRefPtr VirtualConsole::create_with_preset_log(size_t index, CircularQueue const& log) +UNMAP_AFTER_INIT NonnullLockRefPtr VirtualConsole::create_with_preset_log(size_t index, CircularQueue const& log) { auto virtual_console = VirtualConsole::create(index); // HACK: We have to go through the TTY layer for correct newline handling. diff --git a/Kernel/TTY/VirtualConsole.h b/Kernel/TTY/VirtualConsole.h index ed4f307dff..402ce75ea0 100644 --- a/Kernel/TTY/VirtualConsole.h +++ b/Kernel/TTY/VirtualConsole.h @@ -69,8 +69,8 @@ public: }; public: - static NonnullRefPtr create(size_t index); - static NonnullRefPtr create_with_preset_log(size_t index, CircularQueue const&); + static NonnullLockRefPtr create(size_t index); + static NonnullLockRefPtr create_with_preset_log(size_t index, CircularQueue const&); virtual ~VirtualConsole() override; diff --git a/Kernel/Tasks/FinalizerTask.cpp b/Kernel/Tasks/FinalizerTask.cpp index bf63e9388d..eaf219cbff 100644 --- a/Kernel/Tasks/FinalizerTask.cpp +++ b/Kernel/Tasks/FinalizerTask.cpp @@ -28,7 +28,7 @@ static void finalizer_task(void*) UNMAP_AFTER_INIT void FinalizerTask::spawn() { - RefPtr finalizer_thread; + LockRefPtr finalizer_thread; auto finalizer_process = Process::create_kernel_process(finalizer_thread, KString::must_create(finalizer_task_name), finalizer_task, nullptr); VERIFY(finalizer_process); g_finalizer = finalizer_thread; diff --git a/Kernel/Tasks/SyncTask.cpp b/Kernel/Tasks/SyncTask.cpp index d895df2c0b..cd2354dcbd 100644 --- a/Kernel/Tasks/SyncTask.cpp +++ b/Kernel/Tasks/SyncTask.cpp @@ -14,7 +14,7 @@ namespace Kernel { UNMAP_AFTER_INIT void SyncTask::spawn() { - RefPtr syncd_thread; + LockRefPtr syncd_thread; (void)Process::create_kernel_process(syncd_thread, KString::must_create("VFS Sync Task"sv), [] { dbgln("VFS SyncTask is running"); for (;;) { diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index 9aa7537a96..91b38eb34f 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -40,18 +40,18 @@ SpinlockProtected& Thread::all_instances() return *s_list; } -ErrorOr> Thread::try_create(NonnullRefPtr process) +ErrorOr> Thread::try_create(NonnullLockRefPtr process) { auto kernel_stack_region = TRY(MM.allocate_kernel_region(default_kernel_stack_size, {}, Memory::Region::Access::ReadWrite, AllocationStrategy::AllocateNow)); kernel_stack_region->set_stack(true); - auto block_timer = TRY(try_make_ref_counted()); + auto block_timer = TRY(try_make_lock_ref_counted()); auto name = TRY(KString::try_create(process->name())); - return adopt_nonnull_ref_or_enomem(new (nothrow) Thread(move(process), move(kernel_stack_region), move(block_timer), move(name))); + return adopt_nonnull_lock_ref_or_enomem(new (nothrow) Thread(move(process), move(kernel_stack_region), move(block_timer), move(name))); } -Thread::Thread(NonnullRefPtr process, NonnullOwnPtr kernel_stack_region, NonnullRefPtr block_timer, NonnullOwnPtr name) +Thread::Thread(NonnullLockRefPtr process, NonnullOwnPtr kernel_stack_region, NonnullLockRefPtr block_timer, NonnullOwnPtr name) : m_process(move(process)) , m_kernel_stack_region(move(kernel_stack_region)) , m_name(move(name)) @@ -632,7 +632,7 @@ void Thread::finalize_dying_threads() }); } for (auto* thread : dying_threads) { - RefPtr process = thread->process(); + LockRefPtr process = thread->process(); dbgln_if(PROCESS_DEBUG, "Before finalization, {} has {} refs and its process has {}", *thread, thread->ref_count(), thread->process().ref_count()); thread->finalize(); @@ -1251,7 +1251,7 @@ RegisterState& Thread::get_register_dump_from_stack() return *trap->regs; } -ErrorOr> Thread::try_clone(Process& process) +ErrorOr> Thread::try_clone(Process& process) { auto clone = TRY(Thread::try_create(process)); m_signal_action_masks.span().copy_to(clone->m_signal_action_masks); @@ -1427,9 +1427,9 @@ ErrorOr Thread::make_thread_specific_region(Badge) return {}; } -RefPtr Thread::from_tid(ThreadID tid) +LockRefPtr Thread::from_tid(ThreadID tid) { - return Thread::all_instances().with([&](auto& list) -> RefPtr { + return Thread::all_instances().with([&](auto& list) -> LockRefPtr { for (Thread& thread : list) { if (thread.tid() == tid) return thread; diff --git a/Kernel/Thread.h b/Kernel/Thread.h index 9166c9e1d6..0d6fab2639 100644 --- a/Kernel/Thread.h +++ b/Kernel/Thread.h @@ -15,13 +15,13 @@ #include #include #include -#include -#include #include #include #include #include #include +#include +#include #include #include #include @@ -137,7 +137,7 @@ struct ThreadRegisters { class Thread : public ListedRefCounted - , public Weakable { + , public LockWeakable { AK_MAKE_NONCOPYABLE(Thread); AK_MAKE_NONMOVABLE(Thread); @@ -152,10 +152,10 @@ public: return Processor::current_thread(); } - static ErrorOr> try_create(NonnullRefPtr); + static ErrorOr> try_create(NonnullLockRefPtr); ~Thread(); - static RefPtr from_tid(ThreadID); + static LockRefPtr from_tid(ThreadID); static void finalize_dying_threads(); ThreadID tid() const { return m_tid; } @@ -387,7 +387,7 @@ public: private: BlockerSet* m_blocker_set { nullptr }; - NonnullRefPtr m_thread; + NonnullLockRefPtr m_thread; u8 m_was_interrupted_by_signal { 0 }; bool m_is_blocking { false }; bool m_was_interrupted_by_death { false }; @@ -522,7 +522,7 @@ public: bool unblock(void*, bool); private: - NonnullRefPtr m_joinee; + NonnullLockRefPtr m_joinee; void*& m_joinee_exit_value; ErrorOr& m_try_join_result; bool m_did_unblock { false }; @@ -612,7 +612,7 @@ public: explicit OpenFileDescriptionBlocker(OpenFileDescription&, BlockFlags, BlockFlags&); private: - NonnullRefPtr m_blocked_description; + NonnullLockRefPtr m_blocked_description; const BlockFlags m_flags; BlockFlags& m_unblocked_flags; bool m_did_unblock { false }; @@ -670,7 +670,7 @@ public: class SelectBlocker final : public FileBlocker { public: struct FDInfo { - RefPtr description; + LockRefPtr description; BlockFlags block_flags { BlockFlags::None }; BlockFlags unblocked_flags { BlockFlags::None }; }; @@ -737,7 +737,7 @@ public: Disowned }; - WaitBlocker(int wait_options, Variant, NonnullRefPtr> waitee, ErrorOr& result); + WaitBlocker(int wait_options, Variant, NonnullLockRefPtr> waitee, ErrorOr& result); virtual StringView state_string() const override { return "Waiting"sv; } virtual Type blocker_type() const override { return Type::Wait; } virtual void will_unblock_immediately_without_blocking(UnblockImmediatelyReason) override; @@ -753,7 +753,7 @@ public: int const m_wait_options; ErrorOr& m_result; - Variant, NonnullRefPtr> m_waitee; + Variant, NonnullLockRefPtr> m_waitee; bool m_did_unblock { false }; bool m_got_sigchild { false }; }; @@ -777,12 +777,12 @@ public: private: struct ProcessBlockInfo { - NonnullRefPtr process; + NonnullLockRefPtr process; WaitBlocker::UnblockFlags flags; u8 signal; bool was_waited { false }; - explicit ProcessBlockInfo(NonnullRefPtr&&, WaitBlocker::UnblockFlags, u8); + explicit ProcessBlockInfo(NonnullLockRefPtr&&, WaitBlocker::UnblockFlags, u8); ~ProcessBlockInfo(); }; @@ -793,7 +793,7 @@ public: class FlockBlocker final : public Blocker { public: - FlockBlocker(NonnullRefPtr, flock const&); + FlockBlocker(NonnullLockRefPtr, flock const&); virtual StringView state_string() const override { return "Locking File"sv; } virtual Type blocker_type() const override { return Type::Flock; } virtual void will_unblock_immediately_without_blocking(UnblockImmediatelyReason) override; @@ -801,7 +801,7 @@ public: bool try_unblock(bool from_add_blocker); private: - NonnullRefPtr m_inode; + NonnullLockRefPtr m_inode; flock const& m_flock; bool m_did_unblock { false }; }; @@ -1049,7 +1049,7 @@ public: return !m_is_joinable; } - ErrorOr> try_clone(Process&); + ErrorOr> try_clone(Process&); template Callback> static IterationDecision for_each_in_state(State, Callback); @@ -1159,7 +1159,7 @@ public: ErrorOr> backtrace(); private: - Thread(NonnullRefPtr, NonnullOwnPtr, NonnullRefPtr, NonnullOwnPtr); + Thread(NonnullLockRefPtr, NonnullOwnPtr, NonnullLockRefPtr, NonnullOwnPtr); BlockResult block_impl(BlockTimeout const&, Blocker&); @@ -1230,7 +1230,7 @@ private: mutable RecursiveSpinlock m_lock { LockRank::Thread }; mutable RecursiveSpinlock m_block_lock { LockRank::None }; - NonnullRefPtr m_process; + NonnullLockRefPtr m_process; ThreadID m_tid { -1 }; ThreadRegisters m_regs {}; DebugRegisterState m_debug_register_state {}; @@ -1316,7 +1316,7 @@ private: Atomic m_have_any_unmasked_pending_signals { false }; Atomic m_nested_profiler_calls { 0 }; - NonnullRefPtr m_block_timer; + NonnullLockRefPtr m_block_timer; bool m_is_profiling_suppressed { false }; diff --git a/Kernel/ThreadBlockers.cpp b/Kernel/ThreadBlockers.cpp index ca3fd8368e..15d6789465 100644 --- a/Kernel/ThreadBlockers.cpp +++ b/Kernel/ThreadBlockers.cpp @@ -510,7 +510,7 @@ bool Thread::SignalBlocker::check_pending_signals(bool from_add_blocker) return true; } -Thread::WaitBlockerSet::ProcessBlockInfo::ProcessBlockInfo(NonnullRefPtr&& process, WaitBlocker::UnblockFlags flags, u8 signal) +Thread::WaitBlockerSet::ProcessBlockInfo::ProcessBlockInfo(NonnullLockRefPtr&& process, WaitBlocker::UnblockFlags flags, u8 signal) : process(move(process)) , flags(flags) , signal(signal) @@ -663,7 +663,7 @@ void Thread::WaitBlockerSet::finalize() } } -Thread::WaitBlocker::WaitBlocker(int wait_options, Variant, NonnullRefPtr> waitee, ErrorOr& result) +Thread::WaitBlocker::WaitBlocker(int wait_options, Variant, NonnullLockRefPtr> waitee, ErrorOr& result) : m_wait_options(wait_options) , m_result(result) , m_waitee(move(waitee)) @@ -731,10 +731,10 @@ bool Thread::WaitBlocker::unblock(Process& process, UnblockFlags flags, u8 signa VERIFY(flags != UnblockFlags::Terminated || signal == 0); // signal argument should be ignored for Terminated bool do_not_unblock = m_waitee.visit( - [&](NonnullRefPtr const& waitee_process) { + [&](NonnullLockRefPtr const& waitee_process) { return &process != waitee_process; }, - [&](NonnullRefPtr const& waitee_process_group) { + [&](NonnullLockRefPtr const& waitee_process_group) { return waitee_process_group->pgid() != process.pgid(); }, [&](Empty const&) { @@ -821,7 +821,7 @@ bool Thread::WaitBlocker::unblock(Process& process, UnblockFlags flags, u8 signa return true; } -Thread::FlockBlocker::FlockBlocker(NonnullRefPtr inode, flock const& flock) +Thread::FlockBlocker::FlockBlocker(NonnullLockRefPtr inode, flock const& flock) : m_inode(move(inode)) , m_flock(flock) { diff --git a/Kernel/Time/APICTimer.cpp b/Kernel/Time/APICTimer.cpp index 4131627d24..ae8507c67e 100644 --- a/Kernel/Time/APICTimer.cpp +++ b/Kernel/Time/APICTimer.cpp @@ -16,7 +16,7 @@ namespace Kernel { UNMAP_AFTER_INIT APICTimer* APICTimer::initialize(u8 interrupt_number, HardwareTimerBase& calibration_source) { - auto timer = adopt_ref(*new APICTimer(interrupt_number, nullptr)); + auto timer = adopt_lock_ref(*new APICTimer(interrupt_number, nullptr)); timer->register_interrupt_handler(); if (!timer->calibrate(calibration_source)) { return nullptr; diff --git a/Kernel/Time/HPET.h b/Kernel/Time/HPET.h index 799c3439d9..8454985774 100644 --- a/Kernel/Time/HPET.h +++ b/Kernel/Time/HPET.h @@ -6,10 +6,10 @@ #pragma once -#include #include #include #include +#include #include #include @@ -29,7 +29,7 @@ public: u64 raw_counter_ticks_to_ns(u64) const; u64 ns_to_raw_counter_ticks(u64) const; - NonnullRefPtrVector const& comparators() const { return m_comparators; } + NonnullLockRefPtrVector const& comparators() const { return m_comparators; } void disable(HPETComparator const&); void enable(HPETComparator const&); @@ -78,6 +78,6 @@ private: bool m_main_counter_64bits : 1; bool legacy_replacement_route_capable : 1; - NonnullRefPtrVector m_comparators; + NonnullLockRefPtrVector m_comparators; }; } diff --git a/Kernel/Time/HPETComparator.cpp b/Kernel/Time/HPETComparator.cpp index 7cdefd1706..6d4a3aea73 100644 --- a/Kernel/Time/HPETComparator.cpp +++ b/Kernel/Time/HPETComparator.cpp @@ -13,9 +13,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr HPETComparator::create(u8 number, u8 irq, bool periodic_capable, bool is_64bit_capable) +UNMAP_AFTER_INIT NonnullLockRefPtr HPETComparator::create(u8 number, u8 irq, bool periodic_capable, bool is_64bit_capable) { - auto timer = adopt_ref(*new HPETComparator(number, irq, periodic_capable, is_64bit_capable)); + auto timer = adopt_lock_ref(*new HPETComparator(number, irq, periodic_capable, is_64bit_capable)); timer->register_interrupt_handler(); return timer; } diff --git a/Kernel/Time/HPETComparator.h b/Kernel/Time/HPETComparator.h index 584c0499be..2bbbfcb709 100644 --- a/Kernel/Time/HPETComparator.h +++ b/Kernel/Time/HPETComparator.h @@ -16,7 +16,7 @@ class HPETComparator final : public HardwareTimer { friend class HPET; public: - static NonnullRefPtr create(u8 number, u8 irq, bool periodic_capable, bool is_64bit_capable); + static NonnullLockRefPtr create(u8 number, u8 irq, bool periodic_capable, bool is_64bit_capable); virtual HardwareTimerType timer_type() const override { return HardwareTimerType::HighPrecisionEventTimer; } virtual StringView model() const override { return "HPET"sv; } diff --git a/Kernel/Time/PIT.cpp b/Kernel/Time/PIT.cpp index f435e23b5c..d2796fb8f6 100644 --- a/Kernel/Time/PIT.cpp +++ b/Kernel/Time/PIT.cpp @@ -16,9 +16,9 @@ #define IRQ_TIMER 0 namespace Kernel { -UNMAP_AFTER_INIT NonnullRefPtr PIT::initialize(Function callback) +UNMAP_AFTER_INIT NonnullLockRefPtr PIT::initialize(Function callback) { - return adopt_ref(*new PIT(move(callback))); + return adopt_lock_ref(*new PIT(move(callback))); } [[maybe_unused]] inline static void reset_countdown(u16 timer_reload) diff --git a/Kernel/Time/PIT.h b/Kernel/Time/PIT.h index 081ecb9523..552a638acd 100644 --- a/Kernel/Time/PIT.h +++ b/Kernel/Time/PIT.h @@ -6,8 +6,8 @@ #pragma once -#include #include +#include #include namespace Kernel { @@ -34,7 +34,7 @@ namespace Kernel { class PIT final : public HardwareTimer { public: - static NonnullRefPtr initialize(Function); + static NonnullLockRefPtr initialize(Function); virtual HardwareTimerType timer_type() const override { return HardwareTimerType::i8253; } virtual StringView model() const override { return "i8254"sv; } virtual size_t ticks_per_second() const override; diff --git a/Kernel/Time/RTC.cpp b/Kernel/Time/RTC.cpp index 59de79808e..8d9fbe897f 100644 --- a/Kernel/Time/RTC.cpp +++ b/Kernel/Time/RTC.cpp @@ -15,9 +15,9 @@ namespace Kernel { #define IRQ_TIMER 8 #define MAX_FREQUENCY 8000 -NonnullRefPtr RealTimeClock::create(Function callback) +NonnullLockRefPtr RealTimeClock::create(Function callback) { - return adopt_ref(*new RealTimeClock(move(callback))); + return adopt_lock_ref(*new RealTimeClock(move(callback))); } RealTimeClock::RealTimeClock(Function callback) : HardwareTimer(IRQ_TIMER, move(callback)) diff --git a/Kernel/Time/RTC.h b/Kernel/Time/RTC.h index c0b3ab4c7b..a63cef27f6 100644 --- a/Kernel/Time/RTC.h +++ b/Kernel/Time/RTC.h @@ -6,14 +6,14 @@ #pragma once -#include +#include #include #include namespace Kernel { class RealTimeClock final : public HardwareTimer { public: - static NonnullRefPtr create(Function callback); + static NonnullLockRefPtr create(Function callback); virtual HardwareTimerType timer_type() const override { return HardwareTimerType::RTC; } virtual StringView model() const override { return "Real Time Clock"sv; } virtual size_t ticks_per_second() const override; diff --git a/Kernel/Time/TimeManagement.h b/Kernel/Time/TimeManagement.h index 9d1735e101..967c4eec88 100644 --- a/Kernel/Time/TimeManagement.h +++ b/Kernel/Time/TimeManagement.h @@ -7,13 +7,13 @@ #pragma once #include -#include #include -#include #include #include #include #include +#include +#include #include namespace Kernel { @@ -83,7 +83,7 @@ private: bool probe_and_set_non_legacy_hardware_timers(); Vector scan_and_initialize_periodic_timers(); Vector scan_for_non_periodic_timers(); - NonnullRefPtrVector m_hardware_timers; + NonnullLockRefPtrVector m_hardware_timers; void set_system_timer(HardwareTimerBase&); static void system_timer_tick(RegisterState const&); @@ -102,11 +102,11 @@ private: bool m_can_query_precise_time { false }; bool m_updating_time { false }; // may only be accessed from the BSP! - RefPtr m_system_timer; - RefPtr m_time_keeper_timer; + LockRefPtr m_system_timer; + LockRefPtr m_time_keeper_timer; Atomic m_profile_enable_count { 0 }; - RefPtr m_profile_timer; + LockRefPtr m_profile_timer; NonnullOwnPtr m_time_page_region; }; diff --git a/Kernel/TimerQueue.cpp b/Kernel/TimerQueue.cpp index 63492e2fe0..9b788331ef 100644 --- a/Kernel/TimerQueue.cpp +++ b/Kernel/TimerQueue.cpp @@ -55,14 +55,14 @@ UNMAP_AFTER_INIT TimerQueue::TimerQueue() m_ticks_per_second = TimeManagement::the().ticks_per_second(); } -bool TimerQueue::add_timer_without_id(NonnullRefPtr timer, clockid_t clock_id, Time const& deadline, Function&& callback) +bool TimerQueue::add_timer_without_id(NonnullLockRefPtr timer, clockid_t clock_id, Time const& deadline, Function&& callback) { if (deadline <= TimeManagement::the().current_time(clock_id)) return false; // Because timer handlers can execute on any processor and there is // a race between executing a timer handler and cancel_timer() this - // *must* be a RefPtr. Otherwise, calling cancel_timer() could + // *must* be a LockRefPtr. Otherwise, calling cancel_timer() could // inadvertently cancel another timer that has been created between // returning from the timer handler and a call to cancel_timer(). timer->setup(clock_id, deadline, move(callback)); @@ -73,7 +73,7 @@ bool TimerQueue::add_timer_without_id(NonnullRefPtr timer, clockid_t cloc return true; } -TimerId TimerQueue::add_timer(NonnullRefPtr&& timer) +TimerId TimerQueue::add_timer(NonnullLockRefPtr&& timer) { SpinlockLocker lock(g_timerqueue_lock); @@ -84,7 +84,7 @@ TimerId TimerQueue::add_timer(NonnullRefPtr&& timer) return id; } -void TimerQueue::add_timer_locked(NonnullRefPtr timer) +void TimerQueue::add_timer_locked(NonnullLockRefPtr timer) { Time timer_expiration = timer->m_expires; diff --git a/Kernel/TimerQueue.h b/Kernel/TimerQueue.h index 9163957961..d309315979 100644 --- a/Kernel/TimerQueue.h +++ b/Kernel/TimerQueue.h @@ -9,9 +9,9 @@ #include #include #include -#include #include #include +#include #include namespace Kernel { @@ -87,8 +87,8 @@ public: TimerQueue(); static TimerQueue& the(); - TimerId add_timer(NonnullRefPtr&&); - bool add_timer_without_id(NonnullRefPtr, clockid_t, Time const&, Function&&); + TimerId add_timer(NonnullLockRefPtr&&); + bool add_timer_without_id(NonnullLockRefPtr, clockid_t, Time const&, Function&&); bool cancel_timer(Timer& timer, bool* was_in_use = nullptr); void fire(); @@ -99,7 +99,7 @@ private: }; void remove_timer_locked(Queue&, Timer&); void update_next_timer_due(Queue&); - void add_timer_locked(NonnullRefPtr); + void add_timer_locked(NonnullLockRefPtr); Queue& queue_for_timer(Timer& timer) { diff --git a/Kernel/WorkQueue.cpp b/Kernel/WorkQueue.cpp index 89ab1bc600..4a89666498 100644 --- a/Kernel/WorkQueue.cpp +++ b/Kernel/WorkQueue.cpp @@ -23,7 +23,7 @@ UNMAP_AFTER_INIT void WorkQueue::initialize() UNMAP_AFTER_INIT WorkQueue::WorkQueue(StringView name) { - RefPtr thread; + LockRefPtr thread; auto name_kstring = KString::try_create(name); if (name_kstring.is_error()) TODO(); diff --git a/Kernel/WorkQueue.h b/Kernel/WorkQueue.h index e795b9d482..932d434ff6 100644 --- a/Kernel/WorkQueue.h +++ b/Kernel/WorkQueue.h @@ -61,7 +61,7 @@ private: void do_queue(WorkItem&); - RefPtr m_thread; + LockRefPtr m_thread; WaitQueue m_wait_queue; SpinlockProtected> m_items { LockRank::None }; }; diff --git a/Kernel/init.cpp b/Kernel/init.cpp index 27d92f4a37..086242665b 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -206,7 +206,7 @@ extern "C" [[noreturn]] UNMAP_AFTER_INIT void init(BootInfo const& boot_info) // We do so we can see the output on the screen as soon as possible. if (!kernel_command_line().is_early_boot_console_disabled()) { if (!multiboot_framebuffer_addr.is_null() && multiboot_framebuffer_type == MULTIBOOT_FRAMEBUFFER_TYPE_RGB) { - g_boot_console = &try_make_ref_counted(multiboot_framebuffer_addr, multiboot_framebuffer_width, multiboot_framebuffer_height, multiboot_framebuffer_pitch).value().leak_ref(); + g_boot_console = &try_make_lock_ref_counted(multiboot_framebuffer_addr, multiboot_framebuffer_width, multiboot_framebuffer_height, multiboot_framebuffer_pitch).value().leak_ref(); } else { g_boot_console = &Graphics::VGATextModeConsole::initialize().leak_ref(); } @@ -251,7 +251,7 @@ extern "C" [[noreturn]] UNMAP_AFTER_INIT void init(BootInfo const& boot_info) } { - RefPtr init_stage2_thread; + LockRefPtr init_stage2_thread; (void)Process::create_kernel_process(init_stage2_thread, KString::must_create("init_stage2"sv), init_stage2, nullptr, THREAD_AFFINITY_DEFAULT, Process::RegisterProcess::No); // We need to make sure we drop the reference for init_stage2_thread // before calling into Scheduler::start, otherwise we will have a @@ -377,7 +377,7 @@ void init_stage2(void*) // NOTE: Everything marked UNMAP_AFTER_INIT becomes inaccessible after this point. MM.unmap_text_after_init(); - RefPtr thread; + LockRefPtr thread; auto userspace_init = kernel_command_line().userspace_init(); auto init_args = kernel_command_line().userspace_init_args();