summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-08-19 20:53:40 +0200
committerAndreas Kling <kling@serenityos.org>2022-08-20 17:20:43 +0200
commit11eee67b8510767d76fb4793e3b62ac1793dd723 (patch)
tree8ce47a3813ce74bba56c60f62b29bdd6cdf287da
parente475263113387404e63cdc3666391934604eb6e7 (diff)
downloadserenity-11eee67b8510767d76fb4793e3b62ac1793dd723.zip
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.
-rw-r--r--AK/Forward.h29
-rw-r--r--AK/IntrusiveDetails.h10
-rw-r--r--AK/IntrusiveList.h46
-rw-r--r--AK/NonnullRefPtr.h35
-rw-r--r--AK/RefPtr.h48
-rw-r--r--AK/WeakPtr.h7
-rw-r--r--AK/Weakable.h17
-rw-r--r--Kernel/Arch/aarch64/Dummy.cpp4
-rw-r--r--Kernel/Arch/aarch64/InterruptManagement.cpp4
-rw-r--r--Kernel/Arch/aarch64/InterruptManagement.h8
-rw-r--r--Kernel/Arch/aarch64/PageDirectory.cpp2
-rw-r--r--Kernel/Arch/aarch64/init.cpp2
-rw-r--r--Kernel/Arch/x86/InterruptManagement.h8
-rw-r--r--Kernel/Arch/x86/common/InterruptManagement.cpp10
-rw-r--r--Kernel/Arch/x86/common/Interrupts.cpp17
-rw-r--r--Kernel/Arch/x86/common/PageDirectory.cpp2
-rw-r--r--Kernel/Bus/USB/UHCI/UHCIController.cpp6
-rw-r--r--Kernel/Bus/USB/UHCI/UHCIController.h2
-rw-r--r--Kernel/Bus/USB/UHCI/UHCIRootHub.cpp4
-rw-r--r--Kernel/Bus/USB/UHCI/UHCIRootHub.h10
-rw-r--r--Kernel/Bus/USB/USBController.h2
-rw-r--r--Kernel/Bus/USB/USBDevice.cpp6
-rw-r--r--Kernel/Bus/USB/USBDevice.h10
-rw-r--r--Kernel/Bus/USB/USBHub.cpp12
-rw-r--r--Kernel/Bus/USB/USBHub.h6
-rw-r--r--Kernel/Bus/USB/USBManagement.h4
-rw-r--r--Kernel/Bus/USB/USBPipe.h2
-rw-r--r--Kernel/Bus/USB/USBTransfer.cpp4
-rw-r--r--Kernel/Bus/USB/USBTransfer.h4
-rw-r--r--Kernel/Bus/VirtIO/Console.cpp4
-rw-r--r--Kernel/Bus/VirtIO/Console.h4
-rw-r--r--Kernel/Bus/VirtIO/ConsolePort.cpp6
-rw-r--r--Kernel/Bus/VirtIO/ConsolePort.h4
-rw-r--r--Kernel/Bus/VirtIO/RNG.cpp4
-rw-r--r--Kernel/Bus/VirtIO/RNG.h2
-rw-r--r--Kernel/Coredump.cpp6
-rw-r--r--Kernel/Coredump.h12
-rw-r--r--Kernel/Devices/AsyncDeviceRequest.cpp2
-rw-r--r--Kernel/Devices/AsyncDeviceRequest.h8
-rw-r--r--Kernel/Devices/Audio/AC97.cpp6
-rw-r--r--Kernel/Devices/Audio/AC97.h6
-rw-r--r--Kernel/Devices/Audio/Channel.cpp2
-rw-r--r--Kernel/Devices/Audio/Channel.h4
-rw-r--r--Kernel/Devices/Audio/Controller.h10
-rw-r--r--Kernel/Devices/Audio/Management.h2
-rw-r--r--Kernel/Devices/BlockDevice.h2
-rw-r--r--Kernel/Devices/ConsoleDevice.cpp2
-rw-r--r--Kernel/Devices/ConsoleDevice.h2
-rw-r--r--Kernel/Devices/Device.h14
-rw-r--r--Kernel/Devices/DeviceControlDevice.cpp2
-rw-r--r--Kernel/Devices/DeviceControlDevice.h2
-rw-r--r--Kernel/Devices/DeviceManagement.h16
-rw-r--r--Kernel/Devices/FullDevice.cpp2
-rw-r--r--Kernel/Devices/FullDevice.h2
-rw-r--r--Kernel/Devices/HID/HIDManagement.h8
-rw-r--r--Kernel/Devices/HID/I8042Controller.cpp8
-rw-r--r--Kernel/Devices/HID/I8042Controller.h12
-rw-r--r--Kernel/Devices/HID/PS2KeyboardDevice.cpp2
-rw-r--r--Kernel/Devices/HID/PS2KeyboardDevice.h2
-rw-r--r--Kernel/Devices/HID/PS2MouseDevice.cpp2
-rw-r--r--Kernel/Devices/HID/PS2MouseDevice.h2
-rw-r--r--Kernel/Devices/HID/VMWareMouseDevice.cpp2
-rw-r--r--Kernel/Devices/HID/VMWareMouseDevice.h2
-rw-r--r--Kernel/Devices/KCOVDevice.cpp4
-rw-r--r--Kernel/Devices/KCOVDevice.h4
-rw-r--r--Kernel/Devices/KCOVInstance.h2
-rw-r--r--Kernel/Devices/MemoryDevice.cpp2
-rw-r--r--Kernel/Devices/MemoryDevice.h2
-rw-r--r--Kernel/Devices/NullDevice.cpp2
-rw-r--r--Kernel/Devices/NullDevice.h2
-rw-r--r--Kernel/Devices/RandomDevice.cpp2
-rw-r--r--Kernel/Devices/RandomDevice.h2
-rw-r--r--Kernel/Devices/SelfTTYDevice.cpp6
-rw-r--r--Kernel/Devices/SelfTTYDevice.h4
-rw-r--r--Kernel/Devices/SerialDevice.cpp4
-rw-r--r--Kernel/Devices/SerialDevice.h2
-rw-r--r--Kernel/Devices/ZeroDevice.cpp2
-rw-r--r--Kernel/Devices/ZeroDevice.h2
-rw-r--r--Kernel/FileSystem/AnonymousFile.cpp2
-rw-r--r--Kernel/FileSystem/AnonymousFile.h8
-rw-r--r--Kernel/FileSystem/Custody.cpp8
-rw-r--r--Kernel/FileSystem/Custody.h8
-rw-r--r--Kernel/FileSystem/DevPtsFS.cpp16
-rw-r--r--Kernel/FileSystem/DevPtsFS.h12
-rw-r--r--Kernel/FileSystem/DevTmpFS.cpp24
-rw-r--r--Kernel/FileSystem/DevTmpFS.h14
-rw-r--r--Kernel/FileSystem/Ext2FileSystem.cpp20
-rw-r--r--Kernel/FileSystem/Ext2FileSystem.h16
-rw-r--r--Kernel/FileSystem/FIFO.cpp8
-rw-r--r--Kernel/FileSystem/FIFO.h6
-rw-r--r--Kernel/FileSystem/File.cpp2
-rw-r--r--Kernel/FileSystem/File.h8
-rw-r--r--Kernel/FileSystem/FileBackedFileSystem.h2
-rw-r--r--Kernel/FileSystem/FileSystem.cpp2
-rw-r--r--Kernel/FileSystem/FileSystem.h2
-rw-r--r--Kernel/FileSystem/ISO9660FileSystem.cpp22
-rw-r--r--Kernel/FileSystem/ISO9660FileSystem.h20
-rw-r--r--Kernel/FileSystem/Inode.cpp14
-rw-r--r--Kernel/FileSystem/Inode.h22
-rw-r--r--Kernel/FileSystem/InodeFile.cpp4
-rw-r--r--Kernel/FileSystem/InodeFile.h8
-rw-r--r--Kernel/FileSystem/InodeWatcher.cpp4
-rw-r--r--Kernel/FileSystem/InodeWatcher.h2
-rw-r--r--Kernel/FileSystem/Mount.h8
-rw-r--r--Kernel/FileSystem/OpenFileDescription.cpp8
-rw-r--r--Kernel/FileSystem/OpenFileDescription.h12
-rw-r--r--Kernel/FileSystem/Plan9FileSystem.cpp16
-rw-r--r--Kernel/FileSystem/Plan9FileSystem.h22
-rw-r--r--Kernel/FileSystem/ProcFS.cpp52
-rw-r--r--Kernel/FileSystem/ProcFS.h36
-rw-r--r--Kernel/FileSystem/SysFS.cpp22
-rw-r--r--Kernel/FileSystem/SysFS.h18
-rw-r--r--Kernel/FileSystem/SysFS/Component.cpp10
-rw-r--r--Kernel/FileSystem/SysFS/Component.h18
-rw-r--r--Kernel/FileSystem/SysFS/Registry.h2
-rw-r--r--Kernel/FileSystem/SysFS/RootDirectory.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/RootDirectory.h4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Bus/Directory.h2
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/BusDirectory.cpp2
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceAttribute.h4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Bus/PCI/DeviceDirectory.h2
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.cpp2
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.h4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/BlockDevicesDirectory.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/BlockDevicesDirectory.h2
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/CharacterDevicesDirectory.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/CharacterDevicesDirectory.h2
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/DeviceComponent.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/DeviceComponent.h4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/Directory.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/Directory.h2
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/SymbolicLinkDeviceComponent.cpp8
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/SymbolicLinkDeviceComponent.h8
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Directory.h2
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/Directory.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/Directory.h2
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceAttribute.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceAttribute.h4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceDirectory.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/DeviceDirectory.h4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/Directory.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Graphics/DisplayConnector/Directory.h2
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceAttribute.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceAttribute.h4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceDirectory.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/DeviceDirectory.h4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/Directory.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Devices/Storage/Directory.h2
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Component.h4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Firmware/BIOS/Directory.h4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.cpp2
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.cpp4
-rw-r--r--Kernel/FileSystem/SysFS/Subsystems/Firmware/PowerStateSwitch.h4
-rw-r--r--Kernel/FileSystem/TmpFS.cpp16
-rw-r--r--Kernel/FileSystem/TmpFS.h18
-rw-r--r--Kernel/FileSystem/VirtualFileSystem.cpp30
-rw-r--r--Kernel/FileSystem/VirtualFileSystem.h16
-rw-r--r--Kernel/Firmware/ACPI/Parser.cpp8
-rw-r--r--Kernel/Firmware/ACPI/Parser.h6
-rw-r--r--Kernel/GlobalProcessExposed.cpp162
-rw-r--r--Kernel/Graphics/Bochs/DisplayConnector.cpp2
-rw-r--r--Kernel/Graphics/Bochs/DisplayConnector.h6
-rw-r--r--Kernel/Graphics/Bochs/GraphicsAdapter.cpp4
-rw-r--r--Kernel/Graphics/Bochs/GraphicsAdapter.h4
-rw-r--r--Kernel/Graphics/Bochs/QEMUDisplayConnector.cpp2
-rw-r--r--Kernel/Graphics/Bochs/QEMUDisplayConnector.h4
-rw-r--r--Kernel/Graphics/Console/ContiguousFramebufferConsole.cpp4
-rw-r--r--Kernel/Graphics/Console/ContiguousFramebufferConsole.h2
-rw-r--r--Kernel/Graphics/Console/VGATextModeConsole.cpp4
-rw-r--r--Kernel/Graphics/Console/VGATextModeConsole.h2
-rw-r--r--Kernel/Graphics/DisplayConnector.h6
-rw-r--r--Kernel/Graphics/Generic/DisplayConnector.cpp2
-rw-r--r--Kernel/Graphics/Generic/DisplayConnector.h6
-rw-r--r--Kernel/Graphics/GenericGraphicsAdapter.h4
-rw-r--r--Kernel/Graphics/GraphicsManagement.cpp2
-rw-r--r--Kernel/Graphics/GraphicsManagement.h12
-rw-r--r--Kernel/Graphics/Intel/NativeDisplayConnector.cpp2
-rw-r--r--Kernel/Graphics/Intel/NativeDisplayConnector.h6
-rw-r--r--Kernel/Graphics/Intel/NativeGraphicsAdapter.cpp4
-rw-r--r--Kernel/Graphics/Intel/NativeGraphicsAdapter.h4
-rw-r--r--Kernel/Graphics/VMWare/Console.cpp6
-rw-r--r--Kernel/Graphics/VMWare/Console.h4
-rw-r--r--Kernel/Graphics/VMWare/DisplayConnector.cpp2
-rw-r--r--Kernel/Graphics/VMWare/DisplayConnector.h8
-rw-r--r--Kernel/Graphics/VMWare/GraphicsAdapter.cpp4
-rw-r--r--Kernel/Graphics/VMWare/GraphicsAdapter.h4
-rw-r--r--Kernel/Graphics/VirtIOGPU/Console.cpp6
-rw-r--r--Kernel/Graphics/VirtIOGPU/Console.h4
-rw-r--r--Kernel/Graphics/VirtIOGPU/DisplayConnector.cpp2
-rw-r--r--Kernel/Graphics/VirtIOGPU/DisplayConnector.h6
-rw-r--r--Kernel/Graphics/VirtIOGPU/GPU3DDevice.cpp6
-rw-r--r--Kernel/Graphics/VirtIOGPU/GPU3DDevice.h12
-rw-r--r--Kernel/Graphics/VirtIOGPU/GraphicsAdapter.cpp4
-rw-r--r--Kernel/Graphics/VirtIOGPU/GraphicsAdapter.h6
-rw-r--r--Kernel/Interrupts/IRQHandler.h4
-rw-r--r--Kernel/Interrupts/SharedIRQHandler.h4
-rw-r--r--Kernel/Interrupts/SpuriousInterruptHandler.h2
-rw-r--r--Kernel/Library/LockRefPtr.h (renamed from Kernel/Library/ThreadSafeRefPtr.h)142
-rw-r--r--Kernel/Library/LockWeakPtr.h (renamed from Kernel/Library/ThreadSafeWeakPtr.h)70
-rw-r--r--Kernel/Library/LockWeakable.h (renamed from Kernel/Library/ThreadSafeWeakable.h)30
-rw-r--r--Kernel/Library/NonnullLockRefPtr.h (renamed from Kernel/Library/ThreadSafeNonnullRefPtr.h)111
-rw-r--r--Kernel/Library/NonnullLockRefPtrVector.h21
-rw-r--r--Kernel/Locking/Mutex.h2
-rw-r--r--Kernel/Memory/AddressSpace.cpp6
-rw-r--r--Kernel/Memory/AddressSpace.h10
-rw-r--r--Kernel/Memory/AnonymousVMObject.cpp46
-rw-r--r--Kernel/Memory/AnonymousVMObject.h32
-rw-r--r--Kernel/Memory/InodeVMObject.cpp4
-rw-r--r--Kernel/Memory/InodeVMObject.h6
-rw-r--r--Kernel/Memory/MemoryManager.cpp22
-rw-r--r--Kernel/Memory/MemoryManager.h22
-rw-r--r--Kernel/Memory/PageDirectory.cpp8
-rw-r--r--Kernel/Memory/PageDirectory.h16
-rw-r--r--Kernel/Memory/PhysicalPage.cpp4
-rw-r--r--Kernel/Memory/PhysicalPage.h4
-rw-r--r--Kernel/Memory/PhysicalRegion.cpp10
-rw-r--r--Kernel/Memory/PhysicalRegion.h4
-rw-r--r--Kernel/Memory/PrivateInodeVMObject.cpp12
-rw-r--r--Kernel/Memory/PrivateInodeVMObject.h8
-rw-r--r--Kernel/Memory/Region.cpp22
-rw-r--r--Kernel/Memory/Region.h26
-rw-r--r--Kernel/Memory/ScatterGatherList.cpp6
-rw-r--r--Kernel/Memory/ScatterGatherList.h6
-rw-r--r--Kernel/Memory/SharedFramebufferVMObject.cpp30
-rw-r--r--Kernel/Memory/SharedFramebufferVMObject.h50
-rw-r--r--Kernel/Memory/SharedInodeVMObject.cpp12
-rw-r--r--Kernel/Memory/SharedInodeVMObject.h8
-rw-r--r--Kernel/Memory/VMObject.cpp8
-rw-r--r--Kernel/Memory/VMObject.h20
-rw-r--r--Kernel/Net/IPv4Socket.cpp4
-rw-r--r--Kernel/Net/IPv4Socket.h2
-rw-r--r--Kernel/Net/Intel/E1000ENetworkAdapter.cpp4
-rw-r--r--Kernel/Net/Intel/E1000ENetworkAdapter.h2
-rw-r--r--Kernel/Net/Intel/E1000NetworkAdapter.cpp4
-rw-r--r--Kernel/Net/Intel/E1000NetworkAdapter.h2
-rw-r--r--Kernel/Net/LocalSocket.cpp12
-rw-r--r--Kernel/Net/LocalSocket.h20
-rw-r--r--Kernel/Net/LoopbackAdapter.cpp4
-rw-r--r--Kernel/Net/LoopbackAdapter.h2
-rw-r--r--Kernel/Net/NE2000/NetworkAdapter.cpp4
-rw-r--r--Kernel/Net/NE2000/NetworkAdapter.h2
-rw-r--r--Kernel/Net/NetworkAdapter.cpp6
-rw-r--r--Kernel/Net/NetworkAdapter.h10
-rw-r--r--Kernel/Net/NetworkTask.cpp20
-rw-r--r--Kernel/Net/NetworkingManagement.cpp12
-rw-r--r--Kernel/Net/NetworkingManagement.h16
-rw-r--r--Kernel/Net/Realtek/RTL8139NetworkAdapter.cpp4
-rw-r--r--Kernel/Net/Realtek/RTL8139NetworkAdapter.h2
-rw-r--r--Kernel/Net/Realtek/RTL8168NetworkAdapter.cpp4
-rw-r--r--Kernel/Net/Realtek/RTL8168NetworkAdapter.h2
-rw-r--r--Kernel/Net/Routing.cpp12
-rw-r--r--Kernel/Net/Routing.h14
-rw-r--r--Kernel/Net/Socket.cpp6
-rw-r--r--Kernel/Net/Socket.h16
-rw-r--r--Kernel/Net/TCPSocket.cpp18
-rw-r--r--Kernel/Net/TCPSocket.h22
-rw-r--r--Kernel/Net/UDPSocket.cpp8
-rw-r--r--Kernel/Net/UDPSocket.h4
-rw-r--r--Kernel/Process.cpp34
-rw-r--r--Kernel/Process.h80
-rw-r--r--Kernel/ProcessExposed.cpp8
-rw-r--r--Kernel/ProcessExposed.h24
-rw-r--r--Kernel/ProcessGroup.cpp14
-rw-r--r--Kernel/ProcessGroup.h10
-rw-r--r--Kernel/ProcessProcFSTraits.cpp2
-rw-r--r--Kernel/ProcessSpecificExposed.cpp10
-rw-r--r--Kernel/Scheduler.cpp2
-rw-r--r--Kernel/Storage/ATA/AHCI/Controller.cpp12
-rw-r--r--Kernel/Storage/ATA/AHCI/Controller.h10
-rw-r--r--Kernel/Storage/ATA/AHCI/InterruptHandler.h4
-rw-r--r--Kernel/Storage/ATA/AHCI/Port.cpp14
-rw-r--r--Kernel/Storage/ATA/AHCI/Port.h32
-rw-r--r--Kernel/Storage/ATA/ATAController.h4
-rw-r--r--Kernel/Storage/ATA/ATADevice.h2
-rw-r--r--Kernel/Storage/ATA/ATADiskDevice.cpp2
-rw-r--r--Kernel/Storage/ATA/ATADiskDevice.h2
-rw-r--r--Kernel/Storage/ATA/ATAPort.cpp6
-rw-r--r--Kernel/Storage/ATA/ATAPort.h14
-rw-r--r--Kernel/Storage/ATA/GenericIDE/Channel.cpp8
-rw-r--r--Kernel/Storage/ATA/GenericIDE/Channel.h6
-rw-r--r--Kernel/Storage/ATA/GenericIDE/Controller.cpp12
-rw-r--r--Kernel/Storage/ATA/GenericIDE/Controller.h10
-rw-r--r--Kernel/Storage/ATA/GenericIDE/ISAController.cpp6
-rw-r--r--Kernel/Storage/ATA/GenericIDE/ISAController.h6
-rw-r--r--Kernel/Storage/ATA/GenericIDE/PCIController.cpp6
-rw-r--r--Kernel/Storage/ATA/GenericIDE/PCIController.h6
-rw-r--r--Kernel/Storage/DiskPartition.cpp2
-rw-r--r--Kernel/Storage/DiskPartition.h8
-rw-r--r--Kernel/Storage/NVMe/NVMeController.cpp24
-rw-r--r--Kernel/Storage/NVMe/NVMeController.h18
-rw-r--r--Kernel/Storage/NVMe/NVMeInterruptQueue.cpp2
-rw-r--r--Kernel/Storage/NVMe/NVMeInterruptQueue.h2
-rw-r--r--Kernel/Storage/NVMe/NVMeNameSpace.cpp4
-rw-r--r--Kernel/Storage/NVMe/NVMeNameSpace.h12
-rw-r--r--Kernel/Storage/NVMe/NVMePollQueue.cpp2
-rw-r--r--Kernel/Storage/NVMe/NVMePollQueue.h2
-rw-r--r--Kernel/Storage/NVMe/NVMeQueue.cpp10
-rw-r--r--Kernel/Storage/NVMe/NVMeQueue.h18
-rw-r--r--Kernel/Storage/Ramdisk/Controller.cpp8
-rw-r--r--Kernel/Storage/Ramdisk/Controller.h8
-rw-r--r--Kernel/Storage/Ramdisk/Device.cpp2
-rw-r--r--Kernel/Storage/Ramdisk/Device.h2
-rw-r--r--Kernel/Storage/StorageController.h4
-rw-r--r--Kernel/Storage/StorageDevice.h8
-rw-r--r--Kernel/Storage/StorageManagement.cpp4
-rw-r--r--Kernel/Storage/StorageManagement.h12
-rw-r--r--Kernel/Syscalls/alarm.cpp2
-rw-r--r--Kernel/Syscalls/chdir.cpp4
-rw-r--r--Kernel/Syscalls/chmod.cpp2
-rw-r--r--Kernel/Syscalls/chown.cpp4
-rw-r--r--Kernel/Syscalls/execve.cpp16
-rw-r--r--Kernel/Syscalls/fork.cpp2
-rw-r--r--Kernel/Syscalls/futex.cpp12
-rw-r--r--Kernel/Syscalls/mmap.cpp4
-rw-r--r--Kernel/Syscalls/mount.cpp12
-rw-r--r--Kernel/Syscalls/open.cpp2
-rw-r--r--Kernel/Syscalls/poll.cpp2
-rw-r--r--Kernel/Syscalls/purge.cpp6
-rw-r--r--Kernel/Syscalls/read.cpp2
-rw-r--r--Kernel/Syscalls/socket.cpp6
-rw-r--r--Kernel/Syscalls/stat.cpp4
-rw-r--r--Kernel/Syscalls/unlink.cpp2
-rw-r--r--Kernel/Syscalls/unveil.cpp2
-rw-r--r--Kernel/Syscalls/utimensat.cpp4
-rw-r--r--Kernel/Syscalls/waitid.cpp4
-rw-r--r--Kernel/TTY/ConsoleManagement.h10
-rw-r--r--Kernel/TTY/MasterPTY.cpp6
-rw-r--r--Kernel/TTY/MasterPTY.h4
-rw-r--r--Kernel/TTY/PTYMultiplexer.cpp4
-rw-r--r--Kernel/TTY/PTYMultiplexer.h2
-rw-r--r--Kernel/TTY/SlavePTY.h2
-rw-r--r--Kernel/TTY/TTY.h6
-rw-r--r--Kernel/TTY/VirtualConsole.cpp4
-rw-r--r--Kernel/TTY/VirtualConsole.h4
-rw-r--r--Kernel/Tasks/FinalizerTask.cpp2
-rw-r--r--Kernel/Tasks/SyncTask.cpp2
-rw-r--r--Kernel/Thread.cpp16
-rw-r--r--Kernel/Thread.h38
-rw-r--r--Kernel/ThreadBlockers.cpp10
-rw-r--r--Kernel/Time/APICTimer.cpp2
-rw-r--r--Kernel/Time/HPET.h6
-rw-r--r--Kernel/Time/HPETComparator.cpp4
-rw-r--r--Kernel/Time/HPETComparator.h2
-rw-r--r--Kernel/Time/PIT.cpp4
-rw-r--r--Kernel/Time/PIT.h4
-rw-r--r--Kernel/Time/RTC.cpp4
-rw-r--r--Kernel/Time/RTC.h4
-rw-r--r--Kernel/Time/TimeManagement.h12
-rw-r--r--Kernel/TimerQueue.cpp8
-rw-r--r--Kernel/TimerQueue.h8
-rw-r--r--Kernel/WorkQueue.cpp2
-rw-r--r--Kernel/WorkQueue.h2
-rw-r--r--Kernel/init.cpp6
360 files changed, 1704 insertions, 1673 deletions
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<typename Container, typename ValueType>
class SimpleIterator;
-using ReadonlyBytes = Span<const u8>;
+using ReadonlyBytes = Span<u8 const>;
using Bytes = Span<u8>;
template<typename T, AK::MemoryOrder DefaultMemoryOrder>
@@ -107,26 +107,32 @@ template<typename T>
class NonnullOwnPtr;
template<typename T, size_t inline_capacity = 0>
-class NonnullRefPtrVector;
+class NonnullOwnPtrVector;
template<typename T, size_t inline_capacity = 0>
-class NonnullOwnPtrVector;
+class NonnullRefPtrVector;
template<typename T>
class Optional;
#ifdef KERNEL
template<typename T>
-struct RefPtrTraits;
+class NonnullLockRefPtr;
+
+template<typename T, size_t inline_capacity = 0>
+class NonnullLockRefPtrVector;
-template<typename T, typename PtrTraits = RefPtrTraits<T>>
-class RefPtr;
-#else
template<typename T>
-class RefPtr;
+struct LockRefPtrTraits;
+
+template<typename T, typename PtrTraits = LockRefPtrTraits<T>>
+class LockRefPtr;
#endif
template<typename T>
+class RefPtr;
+
+template<typename T>
class OwnPtr;
template<typename T>
@@ -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 <AK/NonnullRefPtr.h>
+#ifdef KERNEL
+# include <Kernel/Library/LockRefPtr.h>
+#endif
namespace AK::Detail {
template<typename T, typename Container>
@@ -20,6 +23,13 @@ struct SubstituteIntrusiveContainerType<T, NonnullRefPtr<T>> {
using Type = RefPtr<T>;
};
+#ifdef KERNEL
+template<typename T>
+struct SubstituteIntrusiveContainerType<T, NonnullLockRefPtr<T>> {
+ using Type = LockRefPtr<T>;
+};
+#endif
+
template<typename Container, bool _IsRaw>
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 <AK/Noncopyable.h>
#include <AK/StdLibExtras.h>
+#ifdef KERNEL
+# include <Kernel/Library/LockRefPtr.h>
+#endif
+
namespace AK::Detail {
template<typename T, typename Container = RawPtr<T>>
@@ -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<T, Container>& node);
IntrusiveListStorage<T, Container> m_storage;
};
@@ -284,7 +288,7 @@ inline void IntrusiveList<T, Container, member>::remove(T& n)
}
template<class T, typename Container, SubstitutedIntrusiveListNode<T, Container> T::*member>
-inline bool IntrusiveList<T, Container, member>::contains(const T& n) const
+inline bool IntrusiveList<T, Container, member>::contains(T const& n) const
{
auto& nnode = n.*member;
return nnode.m_storage == &m_storage;
@@ -323,18 +327,18 @@ inline Container IntrusiveList<T, Container, member>::last() const
}
template<class T, typename Container, SubstitutedIntrusiveListNode<T, Container> T::*member>
-inline const T* IntrusiveList<T, Container, member>::next(const T* current)
+inline T const* IntrusiveList<T, Container, member>::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<class T, typename Container, SubstitutedIntrusiveListNode<T, Container> T::*member>
-inline const T* IntrusiveList<T, Container, member>::prev(const T* current)
+inline T const* IntrusiveList<T, Container, member>::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<T> take_last() { return *IntrusiveList<T, RefPtr<T>, 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<class T, SubstitutedIntrusiveListNode<T, NonnullLockRefPtr<T>> T::*member>
+class IntrusiveList<T, NonnullLockRefPtr<T>, member> : public IntrusiveList<T, LockRefPtr<T>, member> {
+public:
+ [[nodiscard]] NonnullLockRefPtr<T> first() const { return *IntrusiveList<T, LockRefPtr<T>, member>::first(); }
+ [[nodiscard]] NonnullLockRefPtr<T> last() const { return *IntrusiveList<T, LockRefPtr<T>, member>::last(); }
+
+ [[nodiscard]] NonnullLockRefPtr<T> take_first() { return *IntrusiveList<T, LockRefPtr<T>, member>::take_first(); }
+ [[nodiscard]] NonnullLockRefPtr<T> take_last() { return *IntrusiveList<T, LockRefPtr<T>, 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 <Kernel/Library/ThreadSafeNonnullRefPtr.h>
-#else
-# include <AK/Assertions.h>
-# include <AK/Atomic.h>
-# include <AK/Format.h>
-# include <AK/Traits.h>
-# include <AK/Types.h>
+#include <AK/Assertions.h>
+#include <AK/Atomic.h>
+#include <AK/Format.h>
+#include <AK/Traits.h>
+#include <AK/Types.h>
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<T*>(explode_byte(NONNULLREFPTR_SCRUB_BYTE));
-# endif
+#endif
}
template<typename U>
@@ -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<T> adopt_ref(T& object)
}
template<typename T>
-struct Formatter<NonnullRefPtr<T>> : Formatter<const T*> {
+struct Formatter<NonnullRefPtr<T>> : Formatter<T const*> {
ErrorOr<void> format(FormatBuilder& builder, NonnullRefPtr<T> const& value)
{
- return Formatter<const T*>::format(builder, value.ptr());
+ return Formatter<T const*>::format(builder, value.ptr());
}
};
@@ -275,7 +272,7 @@ inline NonnullRefPtr<T> make_ref_counted(Args&&... args)
template<typename T>
struct Traits<NonnullRefPtr<T>> : public GenericTraits<NonnullRefPtr<T>> {
using PeekType = T*;
- using ConstPeekType = const T*;
+ using ConstPeekType = T const*;
static unsigned hash(NonnullRefPtr<T> const& p) { return ptr_hash(p.ptr()); }
static bool equals(NonnullRefPtr<T> const& a, NonnullRefPtr<T> const& b) { return a.ptr() == b.ptr(); }
};
@@ -283,5 +280,3 @@ struct Traits<NonnullRefPtr<T>> : public GenericTraits<NonnullRefPtr<T>> {
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 <Kernel/Library/ThreadSafeRefPtr.h>
-#else
-
-# include <AK/Assertions.h>
-# include <AK/Atomic.h>
-# include <AK/Error.h>
-# include <AK/Format.h>
-# include <AK/NonnullRefPtr.h>
-# include <AK/StdLibExtras.h>
-# include <AK/Traits.h>
-# include <AK/Types.h>
+#include <AK/Assertions.h>
+#include <AK/Atomic.h>
+#include <AK/Error.h>
+#include <AK/Format.h>
+#include <AK/NonnullRefPtr.h>
+#include <AK/StdLibExtras.h>
+#include <AK/Traits.h>
+#include <AK/Types.h>
namespace AK {
@@ -104,9 +100,9 @@ public:
ALWAYS_INLINE ~RefPtr()
{
clear();
-# ifdef SANITIZE_PTRS
+#ifdef SANITIZE_PTRS
m_ptr = reinterpret_cast<T*>(explode_byte(REFPTR_SCRUB_BYTE));
-# endif
+#endif
}
template<typename U>
@@ -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<typename U>
bool operator!=(NonnullRefPtr<U>& 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<typename T>
-struct Formatter<RefPtr<T>> : Formatter<const T*> {
+struct Formatter<RefPtr<T>> : Formatter<T const*> {
ErrorOr<void> format(FormatBuilder& builder, RefPtr<T> const& value)
{
- return Formatter<const T*>::format(builder, value.ptr());
+ return Formatter<T const*>::format(builder, value.ptr());
}
};
template<typename T>
struct Traits<RefPtr<T>> : public GenericTraits<RefPtr<T>> {
using PeekType = T*;
- using ConstPeekType = const T*;
+ using ConstPeekType = T const*;
static unsigned hash(RefPtr<T> const& p) { return ptr_hash(p.ptr()); }
static bool equals(RefPtr<T> const& a, RefPtr<T> const& b) { return a.ptr() == b.ptr(); }
};
@@ -324,13 +320,13 @@ struct Traits<RefPtr<T>> : public GenericTraits<RefPtr<T>> {
template<typename T, typename U>
inline NonnullRefPtr<T> static_ptr_cast(NonnullRefPtr<U> const& ptr)
{
- return NonnullRefPtr<T>(static_cast<const T&>(*ptr));
+ return NonnullRefPtr<T>(static_cast<T const&>(*ptr));
}
template<typename T, typename U>
inline RefPtr<T> static_ptr_cast(RefPtr<U> const& ptr)
{
- return RefPtr<T>(static_cast<const T*>(ptr.ptr()));
+ return RefPtr<T>(static_cast<T const*>(ptr.ptr()));
}
template<typename T, typename U>
@@ -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 <Kernel/Library/ThreadSafeWeakPtr.h>
-#else
-
-# include <AK/Weakable.h>
+#include <AK/Weakable.h>
namespace AK {
@@ -185,4 +181,3 @@ WeakPtr<T> 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 <Kernel/Library/ThreadSafeWeakable.h>
-#else
-# include <AK/Assertions.h>
-# include <AK/Atomic.h>
-# include <AK/RefCounted.h>
-# include <AK/RefPtr.h>
-# include <AK/StdLibExtras.h>
-# include <sched.h>
+#include <AK/Assertions.h>
+#include <AK/Atomic.h>
+#include <AK/RefCounted.h>
+#include <AK/RefPtr.h>
+#include <AK/StdLibExtras.h>
+#include <sched.h>
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::AllInstancesList>& Inode::all_instances()
return s_all_instances;
}
-RefPtr<Memory::SharedInodeVMObject> Inode::shared_vmobject() const
+LockRefPtr<Memory::SharedInodeVMObject> Inode::shared_vmobject() const
{
VERIFY_NOT_REACHED();
- return RefPtr<Memory::SharedInodeVMObject>(nullptr);
+ return LockRefPtr<Memory::SharedInodeVMObject>(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<RefPtr<IRQController>> const& InterruptManagement::controllers()
+Vector<LockRefPtr<IRQController>> const& InterruptManagement::controllers()
{
return m_interrupt_controllers;
}
-RefPtr<IRQController> InterruptManagement::get_responsible_irq_controller(u8)
+LockRefPtr<IRQController> 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 <AK/RefPtr.h>
#include <AK/Vector.h>
#include <Kernel/Arch/aarch64/IRQController.h>
+#include <Kernel/Library/LockRefPtr.h>
namespace Kernel {
@@ -20,14 +20,14 @@ public:
static u8 acquire_mapped_interrupt_number(u8 original_irq);
- Vector<RefPtr<IRQController>> const& controllers();
- RefPtr<IRQController> get_responsible_irq_controller(u8 interrupt_vector);
+ Vector<LockRefPtr<IRQController>> const& controllers();
+ LockRefPtr<IRQController> get_responsible_irq_controller(u8 interrupt_vector);
private:
InterruptManagement() = default;
void find_controllers();
- Vector<RefPtr<IRQController>> m_interrupt_controllers;
+ Vector<LockRefPtr<IRQController>> 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> PageDirectory::find_current()
+LockRefPtr<PageDirectory> 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<Graphics::BootFramebufferConsole>(framebuffer.gpu_buffer(), framebuffer.width(), framebuffer.width(), framebuffer.pitch()).value().leak_ref();
+ g_boot_console = &try_make_lock_ref_counted<Graphics::BootFramebufferConsole>(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 <AK/Function.h>
#include <AK/NonnullOwnPtr.h>
#include <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Arch/x86/IRQController.h>
#include <Kernel/Firmware/ACPI/Definitions.h>
#include <Kernel/Interrupts/GenericInterruptHandler.h>
#include <Kernel/Interrupts/IOAPIC.h>
+#include <Kernel/Library/LockRefPtr.h>
namespace Kernel {
@@ -52,8 +52,8 @@ public:
virtual void switch_to_ioapic_mode();
bool smp_enabled() const { return m_smp_enabled; }
- RefPtr<IRQController> get_responsible_irq_controller(u8 interrupt_vector);
- RefPtr<IRQController> get_responsible_irq_controller(IRQControllerType controller_type, u8 interrupt_vector);
+ LockRefPtr<IRQController> get_responsible_irq_controller(u8 interrupt_vector);
+ LockRefPtr<IRQController> get_responsible_irq_controller(IRQControllerType controller_type, u8 interrupt_vector);
Vector<ISAInterruptOverrideMetadata> 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<RefPtr<IRQController>> m_interrupt_controllers;
+ Vector<LockRefPtr<IRQController>> m_interrupt_controllers;
Vector<ISAInterruptOverrideMetadata> m_isa_interrupt_overrides;
Vector<PCIInterruptOverrideMetadata> 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<IRQController> InterruptManagement::get_responsible_irq_controller(IRQControllerType controller_type, u8 interrupt_vector)
+LockRefPtr<IRQController> 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<IRQController> InterruptManagement::get_responsible_irq_controller(IRQCon
VERIFY_NOT_REACHED();
}
-RefPtr<IRQController> InterruptManagement::get_responsible_irq_controller(u8 interrupt_vector)
+LockRefPtr<IRQController> 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 <AK/Format.h>
+#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Arch/Interrupts.h>
@@ -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> PageDirectory::find_current()
+LockRefPtr<PageDirectory> 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<NonnullRefPtr<UHCIController>> UHCIController::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier)
+ErrorOr<NonnullLockRefPtr<UHCIController>> 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<void> UHCIController::spawn_port_process()
{
- RefPtr<Thread> usb_hotplug_thread;
+ LockRefPtr<Thread> 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<NonnullRefPtr<UHCIController>> try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier);
+ static ErrorOr<NonnullLockRefPtr<UHCIController>> 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<NonnullOwnPtr<UHCIRootHub>> UHCIRootHub::try_create(NonnullRefPtr<UHCIController> uhci_controller)
+ErrorOr<NonnullOwnPtr<UHCIRootHub>> UHCIRootHub::try_create(NonnullLockRefPtr<UHCIController> uhci_controller)
{
return adopt_nonnull_own_or_enomem(new (nothrow) UHCIRootHub(move(uhci_controller)));
}
-UHCIRootHub::UHCIRootHub(NonnullRefPtr<UHCIController> uhci_controller)
+UHCIRootHub::UHCIRootHub(NonnullLockRefPtr<UHCIController> 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 <AK/Error.h>
#include <AK/NonnullOwnPtr.h>
-#include <AK/NonnullRefPtr.h>
#include <Kernel/Bus/USB/USBHub.h>
#include <Kernel/Bus/USB/USBTransfer.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
namespace Kernel::USB {
@@ -18,9 +18,9 @@ class UHCIController;
class UHCIRootHub {
public:
- static ErrorOr<NonnullOwnPtr<UHCIRootHub>> try_create(NonnullRefPtr<UHCIController>);
+ static ErrorOr<NonnullOwnPtr<UHCIRootHub>> try_create(NonnullLockRefPtr<UHCIController>);
- UHCIRootHub(NonnullRefPtr<UHCIController>);
+ UHCIRootHub(NonnullLockRefPtr<UHCIController>);
~UHCIRootHub() = default;
ErrorOr<void> setup(Badge<UHCIController>);
@@ -32,8 +32,8 @@ public:
void check_for_port_updates() { m_hub->check_for_port_updates(); }
private:
- NonnullRefPtr<UHCIController> m_uhci_controller;
- RefPtr<Hub> m_hub;
+ NonnullLockRefPtr<UHCIController> m_uhci_controller;
+ LockRefPtr<Hub> 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<USBController, NonnullRefPtr<USBController>> m_controller_list_node;
+ IntrusiveListNode<USBController, NonnullLockRefPtr<USBController>> 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<NonnullRefPtr<Device>> Device::try_create(USBController const& controller, u8 port, DeviceSpeed speed)
+ErrorOr<NonnullLockRefPtr<Device>> 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<USBController> controller, u8 address, u8 port, DeviceSpeed speed, NonnullOwnPtr<Pipe> default_pipe)
+Device::Device(NonnullLockRefPtr<USBController> controller, u8 address, u8 port, DeviceSpeed speed, NonnullOwnPtr<Pipe> 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<NonnullRefPtr<Device>> try_create(USBController const&, u8, DeviceSpeed);
+ static ErrorOr<NonnullLockRefPtr<Device>> try_create(USBController const&, u8, DeviceSpeed);
Device(USBController const&, u8, DeviceSpeed, NonnullOwnPtr<Pipe> default_pipe);
Device(Device const& device, NonnullOwnPtr<Pipe> default_pipe);
@@ -59,7 +59,7 @@ public:
SysFSUSBDeviceInformation& sysfs_device_info_node(Badge<USB::Hub>) { return *m_sysfs_device_info_node; }
protected:
- Device(NonnullRefPtr<USBController> controller, u8 address, u8 port, DeviceSpeed speed, NonnullOwnPtr<Pipe> default_pipe);
+ Device(NonnullLockRefPtr<USBController> controller, u8 address, u8 port, DeviceSpeed speed, NonnullOwnPtr<Pipe> 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<USBConfiguration> m_configurations; // Configurations for this device
- NonnullRefPtr<USBController> m_controller;
+ NonnullLockRefPtr<USBController> m_controller;
NonnullOwnPtr<Pipe> m_default_pipe; // Default communication pipe (endpoint0) used during enumeration
private:
- IntrusiveListNode<Device, NonnullRefPtr<Device>> m_hub_child_node;
+ IntrusiveListNode<Device, NonnullLockRefPtr<Device>> m_hub_child_node;
protected:
- RefPtr<SysFSUSBDeviceInformation> m_sysfs_device_info_node;
+ LockRefPtr<SysFSUSBDeviceInformation> 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<NonnullRefPtr<Hub>> Hub::try_create_root_hub(NonnullRefPtr<USBController> controller, DeviceSpeed device_speed)
+ErrorOr<NonnullLockRefPtr<Hub>> Hub::try_create_root_hub(NonnullLockRefPtr<USBController> 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<NonnullRefPtr<Hub>> Hub::try_create_from_device(Device const& device)
+ErrorOr<NonnullLockRefPtr<Hub>> 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<USBController> controller, DeviceSpeed device_speed, NonnullOwnPtr<Pipe> default_pipe)
+Hub::Hub(NonnullLockRefPtr<USBController> controller, DeviceSpeed device_speed, NonnullOwnPtr<Pipe> 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> device_to_remove = nullptr;
+ LockRefPtr<Device> 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<NonnullRefPtr<Hub>> try_create_root_hub(NonnullRefPtr<USBController>, DeviceSpeed);
- static ErrorOr<NonnullRefPtr<Hub>> try_create_from_device(Device const&);
+ static ErrorOr<NonnullLockRefPtr<Hub>> try_create_root_hub(NonnullLockRefPtr<USBController>, DeviceSpeed);
+ static ErrorOr<NonnullLockRefPtr<Hub>> try_create_from_device(Device const&);
virtual ~Hub() override = default;
@@ -96,7 +96,7 @@ public:
private:
// Root Hub constructor
- Hub(NonnullRefPtr<USBController>, DeviceSpeed, NonnullOwnPtr<Pipe> default_pipe);
+ Hub(NonnullLockRefPtr<USBController>, DeviceSpeed, NonnullOwnPtr<Pipe> default_pipe);
Hub(Device const&, NonnullOwnPtr<Pipe> 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 <AK/NonnullRefPtr.h>
-#include <AK/NonnullRefPtrVector.h>
#include <Kernel/Bus/USB/USBController.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
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<USBController> m_controller;
+ NonnullLockRefPtr<USBController> 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<NonnullRefPtr<Transfer>> Transfer::try_create(Pipe& pipe, u16 length, Memory::Region& dma_buffer)
+ErrorOr<NonnullLockRefPtr<Transfer>> 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 <AK/AtomicRefCounted.h>
#include <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <Kernel/Bus/USB/PacketTypes.h>
#include <Kernel/Bus/USB/USBPipe.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Memory/AnonymousVMObject.h>
#include <Kernel/Memory/PhysicalPage.h>
#include <Kernel/Memory/Region.h>
@@ -20,7 +20,7 @@ namespace Kernel::USB {
class Transfer final : public AtomicRefCounted<Transfer> {
public:
- static ErrorOr<NonnullRefPtr<Transfer>> try_create(Pipe&, u16 length, Memory::Region& dma_buffer);
+ static ErrorOr<NonnullLockRefPtr<Transfer>> 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> Console::must_create(PCI::DeviceIdentifier const& pci_device_identifier)
+UNMAP_AFTER_INIT NonnullLockRefPtr<Console> 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<Console> must_create(PCI::DeviceIdentifier const&);
+ static NonnullLockRefPtr<Console> 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<RefPtr<ConsolePort>> m_ports;
+ Vector<LockRefPtr<ConsolePort>> 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<NonnullRefPtr<ConsolePort>> ConsolePort::try_create(unsigned port, Console& console)
+ErrorOr<NonnullLockRefPtr<ConsolePort>> 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<Memory::RingBuffer> receive_buffer, NonnullOwnPtr<Memory::RingBuffer> transmit_buffer)
@@ -161,7 +161,7 @@ ErrorOr<size_t> ConsolePort::write(OpenFileDescription& desc, u64, UserOrKernelB
return total_bytes_copied;
}
-ErrorOr<NonnullRefPtr<OpenFileDescription>> ConsolePort::open(int options)
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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<NonnullRefPtr<ConsolePort>> try_create(unsigned port, VirtIO::Console&);
+ static ErrorOr<NonnullLockRefPtr<ConsolePort>> try_create(unsigned port, VirtIO::Console&);
void handle_queue_update(Badge<VirtIO::Console>, u16 queue_index);
@@ -44,7 +44,7 @@ private:
virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
virtual bool can_write(OpenFileDescription const&, u64) const override;
virtual ErrorOr<size_t> write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override;
- virtual ErrorOr<NonnullRefPtr<OpenFileDescription>> open(int options) override;
+ virtual ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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> RNG::must_create(PCI::DeviceIdentifier const& device_identifier)
+UNMAP_AFTER_INIT NonnullLockRefPtr<RNG> 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<RNG>
, public VirtIO::Device {
public:
- static NonnullRefPtr<RNG> must_create(PCI::DeviceIdentifier const&);
+ static NonnullLockRefPtr<RNG> 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<NonnullOwnPtr<Coredump>> Coredump::try_create(NonnullRefPtr<Process> process, StringView output_path)
+ErrorOr<NonnullOwnPtr<Coredump>> Coredump::try_create(NonnullLockRefPtr<Process> 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<NonnullOwnPtr<Coredump>> Coredump::try_create(NonnullRefPtr<Process> pro
return adopt_nonnull_own_or_enomem(new (nothrow) Coredump(move(process), move(description)));
}
-Coredump::Coredump(NonnullRefPtr<Process> process, NonnullRefPtr<OpenFileDescription> description)
+Coredump::Coredump(NonnullLockRefPtr<Process> process, NonnullLockRefPtr<OpenFileDescription> description)
: m_process(move(process))
, m_description(move(description))
{
@@ -59,7 +59,7 @@ Coredump::Coredump(NonnullRefPtr<Process> process, NonnullRefPtr<OpenFileDescrip
++m_num_program_headers; // +1 for NOTE segment
}
-ErrorOr<NonnullRefPtr<OpenFileDescription>> Coredump::try_create_target_file(Process const& process, StringView output_path)
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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 <AK/NonnullRefPtr.h>
#include <AK/OwnPtr.h>
#include <Kernel/Forward.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
namespace Kernel {
class Coredump {
public:
- static ErrorOr<NonnullOwnPtr<Coredump>> try_create(NonnullRefPtr<Process>, StringView output_path);
+ static ErrorOr<NonnullOwnPtr<Coredump>> try_create(NonnullLockRefPtr<Process>, StringView output_path);
~Coredump() = default;
ErrorOr<void> write();
private:
- Coredump(NonnullRefPtr<Process>, NonnullRefPtr<OpenFileDescription>);
- static ErrorOr<NonnullRefPtr<OpenFileDescription>> try_create_target_file(Process const&, StringView output_path);
+ Coredump(NonnullLockRefPtr<Process>, NonnullLockRefPtr<OpenFileDescription>);
+ static ErrorOr<NonnullLockRefPtr<OpenFileDescription>> try_create_target_file(Process const&, StringView output_path);
ErrorOr<void> write_elf_header();
ErrorOr<void> write_program_headers(size_t notes_size);
@@ -35,8 +35,8 @@ private:
ErrorOr<void> create_notes_regions_data(auto&) const;
ErrorOr<void> create_notes_metadata_data(auto&) const;
- NonnullRefPtr<Process> m_process;
- NonnullRefPtr<OpenFileDescription> m_description;
+ NonnullLockRefPtr<Process> m_process;
+ NonnullLockRefPtr<OpenFileDescription> 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<AsyncDeviceRequest> sub_request)
+void AsyncDeviceRequest::add_sub_request(NonnullLockRefPtr<AsyncDeviceRequest> 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 <AK/IntrusiveList.h>
-#include <AK/NonnullRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
#include <Kernel/Memory/ScopedAddressSpaceSwitcher.h>
#include <Kernel/Process.h>
#include <Kernel/Thread.h>
@@ -58,7 +58,7 @@ public:
virtual StringView name() const = 0;
virtual void start() = 0;
- void add_sub_request(NonnullRefPtr<AsyncDeviceRequest>);
+ void add_sub_request(NonnullLockRefPtr<AsyncDeviceRequest>);
[[nodiscard]] RequestWaitResult wait(Time* = nullptr);
@@ -142,14 +142,14 @@ private:
AsyncDeviceRequest* m_parent_request { nullptr };
RequestResult m_result { Pending };
- IntrusiveListNode<AsyncDeviceRequest, RefPtr<AsyncDeviceRequest>> m_list_node;
+ IntrusiveListNode<AsyncDeviceRequest, LockRefPtr<AsyncDeviceRequest>> m_list_node;
using AsyncDeviceSubRequestList = IntrusiveList<&AsyncDeviceRequest::m_list_node>;
AsyncDeviceSubRequestList m_sub_requests_pending;
AsyncDeviceSubRequestList m_sub_requests_complete;
WaitQueue m_queue;
- NonnullRefPtr<Process> m_process;
+ NonnullLockRefPtr<Process> 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<NonnullRefPtr<AC97>> AC97::try_create(PCI::DeviceIdentifier const& pci_device_identifier)
+UNMAP_AFTER_INIT ErrorOr<NonnullLockRefPtr<AC97>> 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<AudioChannel> AC97::audio_channel(u32 index) const
+LockRefPtr<AudioChannel> 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<NonnullRefPtr<AC97>> try_create(PCI::DeviceIdentifier const&);
+ static ErrorOr<NonnullLockRefPtr<AC97>> try_create(PCI::DeviceIdentifier const&);
virtual ~AC97() override;
@@ -161,7 +161,7 @@ private:
ErrorOr<void> write_single_buffer(UserOrKernelBuffer const&, size_t, size_t);
// ^AudioController
- virtual RefPtr<AudioChannel> audio_channel(u32 index) const override;
+ virtual LockRefPtr<AudioChannel> audio_channel(u32 index) const override;
virtual ErrorOr<size_t> write(size_t channel_index, UserOrKernelBuffer const& data, size_t length) override;
virtual void detect_hardware_audio_channels(Badge<AudioManagement>) override;
virtual ErrorOr<void> 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<AudioChannel> m_audio_channel;
+ LockRefPtr<AudioChannel> 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> AudioChannel::must_create(AudioController const& controller, size_t channel_index)
+UNMAP_AFTER_INIT NonnullLockRefPtr<AudioChannel> AudioChannel::must_create(AudioController const& controller, size_t channel_index)
{
auto audio_device_or_error = DeviceManagement::try_create_device<AudioChannel>(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<AudioChannel> must_create(AudioController const&, size_t channel_index);
+ static NonnullLockRefPtr<AudioChannel> 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<AudioController> m_controller;
+ LockWeakPtr<AudioController> 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 <AK/IntrusiveList.h>
#include <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
-#include <AK/Weakable.h>
#include <Kernel/Bus/PCI/Access.h>
#include <Kernel/Bus/PCI/Device.h>
#include <Kernel/Devices/Audio/Channel.h>
#include <Kernel/Devices/Device.h>
+#include <Kernel/Library/LockRefPtr.h>
+#include <Kernel/Library/LockWeakable.h>
#include <Kernel/Locking/Mutex.h>
#include <Kernel/Memory/PhysicalPage.h>
#include <Kernel/PhysicalAddress.h>
@@ -24,13 +24,13 @@ namespace Kernel {
class AudioManagement;
class AudioController
: public AtomicRefCounted<AudioController>
- , public Weakable<AudioController> {
+ , public LockWeakable<AudioController> {
friend class AudioManagement;
public:
virtual ~AudioController() = default;
- virtual RefPtr<AudioChannel> audio_channel(u32 index) const = 0;
+ virtual LockRefPtr<AudioChannel> audio_channel(u32 index) const = 0;
virtual ErrorOr<size_t> write(size_t channel_index, UserOrKernelBuffer const& data, size_t length) = 0;
virtual void detect_hardware_audio_channels(Badge<AudioManagement>) = 0;
@@ -40,6 +40,6 @@ public:
virtual ErrorOr<u32> get_pcm_output_sample_rate(size_t channel_index) = 0;
private:
- IntrusiveListNode<AudioController, RefPtr<AudioController>> m_node;
+ IntrusiveListNode<AudioController, LockRefPtr<AudioController>> 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 <AK/Error.h>
#include <AK/IntrusiveList.h>
#include <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Time.h>
#include <AK/Types.h>
#include <Kernel/Devices/Audio/Controller.h>
+#include <Kernel/Library/LockRefPtr.h>
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 <AK/IntegralMath.h>
-#include <AK/Weakable.h>
#include <Kernel/Devices/Device.h>
+#include <Kernel/Library/LockWeakable.h>
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> ConsoleDevice::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ConsoleDevice> ConsoleDevice::must_create()
{
auto device_or_error = DeviceManagement::try_create_device<ConsoleDevice>();
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<ConsoleDevice> must_create();
+ static NonnullLockRefPtr<ConsoleDevice> 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 <AK/Error.h>
#include <AK/Function.h>
#include <AK/HashMap.h>
-#include <AK/RefPtr.h>
#include <Kernel/Devices/AsyncDeviceRequest.h>
#include <Kernel/FileSystem/DeviceFileTypes.h>
#include <Kernel/FileSystem/File.h>
#include <Kernel/FileSystem/SysFS/Registry.h>
#include <Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/DeviceComponent.h>
#include <Kernel/FileSystem/SysFS/Subsystems/DeviceIdentifiers/SymbolicLinkDeviceComponent.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/UnixTypes.h>
namespace Kernel {
@@ -53,9 +53,9 @@ public:
void process_next_queued_request(Badge<AsyncDeviceRequest>, AsyncDeviceRequest const&);
template<typename AsyncRequestType, typename... Args>
- ErrorOr<NonnullRefPtr<AsyncRequestType>> try_make_request(Args&&... args)
+ ErrorOr<NonnullLockRefPtr<AsyncRequestType>> try_make_request(Args&&... args)
{
- auto request = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) AsyncRequestType(*this, forward<Args>(args)...)));
+ auto request = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) AsyncRequestType(*this, forward<Args>(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<RefPtr<AsyncDeviceRequest>> m_requests;
+ DoublyLinkedList<LockRefPtr<AsyncDeviceRequest>> m_requests;
protected:
// FIXME: This pointer will be eventually removed after all nodes in /sys/dev/block/ and
// /sys/dev/char/ are symlinks.
- RefPtr<SysFSDeviceComponent> m_sysfs_component;
+ LockRefPtr<SysFSDeviceComponent> m_sysfs_component;
- RefPtr<SysFSSymbolicLinkDeviceComponent> m_symlink_sysfs_component;
- RefPtr<SysFSDirectory> m_sysfs_device_directory;
+ LockRefPtr<SysFSSymbolicLinkDeviceComponent> m_symlink_sysfs_component;
+ LockRefPtr<SysFSDirectory> 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> DeviceControlDevice::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<DeviceControlDevice> DeviceControlDevice::must_create()
{
auto device_control_device_or_error = DeviceManagement::try_create_device<DeviceControlDevice>();
// 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<DeviceControlDevice> must_create();
+ static NonnullLockRefPtr<DeviceControlDevice> 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 <AK/Badge.h>
#include <AK/Error.h>
-#include <AK/NonnullRefPtrVector.h>
#include <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Time.h>
#include <AK/Types.h>
#include <Kernel/API/DeviceEvent.h>
@@ -21,6 +19,8 @@
#include <Kernel/Devices/Device.h>
#include <Kernel/Devices/DeviceControlDevice.h>
#include <Kernel/Devices/NullDevice.h>
+#include <Kernel/Library/LockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/UnixTypes.h>
namespace Kernel {
@@ -54,7 +54,7 @@ public:
ConsoleDevice& console_device();
template<typename DeviceType, typename... Args>
- static inline ErrorOr<NonnullRefPtr<DeviceType>> try_create_device(Args&&... args) requires(requires(Args... args) { DeviceType::try_create(args...); })
+ static inline ErrorOr<NonnullLockRefPtr<DeviceType>> try_create_device(Args&&... args) requires(requires(Args... args) { DeviceType::try_create(args...); })
{
auto device = TRY(DeviceType::try_create(forward<Args>(args)...));
device->after_inserting();
@@ -62,17 +62,17 @@ public:
}
template<typename DeviceType, typename... Args>
- static inline ErrorOr<NonnullRefPtr<DeviceType>> try_create_device(Args&&... args)
+ static inline ErrorOr<NonnullLockRefPtr<DeviceType>> try_create_device(Args&&... args)
{
- auto device = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DeviceType(forward<Args>(args)...)));
+ auto device = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DeviceType(forward<Args>(args)...)));
device->after_inserting();
return device;
}
private:
- RefPtr<NullDevice> m_null_device;
- RefPtr<ConsoleDevice> m_console_device;
- RefPtr<DeviceControlDevice> m_device_control_device;
+ LockRefPtr<NullDevice> m_null_device;
+ LockRefPtr<ConsoleDevice> m_console_device;
+ LockRefPtr<DeviceControlDevice> m_device_control_device;
// FIXME: Once we have a singleton for managing many sound cards, remove this from here
SpinlockProtected<HashMap<u64, Device*>> 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> FullDevice::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<FullDevice> FullDevice::must_create()
{
auto full_device_or_error = DeviceManagement::try_create_device<FullDevice>();
// 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<FullDevice> must_create();
+ static NonnullLockRefPtr<FullDevice> 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 <AK/Atomic.h>
#include <AK/CircularQueue.h>
#include <AK/Error.h>
-#include <AK/NonnullRefPtrVector.h>
-#include <AK/RefPtr.h>
#include <AK/Time.h>
#include <AK/Types.h>
#include <Kernel/API/KeyCode.h>
#include <Kernel/API/MousePacket.h>
+#include <Kernel/Library/LockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Locking/SpinlockProtected.h>
#include <Kernel/UnixTypes.h>
@@ -61,8 +61,8 @@ private:
size_t m_mouse_minor_number { 0 };
size_t m_keyboard_minor_number { 0 };
KeyboardClient* m_client { nullptr };
- RefPtr<I8042Controller> m_i8042_controller;
- NonnullRefPtrVector<HIDDevice> m_hid_devices;
+ LockRefPtr<I8042Controller> m_i8042_controller;
+ NonnullLockRefPtrVector<HIDDevice> 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> I8042Controller::initialize()
+UNMAP_AFTER_INIT NonnullLockRefPtr<I8042Controller> I8042Controller::initialize()
{
- return adopt_ref(*new I8042Controller());
+ return adopt_lock_ref(*new I8042Controller());
}
-RefPtr<MouseDevice> I8042Controller::mouse() const
+LockRefPtr<MouseDevice> I8042Controller::mouse() const
{
return m_mouse_device;
}
-RefPtr<KeyboardDevice> I8042Controller::keyboard() const
+LockRefPtr<KeyboardDevice> 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<I8042Controller> m_i8042_controller;
+ NonnullLockRefPtr<I8042Controller> m_i8042_controller;
};
class PS2KeyboardDevice;
@@ -88,7 +88,7 @@ class I8042Controller final : public AtomicRefCounted<I8042Controller> {
friend class PS2MouseDevice;
public:
- static NonnullRefPtr<I8042Controller> initialize();
+ static NonnullLockRefPtr<I8042Controller> initialize();
ErrorOr<void> detect_devices();
@@ -132,8 +132,8 @@ public:
bool irq_process_input_buffer(HIDDevice::Type);
- RefPtr<MouseDevice> mouse() const;
- RefPtr<KeyboardDevice> keyboard() const;
+ LockRefPtr<MouseDevice> mouse() const;
+ LockRefPtr<KeyboardDevice> keyboard() const;
// Note: This function exists only for the initialization process of the controller
bool check_existence_via_probing(Badge<HIDManagement>);
@@ -157,8 +157,8 @@ private:
bool m_first_port_available { false };
bool m_second_port_available { false };
bool m_is_dual_channel { false };
- RefPtr<MouseDevice> m_mouse_device;
- RefPtr<KeyboardDevice> m_keyboard_device;
+ LockRefPtr<MouseDevice> m_mouse_device;
+ LockRefPtr<KeyboardDevice> 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<NonnullRefPtr<PS2KeyboardDevice>> PS2KeyboardDevice::try_to_initialize(I8042Controller const& ps2_controller)
+UNMAP_AFTER_INIT ErrorOr<NonnullLockRefPtr<PS2KeyboardDevice>> PS2KeyboardDevice::try_to_initialize(I8042Controller const& ps2_controller)
{
auto keyboard_device = TRY(DeviceManagement::try_create_device<PS2KeyboardDevice>(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<NonnullRefPtr<PS2KeyboardDevice>> try_to_initialize(I8042Controller const&);
+ static ErrorOr<NonnullLockRefPtr<PS2KeyboardDevice>> try_to_initialize(I8042Controller const&);
virtual ~PS2KeyboardDevice() override;
ErrorOr<void> 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<void> PS2MouseDevice::set_sample_rate(u8 rate)
return {};
}
-UNMAP_AFTER_INIT ErrorOr<NonnullRefPtr<PS2MouseDevice>> PS2MouseDevice::try_to_initialize(I8042Controller const& ps2_controller)
+UNMAP_AFTER_INIT ErrorOr<NonnullLockRefPtr<PS2MouseDevice>> PS2MouseDevice::try_to_initialize(I8042Controller const& ps2_controller)
{
auto mouse_device = TRY(DeviceManagement::try_create_device<PS2MouseDevice>(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<NonnullRefPtr<PS2MouseDevice>> try_to_initialize(I8042Controller const&);
+ static ErrorOr<NonnullLockRefPtr<PS2MouseDevice>> try_to_initialize(I8042Controller const&);
ErrorOr<void> 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<NonnullRefPtr<VMWareMouseDevice>> VMWareMouseDevice::try_to_initialize(I8042Controller const& ps2_controller)
+UNMAP_AFTER_INIT ErrorOr<NonnullLockRefPtr<VMWareMouseDevice>> 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<NonnullRefPtr<VMWareMouseDevice>> try_to_initialize(I8042Controller const&);
+ static ErrorOr<NonnullLockRefPtr<VMWareMouseDevice>> 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<ProcessID, KCOVInstance*>* KCOVDevice::proc_instance;
HashMap<ThreadID, KCOVInstance*>* KCOVDevice::thread_instance;
-UNMAP_AFTER_INIT NonnullRefPtr<KCOVDevice> KCOVDevice::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<KCOVDevice> KCOVDevice::must_create()
{
auto kcov_device_or_error = DeviceManagement::try_create_device<KCOVDevice>();
// FIXME: Find a way to propagate errors
@@ -65,7 +65,7 @@ void KCOVDevice::free_process()
delete kcov_instance;
}
-ErrorOr<NonnullRefPtr<OpenFileDescription>> KCOVDevice::open(int options)
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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<ProcessID, KCOVInstance*>* proc_instance;
static HashMap<ThreadID, KCOVInstance*>* thread_instance;
- static NonnullRefPtr<KCOVDevice> must_create();
+ static NonnullLockRefPtr<KCOVDevice> must_create();
static void free_thread();
static void free_process();
// ^File
ErrorOr<Memory::Region*> mmap(Process&, OpenFileDescription&, Memory::VirtualRange const&, u64 offset, int prot, bool shared) override;
- ErrorOr<NonnullRefPtr<OpenFileDescription>> open(int options) override;
+ ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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<Memory::AnonymousVMObject> m_vmobject;
+ LockRefPtr<Memory::AnonymousVMObject> m_vmobject;
// Here to ensure it's not garbage collected at the end of open()
OwnPtr<Memory::Region> 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> MemoryDevice::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<MemoryDevice> MemoryDevice::must_create()
{
auto memory_device_or_error = DeviceManagement::try_create_device<MemoryDevice>();
// 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<MemoryDevice> must_create();
+ static NonnullLockRefPtr<MemoryDevice> must_create();
~MemoryDevice();
virtual ErrorOr<Memory::Region*> 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> NullDevice::must_initialize()
+UNMAP_AFTER_INIT NonnullLockRefPtr<NullDevice> NullDevice::must_initialize()
{
auto null_device_or_error = DeviceManagement::try_create_device<NullDevice>();
// 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<NullDevice> must_initialize();
+ static NonnullLockRefPtr<NullDevice> 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> RandomDevice::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<RandomDevice> RandomDevice::must_create()
{
auto random_device_or_error = DeviceManagement::try_create_device<RandomDevice>();
// 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<RandomDevice> must_create();
+ static NonnullLockRefPtr<RandomDevice> 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> SelfTTYDevice::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<SelfTTYDevice> SelfTTYDevice::must_create()
{
auto self_tty_device_or_error = DeviceManagement::try_create_device<SelfTTYDevice>();
// FIXME: Find a way to propagate errors
@@ -19,14 +19,14 @@ UNMAP_AFTER_INIT NonnullRefPtr<SelfTTYDevice> SelfTTYDevice::must_create()
return self_tty_device_or_error.release_value();
}
-ErrorOr<NonnullRefPtr<OpenFileDescription>> SelfTTYDevice::open(int options)
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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> tty = current_process.tty();
+ LockRefPtr<TTY> 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<SelfTTYDevice> must_create();
+ static NonnullLockRefPtr<SelfTTYDevice> must_create();
virtual ~SelfTTYDevice() override;
private:
SelfTTYDevice();
// ^CharacterDevice
- virtual ErrorOr<NonnullRefPtr<OpenFileDescription>> open(int options) override;
+ virtual ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open(int options) override;
virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
virtual ErrorOr<size_t> 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> SerialDevice::must_create(size_t com_number)
+UNMAP_AFTER_INIT NonnullLockRefPtr<SerialDevice> 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<SerialDevice> serial_device;
+ LockRefPtr<SerialDevice> serial_device;
switch (com_number) {
case 0: {
serial_device = DeviceManagement::try_create_device<SerialDevice>(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<SerialDevice> must_create(size_t com_number);
+ static NonnullLockRefPtr<SerialDevice> 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> ZeroDevice::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ZeroDevice> ZeroDevice::must_create()
{
auto zero_device_or_error = DeviceManagement::try_create_device<ZeroDevice>();
// 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<ZeroDevice> must_create();
+ static NonnullLockRefPtr<ZeroDevice> 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<Memory::AnonymousVMObject> vmobject)
+AnonymousFile::AnonymousFile(NonnullLockRefPtr<Memory::AnonymousVMObject> 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<NonnullRefPtr<AnonymousFile>> try_create(NonnullRefPtr<Memory::AnonymousVMObject> vmobject)
+ static ErrorOr<NonnullLockRefPtr<AnonymousFile>> try_create(NonnullLockRefPtr<Memory::AnonymousVMObject> 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<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override { return ENOTSUP; }
virtual ErrorOr<size_t> write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override { return ENOTSUP; }
- explicit AnonymousFile(NonnullRefPtr<Memory::AnonymousVMObject>);
+ explicit AnonymousFile(NonnullLockRefPtr<Memory::AnonymousVMObject>);
- NonnullRefPtr<Memory::AnonymousVMObject> m_vmobject;
+ NonnullLockRefPtr<Memory::AnonymousVMObject> 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::AllCustodiesList>& Custody::all_instances()
return s_all_instances;
}
-ErrorOr<NonnullRefPtr<Custody>> Custody::try_create(Custody* parent, StringView name, Inode& inode, int mount_flags)
+ErrorOr<NonnullLockRefPtr<Custody>> Custody::try_create(Custody* parent, StringView name, Inode& inode, int mount_flags)
{
- return all_instances().with([&](auto& all_custodies) -> ErrorOr<NonnullRefPtr<Custody>> {
+ return all_instances().with([&](auto& all_custodies) -> ErrorOr<NonnullLockRefPtr<Custody>> {
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 <AK/Error.h>
#include <AK/IntrusiveList.h>
-#include <AK/RefPtr.h>
#include <Kernel/Forward.h>
#include <Kernel/KString.h>
#include <Kernel/Library/ListedRefCounted.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Locking/SpinlockProtected.h>
namespace Kernel {
class Custody : public ListedRefCounted<Custody, LockType::Spinlock> {
public:
- static ErrorOr<NonnullRefPtr<Custody>> try_create(Custody* parent, StringView name, Inode&, int mount_flags);
+ static ErrorOr<NonnullLockRefPtr<Custody>> try_create(Custody* parent, StringView name, Inode&, int mount_flags);
~Custody();
@@ -35,9 +35,9 @@ public:
private:
Custody(Custody* parent, NonnullOwnPtr<KString> name, Inode&, int mount_flags);
- RefPtr<Custody> m_parent;
+ LockRefPtr<Custody> m_parent;
NonnullOwnPtr<KString> m_name;
- NonnullRefPtr<Inode> m_inode;
+ NonnullLockRefPtr<Inode> m_inode;
int m_mount_flags { 0 };
mutable IntrusiveListNode<Custody> 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<NonnullRefPtr<FileSystem>> DevPtsFS::try_create()
+ErrorOr<NonnullLockRefPtr<FileSystem>> 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<void> 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<NonnullRefPtr<Inode>> DevPtsFS::get_inode(InodeIdentifier inode_id) const
+ErrorOr<NonnullLockRefPtr<Inode>> DevPtsFS::get_inode(InodeIdentifier inode_id) const
{
if (inode_id.index() == 1)
return *m_root_inode;
@@ -57,7 +57,7 @@ ErrorOr<NonnullRefPtr<Inode>> 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<DevPtsFS&>(*this), inode_id.index(), static_cast<SlavePTY*>(device))));
+ auto inode = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DevPtsFSInode(const_cast<DevPtsFS&>(*this), inode_id.index(), static_cast<SlavePTY*>(device))));
inode->m_metadata.inode = inode_id;
inode->m_metadata.size = 0;
inode->m_metadata.uid = device->uid();
@@ -117,7 +117,7 @@ ErrorOr<void> DevPtsFSInode::traverse_as_directory(Function<ErrorOr<void>(FileSy
});
}
-ErrorOr<NonnullRefPtr<Inode>> DevPtsFSInode::lookup(StringView name)
+ErrorOr<NonnullLockRefPtr<Inode>> DevPtsFSInode::lookup(StringView name)
{
VERIFY(identifier().index() == 1);
@@ -128,7 +128,7 @@ ErrorOr<NonnullRefPtr<Inode>> DevPtsFSInode::lookup(StringView name)
if (!pty_index.has_value())
return ENOENT;
- return SlavePTY::all_instances().with([&](auto& list) -> ErrorOr<NonnullRefPtr<Inode>> {
+ return SlavePTY::all_instances().with([&](auto& list) -> ErrorOr<NonnullLockRefPtr<Inode>> {
for (SlavePTY& slave_pty : list) {
if (slave_pty.index() != pty_index.value())
continue;
@@ -148,7 +148,7 @@ ErrorOr<void> DevPtsFSInode::add_child(Inode&, StringView, mode_t)
return EROFS;
}
-ErrorOr<NonnullRefPtr<Inode>> DevPtsFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
+ErrorOr<NonnullLockRefPtr<Inode>> 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<NonnullRefPtr<FileSystem>> try_create();
+ static ErrorOr<NonnullLockRefPtr<FileSystem>> try_create();
virtual ErrorOr<void> initialize() override;
virtual StringView class_name() const override { return "DevPtsFS"sv; }
@@ -29,9 +29,9 @@ public:
private:
DevPtsFS();
- ErrorOr<NonnullRefPtr<Inode>> get_inode(InodeIdentifier) const;
+ ErrorOr<NonnullLockRefPtr<Inode>> get_inode(InodeIdentifier) const;
- RefPtr<DevPtsFSInode> m_root_inode;
+ LockRefPtr<DevPtsFSInode> m_root_inode;
};
class DevPtsFSInode final : public Inode {
@@ -50,16 +50,16 @@ private:
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
virtual InodeMetadata metadata() const override;
virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) override;
virtual ErrorOr<void> flush_metadata() override;
virtual ErrorOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const& buffer, OpenFileDescription*) override;
- virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override;
virtual ErrorOr<void> remove_child(StringView name) override;
virtual ErrorOr<void> chmod(mode_t) override;
virtual ErrorOr<void> chown(UserID, GroupID) override;
- WeakPtr<SlavePTY> m_pty;
+ LockWeakPtr<SlavePTY> 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<NonnullRefPtr<FileSystem>> DevTmpFS::try_create()
+ErrorOr<NonnullLockRefPtr<FileSystem>> 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<void> 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<void> DevTmpFSInode::traverse_as_directory(Function<ErrorOr<void>(FileSy
VERIFY_NOT_REACHED();
}
-ErrorOr<NonnullRefPtr<Inode>> DevTmpFSInode::lookup(StringView)
+ErrorOr<NonnullLockRefPtr<Inode>> DevTmpFSInode::lookup(StringView)
{
VERIFY_NOT_REACHED();
}
@@ -76,7 +76,7 @@ ErrorOr<size_t> DevTmpFSInode::write_bytes(off_t, size_t, UserOrKernelBuffer con
VERIFY_NOT_REACHED();
}
-ErrorOr<NonnullRefPtr<Inode>> DevTmpFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
+ErrorOr<NonnullLockRefPtr<Inode>> DevTmpFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
{
VERIFY_NOT_REACHED();
}
@@ -214,7 +214,7 @@ ErrorOr<void> DevTmpFSDirectoryInode::traverse_as_directory(Function<ErrorOr<voi
return {};
}
-ErrorOr<NonnullRefPtr<Inode>> DevTmpFSDirectoryInode::lookup(StringView name)
+ErrorOr<NonnullLockRefPtr<Inode>> DevTmpFSDirectoryInode::lookup(StringView name)
{
MutexLocker locker(m_inode_lock);
for (auto& node : m_nodes) {
@@ -237,7 +237,7 @@ ErrorOr<void> DevTmpFSDirectoryInode::remove_child(StringView name)
return Error::from_errno(ENOENT);
}
-ErrorOr<NonnullRefPtr<Inode>> DevTmpFSDirectoryInode::create_child(StringView name, mode_t mode, dev_t device_mode, UserID, GroupID)
+ErrorOr<NonnullLockRefPtr<Inode>> 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<NonnullRefPtr<Inode>> 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<NonnullRefPtr<Inode>> 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<size_t> DevTmpFSDeviceInode::read_bytes(off_t offset, size_t count, User
{
MutexLocker locker(m_inode_lock);
VERIFY(!!description);
- RefPtr<Device> device = DeviceManagement::the().get_device(m_major_number, m_minor_number);
+ LockRefPtr<Device> 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<size_t> DevTmpFSDeviceInode::write_bytes(off_t offset, size_t count, Use
{
MutexLocker locker(m_inode_lock);
VERIFY(!!description);
- RefPtr<Device> device = DeviceManagement::the().get_device(m_major_number, m_minor_number);
+ LockRefPtr<Device> 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<NonnullRefPtr<FileSystem>> try_create();
+ static ErrorOr<NonnullLockRefPtr<FileSystem>> try_create();
virtual ErrorOr<void> initialize() override;
virtual StringView class_name() const override { return "DevTmpFS"sv; }
@@ -30,7 +30,7 @@ private:
DevTmpFS();
size_t allocate_inode_index();
- RefPtr<DevTmpFSRootDirectoryInode> m_root_inode;
+ LockRefPtr<DevTmpFSRootDirectoryInode> m_root_inode;
InodeIndex m_next_inode_index { 0 };
};
@@ -50,11 +50,11 @@ protected:
DevTmpFSInode(DevTmpFS&, MajorNumber, MinorNumber);
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) override;
virtual ErrorOr<void> flush_metadata() override;
virtual InodeMetadata metadata() const override final;
virtual ErrorOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const& buffer, OpenFileDescription*) override;
- virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override;
virtual ErrorOr<void> remove_child(StringView name) override;
virtual ErrorOr<void> chmod(mode_t) override;
@@ -77,7 +77,7 @@ protected:
virtual Type node_type() const = 0;
private:
- IntrusiveListNode<DevTmpFSInode, RefPtr<DevTmpFSInode>> m_list_node;
+ IntrusiveListNode<DevTmpFSInode, LockRefPtr<DevTmpFSInode>> 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<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
virtual ErrorOr<void> remove_child(StringView name) override;
virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) override;
DevTmpFSDirectoryInode(DevTmpFS&, NonnullOwnPtr<KString> name);
// ^Inode
OwnPtr<KString> 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<NonnullRefPtr<FileSystem>> Ext2FS::try_create(OpenFileDescription& file_description)
+ErrorOr<NonnullLockRefPtr<FileSystem>> 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<Ext2FSInode> const& cached_inode) {
+ m_inode_cache.remove_all_matching([](InodeIndex, LockRefPtr<Ext2FSInode> 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<void> Ext2FSInode::flush_metadata()
return {};
}
-ErrorOr<NonnullRefPtr<Inode>> Ext2FS::get_inode(InodeIdentifier inode) const
+ErrorOr<NonnullLockRefPtr<Inode>> Ext2FS::get_inode(InodeIdentifier inode) const
{
MutexLocker locker(m_lock);
VERIFY(inode.fsid() == fsid());
@@ -773,7 +773,7 @@ ErrorOr<NonnullRefPtr<Inode>> Ext2FS::get_inode(InodeIdentifier inode) const
if (it != m_inode_cache.end()) {
if (!it->value)
return ENOENT;
- return NonnullRefPtr<Inode> { *it->value };
+ return NonnullLockRefPtr<Inode> { *it->value };
}
}
@@ -789,7 +789,7 @@ ErrorOr<NonnullRefPtr<Inode>> 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<Ext2FS&>(*this), inode.index())));
+ auto new_inode = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) Ext2FSInode(const_cast<Ext2FS&>(*this), inode.index())));
auto buffer = UserOrKernelBuffer::for_kernel_buffer(reinterpret_cast<u8*>(&new_inode->m_raw_inode));
TRY(read_block(block_index, &buffer, sizeof(ext2_inode), offset));
@@ -1116,7 +1116,7 @@ ErrorOr<void> Ext2FSInode::write_directory(Vector<Ext2FSDirectoryEntry>& entries
return {};
}
-ErrorOr<NonnullRefPtr<Inode>> Ext2FSInode::create_child(StringView name, mode_t mode, dev_t dev, UserID uid, GroupID gid)
+ErrorOr<NonnullLockRefPtr<Inode>> 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<void> 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<NonnullRefPtr<Inode>> Ext2FS::create_directory(Ext2FSInode& parent_inode, StringView name, mode_t mode, UserID uid, GroupID gid)
+ErrorOr<NonnullLockRefPtr<Inode>> 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<NonnullRefPtr<Inode>> Ext2FS::create_directory(Ext2FSInode& parent_inode
return inode;
}
-ErrorOr<NonnullRefPtr<Inode>> Ext2FS::create_inode(Ext2FSInode& parent_inode, StringView name, mode_t mode, dev_t dev, UserID uid, GroupID gid)
+ErrorOr<NonnullLockRefPtr<Inode>> 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<void> Ext2FSInode::populate_lookup_cache() const
return {};
}
-ErrorOr<NonnullRefPtr<Inode>> Ext2FSInode::lookup(StringView name)
+ErrorOr<NonnullLockRefPtr<Inode>> 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<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
virtual InodeMetadata metadata() const override;
virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) override;
virtual ErrorOr<void> flush_metadata() override;
virtual ErrorOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const& data, OpenFileDescription*) override;
- virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
virtual ErrorOr<void> add_child(Inode& child, StringView name, mode_t) override;
virtual ErrorOr<void> remove_child(StringView name) override;
virtual ErrorOr<void> set_atime(time_t) override;
@@ -86,7 +86,7 @@ public:
FileSize64bits = 1 << 1,
};
- static ErrorOr<NonnullRefPtr<FileSystem>> try_create(OpenFileDescription&);
+ static ErrorOr<NonnullLockRefPtr<FileSystem>> try_create(OpenFileDescription&);
virtual ~Ext2FS() override;
virtual ErrorOr<void> initialize() override;
@@ -126,9 +126,9 @@ private:
virtual StringView class_name() const override { return "Ext2FS"sv; }
virtual Ext2FSInode& root_inode() override;
- ErrorOr<NonnullRefPtr<Inode>> get_inode(InodeIdentifier) const;
- ErrorOr<NonnullRefPtr<Inode>> create_inode(Ext2FSInode& parent_inode, StringView name, mode_t, dev_t, UserID, GroupID);
- ErrorOr<NonnullRefPtr<Inode>> create_directory(Ext2FSInode& parent_inode, StringView name, mode_t, UserID, GroupID);
+ ErrorOr<NonnullLockRefPtr<Inode>> get_inode(InodeIdentifier) const;
+ ErrorOr<NonnullLockRefPtr<Inode>> create_inode(Ext2FSInode& parent_inode, StringView name, mode_t, dev_t, UserID, GroupID);
+ ErrorOr<NonnullLockRefPtr<Inode>> 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<KBuffer> m_cached_group_descriptor_table;
- mutable HashMap<InodeIndex, RefPtr<Ext2FSInode>> m_inode_cache;
+ mutable HashMap<InodeIndex, LockRefPtr<Ext2FSInode>> m_inode_cache;
bool m_super_block_dirty { false };
bool m_block_group_descriptors_dirty { false };
@@ -180,7 +180,7 @@ private:
ErrorOr<void> update_bitmap_block(BlockIndex bitmap_block, size_t bit_index, bool new_state, u32& super_block_counter, u16& group_descriptor_counter);
Vector<OwnPtr<CachedBitmap>> m_cached_bitmaps;
- RefPtr<Ext2FSInode> m_root_inode;
+ LockRefPtr<Ext2FSInode> 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<int> s_next_fifo_id = 1;
-ErrorOr<NonnullRefPtr<FIFO>> FIFO::try_create(UserID uid)
+ErrorOr<NonnullLockRefPtr<FIFO>> 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<NonnullRefPtr<OpenFileDescription>> FIFO::open_direction(FIFO::Direction direction)
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> FIFO::open_direction(FIFO::Direction direction)
{
auto description = TRY(OpenFileDescription::try_create(*this));
attach(direction);
@@ -30,7 +30,7 @@ ErrorOr<NonnullRefPtr<OpenFileDescription>> FIFO::open_direction(FIFO::Direction
return description;
}
-ErrorOr<NonnullRefPtr<OpenFileDescription>> FIFO::open_direction_blocking(FIFO::Direction direction)
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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<NonnullRefPtr<FIFO>> try_create(UserID);
+ static ErrorOr<NonnullLockRefPtr<FIFO>> try_create(UserID);
virtual ~FIFO() override;
UserID uid() const { return m_uid; }
- ErrorOr<NonnullRefPtr<OpenFileDescription>> open_direction(Direction);
- ErrorOr<NonnullRefPtr<OpenFileDescription>> open_direction_blocking(Direction);
+ ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open_direction(Direction);
+ ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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<NonnullRefPtr<OpenFileDescription>> File::open(int options)
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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 <AK/AtomicRefCounted.h>
#include <AK/Error.h>
-#include <AK/NonnullRefPtr.h>
#include <AK/StringView.h>
#include <AK/Types.h>
-#include <AK/Weakable.h>
#include <Kernel/Forward.h>
+#include <Kernel/Library/LockWeakable.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
#include <Kernel/UnixTypes.h>
#include <Kernel/UserOrKernelBuffer.h>
#include <Kernel/VirtualAddress.h>
@@ -72,13 +72,13 @@ public:
class File
: public AtomicRefCounted<File>
- , public Weakable<File> {
+ , public LockWeakable<File> {
public:
virtual bool unref() const { return AtomicRefCounted<File>::unref(); }
virtual void will_be_destroyed() { }
virtual ~File();
- virtual ErrorOr<NonnullRefPtr<OpenFileDescription>> open(int options);
+ virtual ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open(int options);
virtual ErrorOr<void> 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<OpenFileDescription> m_file_description;
+ mutable NonnullLockRefPtr<OpenFileDescription> 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<FileSystem, 32> file_systems;
+ NonnullLockRefPtrVector<FileSystem, 32> 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 <AK/AtomicRefCounted.h>
#include <AK/Error.h>
-#include <AK/RefPtr.h>
#include <AK/StringView.h>
#include <Kernel/FileSystem/InodeIdentifier.h>
#include <Kernel/Forward.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Locking/Mutex.h>
#include <Kernel/UnixTypes.h>
#include <Kernel/UserOrKernelBuffer.h>
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 <AK/CharacterTypes.h>
#include <AK/Endian.h>
#include <AK/HashFunctions.h>
-#include <AK/NonnullRefPtr.h>
#include <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/StringHash.h>
#include <AK/StringView.h>
#include <Kernel/Debug.h>
#include <Kernel/FileSystem/BlockBasedFileSystem.h>
#include <Kernel/Forward.h>
#include <Kernel/KBuffer.h>
+#include <Kernel/Library/LockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
#include <Kernel/UnixTypes.h>
#include <Kernel/UserOrKernelBuffer.h>
@@ -28,7 +28,7 @@ constexpr u32 logical_sector_size = 2048;
constexpr u32 max_cached_directory_entries = 128;
struct DirectoryState {
- RefPtr<ISO9660FS::DirectoryEntry> entry;
+ LockRefPtr<ISO9660FS::DirectoryEntry> entry;
u32 offset { 0 };
};
@@ -168,9 +168,9 @@ private:
Vector<DirectoryState> m_directory_stack;
};
-ErrorOr<NonnullRefPtr<FileSystem>> ISO9660FS::try_create(OpenFileDescription& description)
+ErrorOr<NonnullLockRefPtr<FileSystem>> 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<void> ISO9660FS::visit_directory_record(ISO::DirectoryRecordHeader const
return {};
}
-ErrorOr<NonnullRefPtr<ISO9660FS::DirectoryEntry>> ISO9660FS::directory_entry_for_record(Badge<ISO9660DirectoryIterator>, ISO::DirectoryRecordHeader const* record)
+ErrorOr<NonnullLockRefPtr<ISO9660FS::DirectoryEntry>> ISO9660FS::directory_entry_for_record(Badge<ISO9660DirectoryIterator>, 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<void> ISO9660Inode::traverse_as_directory(Function<ErrorOr<void>(FileSys
});
}
-ErrorOr<NonnullRefPtr<Inode>> ISO9660Inode::lookup(StringView name)
+ErrorOr<NonnullLockRefPtr<Inode>> ISO9660Inode::lookup(StringView name)
{
- RefPtr<Inode> inode;
+ LockRefPtr<Inode> inode;
Array<u8, max_file_identifier_length> file_identifier_buffer;
TRY(fs().visit_directory_record(m_record, [&](ISO::DirectoryRecordHeader const* record) {
@@ -498,7 +498,7 @@ ErrorOr<size_t> ISO9660Inode::write_bytes(off_t, size_t, UserOrKernelBuffer cons
return EROFS;
}
-ErrorOr<NonnullRefPtr<Inode>> ISO9660Inode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
+ErrorOr<NonnullLockRefPtr<Inode>> 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<NonnullRefPtr<ISO9660Inode>> ISO9660Inode::try_create_from_directory_record(ISO9660FS& fs, ISO::DirectoryRecordHeader const& record, StringView name)
+ErrorOr<NonnullLockRefPtr<ISO9660Inode>> 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 <AK/EnumBits.h>
#include <AK/Error.h>
#include <AK/HashMap.h>
-#include <AK/NonnullRefPtr.h>
#include <AK/RecursionDecision.h>
#include <AK/StringView.h>
#include <AK/Types.h>
#include <Kernel/FileSystem/BlockBasedFileSystem.h>
#include <Kernel/FileSystem/Inode.h>
#include <Kernel/KBuffer.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
namespace Kernel {
@@ -291,9 +291,9 @@ public:
// We need it as an OwnPtr to default-construct this struct.
OwnPtr<KBuffer> blocks;
- static ErrorOr<NonnullRefPtr<DirectoryEntry>> try_create(u32 extent, u32 length, OwnPtr<KBuffer> blocks)
+ static ErrorOr<NonnullLockRefPtr<DirectoryEntry>> try_create(u32 extent, u32 length, OwnPtr<KBuffer> 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<NonnullRefPtr<FileSystem>> try_create(OpenFileDescription&);
+ static ErrorOr<NonnullLockRefPtr<FileSystem>> try_create(OpenFileDescription&);
virtual ~ISO9660FS() override;
virtual ErrorOr<void> initialize() override;
@@ -317,7 +317,7 @@ public:
virtual u8 internal_file_type_to_directory_entry_type(DirectoryEntryView const& entry) const override;
- ErrorOr<NonnullRefPtr<DirectoryEntry>> directory_entry_for_record(Badge<ISO9660DirectoryIterator>, ISO::DirectoryRecordHeader const* record);
+ ErrorOr<NonnullLockRefPtr<DirectoryEntry>> directory_entry_for_record(Badge<ISO9660DirectoryIterator>, ISO::DirectoryRecordHeader const* record);
private:
ISO9660FS(OpenFileDescription&);
@@ -331,10 +331,10 @@ private:
ErrorOr<void> visit_directory_record(ISO::DirectoryRecordHeader const& record, Function<ErrorOr<RecursionDecision>(ISO::DirectoryRecordHeader const*)> const& visitor) const;
OwnPtr<ISO::PrimaryVolumeDescriptor> m_primary_volume;
- RefPtr<ISO9660Inode> m_root_inode;
+ LockRefPtr<ISO9660Inode> m_root_inode;
mutable u32 m_cached_inode_count { 0 };
- HashMap<u32, NonnullRefPtr<DirectoryEntry>> m_directory_entry_cache;
+ HashMap<u32, NonnullLockRefPtr<DirectoryEntry>> m_directory_entry_cache;
};
class ISO9660Inode final : public Inode {
@@ -350,10 +350,10 @@ public:
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
virtual InodeMetadata metadata() const override;
virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) override;
virtual ErrorOr<void> flush_metadata() override;
virtual ErrorOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const& buffer, OpenFileDescription*) override;
- virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override;
virtual ErrorOr<void> remove_child(StringView name) override;
virtual ErrorOr<void> 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<NonnullRefPtr<ISO9660Inode>> try_create_from_directory_record(ISO9660FS&, ISO::DirectoryRecordHeader const& record, StringView name);
+ static ErrorOr<NonnullLockRefPtr<ISO9660Inode>> 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 <AK/NonnullRefPtrVector.h>
#include <AK/Singleton.h>
#include <AK/StringView.h>
#include <Kernel/API/InodeWatcherEvent.h>
@@ -16,6 +15,7 @@
#include <Kernel/FileSystem/OpenFileDescription.h>
#include <Kernel/FileSystem/VirtualFileSystem.h>
#include <Kernel/KBufferBuilder.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Memory/SharedInodeVMObject.h>
#include <Kernel/Net/LocalSocket.h>
#include <Kernel/Process.h>
@@ -31,7 +31,7 @@ SpinlockProtected<Inode::AllInstancesList>& Inode::all_instances()
void Inode::sync_all()
{
- NonnullRefPtrVector<Inode, 32> inodes;
+ NonnullLockRefPtrVector<Inode, 32> inodes;
Inode::all_instances().with([&](auto& all_inodes) {
for (auto& inode : all_inodes) {
if (inode.is_metadata_dirty())
@@ -76,7 +76,7 @@ ErrorOr<NonnullOwnPtr<KBuffer>> Inode::read_entire(OpenFileDescription* descript
return entire_file.release_nonnull();
}
-ErrorOr<NonnullRefPtr<Custody>> Inode::resolve_as_link(Custody& base, RefPtr<Custody>* out_parent, int options, int symlink_recursion_level) const
+ErrorOr<NonnullLockRefPtr<Custody>> Inode::resolve_as_link(Custody& base, LockRefPtr<Custody>* 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<void> Inode::set_shared_vmobject(Memory::SharedInodeVMObject& vmobject)
return {};
}
-RefPtr<LocalSocket> Inode::bound_socket() const
+LockRefPtr<LocalSocket> Inode::bound_socket() const
{
return m_bound_socket;
}
@@ -178,7 +178,7 @@ void Inode::unregister_watcher(Badge<InodeWatcher>, InodeWatcher& watcher)
});
}
-ErrorOr<NonnullRefPtr<FIFO>> Inode::fifo()
+ErrorOr<NonnullLockRefPtr<FIFO>> Inode::fifo()
{
MutexLocker locker(m_inode_lock);
VERIFY(metadata().is_fifo());
@@ -187,7 +187,7 @@ ErrorOr<NonnullRefPtr<FIFO>> 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<void> Inode::prepare_to_write_data()
return {};
}
-RefPtr<Memory::SharedInodeVMObject> Inode::shared_vmobject() const
+LockRefPtr<Memory::SharedInodeVMObject> 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 <AK/Function.h>
#include <AK/HashTable.h>
#include <AK/IntrusiveList.h>
-#include <AK/WeakPtr.h>
#include <Kernel/FileSystem/FIFO.h>
#include <Kernel/FileSystem/FileSystem.h>
#include <Kernel/FileSystem/InodeIdentifier.h>
#include <Kernel/FileSystem/InodeMetadata.h>
#include <Kernel/Forward.h>
#include <Kernel/Library/ListedRefCounted.h>
+#include <Kernel/Library/LockWeakPtr.h>
#include <Kernel/Locking/Mutex.h>
#include <Kernel/Memory/SharedInodeVMObject.h>
@@ -29,7 +29,7 @@ enum class ShouldBlock {
};
class Inode : public ListedRefCounted<Inode, LockType::Spinlock>
- , public Weakable<Inode> {
+ , public LockWeakable<Inode> {
friend class VirtualFileSystem;
friend class FileSystem;
friend class InodeFile;
@@ -61,19 +61,19 @@ public:
virtual void did_seek(OpenFileDescription&, off_t) { }
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const = 0;
virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const = 0;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) = 0;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) = 0;
virtual ErrorOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const& data, OpenFileDescription*) = 0;
- virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) = 0;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) = 0;
virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) = 0;
virtual ErrorOr<void> remove_child(StringView name) = 0;
virtual ErrorOr<void> chmod(mode_t) = 0;
virtual ErrorOr<void> chown(UserID, GroupID) = 0;
virtual ErrorOr<void> truncate(u64) { return {}; }
- virtual ErrorOr<NonnullRefPtr<Custody>> resolve_as_link(Custody& base, RefPtr<Custody>* out_parent, int options, int symlink_recursion_level) const;
+ virtual ErrorOr<NonnullLockRefPtr<Custody>> resolve_as_link(Custody& base, LockRefPtr<Custody>* out_parent, int options, int symlink_recursion_level) const;
virtual ErrorOr<int> get_block_address(int) { return ENOTSUP; }
- RefPtr<LocalSocket> bound_socket() const;
+ LockRefPtr<LocalSocket> bound_socket() const;
bool bind_socket(LocalSocket&);
bool unbind_socket();
@@ -90,7 +90,7 @@ public:
void will_be_destroyed();
ErrorOr<void> set_shared_vmobject(Memory::SharedInodeVMObject&);
- RefPtr<Memory::SharedInodeVMObject> shared_vmobject() const;
+ LockRefPtr<Memory::SharedInodeVMObject> shared_vmobject() const;
static void sync_all();
void sync();
@@ -100,7 +100,7 @@ public:
ErrorOr<void> register_watcher(Badge<InodeWatcher>, InodeWatcher&);
void unregister_watcher(Badge<InodeWatcher>, InodeWatcher&);
- ErrorOr<NonnullRefPtr<FIFO>> fifo();
+ ErrorOr<NonnullLockRefPtr<FIFO>> fifo();
bool can_apply_flock(flock const&) const;
ErrorOr<void> apply_flock(Process const&, OpenFileDescription const&, Userspace<flock const*>, ShouldBlock);
@@ -125,11 +125,11 @@ private:
FileSystem& m_file_system;
InodeIndex m_index { 0 };
- WeakPtr<Memory::SharedInodeVMObject> m_shared_vmobject;
- RefPtr<LocalSocket> m_bound_socket;
+ LockWeakPtr<Memory::SharedInodeVMObject> m_shared_vmobject;
+ LockRefPtr<LocalSocket> m_bound_socket;
SpinlockProtected<HashTable<InodeWatcher*>> m_watchers { LockRank::None };
bool m_metadata_dirty { false };
- RefPtr<FIFO> m_fifo;
+ LockRefPtr<FIFO> m_fifo;
IntrusiveListNode<Inode> 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>&& inode)
+InodeFile::InodeFile(NonnullLockRefPtr<Inode>&& inode)
: m_inode(move(inode))
{
}
@@ -87,7 +87,7 @@ ErrorOr<void> InodeFile::ioctl(OpenFileDescription& description, unsigned reques
ErrorOr<Memory::Region*> 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<Memory::InodeVMObject> vmobject;
+ LockRefPtr<Memory::InodeVMObject> 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<NonnullRefPtr<InodeFile>> create(NonnullRefPtr<Inode>&& inode)
+ static ErrorOr<NonnullLockRefPtr<InodeFile>> create(NonnullLockRefPtr<Inode>&& 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<Inode>&&);
- NonnullRefPtr<Inode> m_inode;
+ explicit InodeFile(NonnullLockRefPtr<Inode>&&);
+ NonnullLockRefPtr<Inode> 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<NonnullRefPtr<InodeWatcher>> InodeWatcher::try_create()
+ErrorOr<NonnullLockRefPtr<InodeWatcher>> 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<NonnullRefPtr<InodeWatcher>> try_create();
+ static ErrorOr<NonnullLockRefPtr<InodeWatcher>> 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 <AK/NonnullRefPtr.h>
#include <Kernel/FileSystem/Custody.h>
#include <Kernel/Forward.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
namespace Kernel {
@@ -32,9 +32,9 @@ public:
void set_flags(int flags) { m_flags = flags; }
private:
- NonnullRefPtr<Inode> m_guest;
- NonnullRefPtr<FileSystem> m_guest_fs;
- RefPtr<Custody> m_host_custody;
+ NonnullLockRefPtr<Inode> m_guest;
+ NonnullLockRefPtr<FileSystem> m_guest_fs;
+ LockRefPtr<Custody> 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<NonnullRefPtr<OpenFileDescription>> OpenFileDescription::try_create(Custody& custody)
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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<NonnullRefPtr<OpenFileDescription>> OpenFileDescription::try_create(File& file)
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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<OpenFileDescription> {
public:
- static ErrorOr<NonnullRefPtr<OpenFileDescription>> try_create(Custody&);
- static ErrorOr<NonnullRefPtr<OpenFileDescription>> try_create(File&);
+ static ErrorOr<NonnullLockRefPtr<OpenFileDescription>> try_create(Custody&);
+ static ErrorOr<NonnullLockRefPtr<OpenFileDescription>> try_create(File&);
~OpenFileDescription();
Thread::FileBlocker::BlockFlags should_unblock(Thread::FileBlocker::BlockFlags) const;
@@ -112,7 +112,7 @@ public:
OwnPtr<OpenFileDescriptionData>& data();
- void set_original_inode(Badge<VirtualFileSystem>, NonnullRefPtr<Inode>&& inode) { m_inode = move(inode); }
+ void set_original_inode(Badge<VirtualFileSystem>, NonnullLockRefPtr<Inode>&& inode) { m_inode = move(inode); }
void set_original_custody(Badge<VirtualFileSystem>, Custody& custody);
ErrorOr<void> truncate(u64);
@@ -138,9 +138,9 @@ private:
blocker_set().unblock_all_blockers_whose_conditions_are_met();
}
- RefPtr<Custody> m_custody;
- RefPtr<Inode> m_inode;
- NonnullRefPtr<File> m_file;
+ LockRefPtr<Custody> m_custody;
+ LockRefPtr<Inode> m_inode;
+ NonnullLockRefPtr<File> m_file;
struct State {
OwnPtr<OpenFileDescriptionData> 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<NonnullRefPtr<FileSystem>> Plan9FS::try_create(OpenFileDescription& file_description)
+ErrorOr<NonnullLockRefPtr<FileSystem>> 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<void> Plan9FS::post_message(Message& message, RefPtr<ReceiveCompletion> completion)
+ErrorOr<void> Plan9FS::post_message(Message& message, LockRefPtr<ReceiveCompletion> completion)
{
auto const& buffer = message.build();
u8 const* data = buffer.data();
@@ -584,7 +584,7 @@ ErrorOr<void> 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<Plan9FS::Blocker>({}, *this, message, completion).was_interrupted())
return EINTR;
@@ -668,9 +668,9 @@ Plan9FSInode::Plan9FSInode(Plan9FS& fs, u32 fid)
{
}
-ErrorOr<NonnullRefPtr<Plan9FSInode>> Plan9FSInode::try_create(Plan9FS& fs, u32 fid)
+ErrorOr<NonnullLockRefPtr<Plan9FSInode>> 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<void> Plan9FSInode::traverse_as_directory(Function<ErrorOr<void>(FileSys
return ENOTIMPL;
}
-ErrorOr<NonnullRefPtr<Inode>> Plan9FSInode::lookup(StringView name)
+ErrorOr<NonnullLockRefPtr<Inode>> Plan9FSInode::lookup(StringView name)
{
u32 newfid = fs().allocate_fid();
Plan9FS::Message message { fs(), Plan9FS::Message::Type::Twalk };
@@ -902,7 +902,7 @@ ErrorOr<NonnullRefPtr<Inode>> Plan9FSInode::lookup(StringView name)
return TRY(Plan9FSInode::try_create(fs(), newfid));
}
-ErrorOr<NonnullRefPtr<Inode>> Plan9FSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
+ErrorOr<NonnullLockRefPtr<Inode>> 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<NonnullRefPtr<FileSystem>> try_create(OpenFileDescription&);
+ static ErrorOr<NonnullLockRefPtr<FileSystem>> try_create(OpenFileDescription&);
virtual ErrorOr<void> initialize() override;
@@ -82,7 +82,7 @@ private:
class Blocker final : public Thread::Blocker {
public:
- Blocker(Plan9FS& fs, Message& message, NonnullRefPtr<ReceiveCompletion> completion)
+ Blocker(Plan9FS& fs, Message& message, NonnullLockRefPtr<ReceiveCompletion> 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<ReceiveCompletion> const& completion() const { return m_completion; }
+ NonnullLockRefPtr<ReceiveCompletion> 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<ReceiveCompletion> m_completion;
+ NonnullLockRefPtr<ReceiveCompletion> 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<void> post_message(Message&, RefPtr<ReceiveCompletion>);
+ ErrorOr<void> post_message(Message&, LockRefPtr<ReceiveCompletion>);
ErrorOr<void> do_read(u8* buffer, size_t);
ErrorOr<void> read_and_dispatch_one_message();
ErrorOr<void> post_message_and_wait_for_a_reply(Message&);
@@ -128,7 +128,7 @@ private:
void thread_main();
void ensure_thread();
- RefPtr<Plan9FSInode> m_root_inode;
+ LockRefPtr<Plan9FSInode> m_root_inode;
Atomic<u16> m_next_tag { (u16)-1 };
Atomic<u32> m_next_fid { 1 };
@@ -137,10 +137,10 @@ private:
Mutex m_send_lock { "Plan9FS send"sv };
Plan9FSBlockerSet m_completion_blocker;
- HashMap<u16, NonnullRefPtr<ReceiveCompletion>> m_completions;
+ HashMap<u16, NonnullLockRefPtr<ReceiveCompletion>> m_completions;
Spinlock m_thread_lock { LockRank::None };
- RefPtr<Thread> m_thread;
+ LockRefPtr<Thread> m_thread;
Atomic<bool> m_thread_running { false };
Atomic<bool, AK::MemoryOrder::memory_order_relaxed> m_thread_shutdown { false };
};
@@ -159,8 +159,8 @@ public:
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
virtual ErrorOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const& data, OpenFileDescription*) override;
virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
- virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override;
virtual ErrorOr<void> remove_child(StringView name) override;
virtual ErrorOr<void> chmod(mode_t) override;
@@ -169,7 +169,7 @@ public:
private:
Plan9FSInode(Plan9FS&, u32 fid);
- static ErrorOr<NonnullRefPtr<Plan9FSInode>> try_create(Plan9FS&, u32 fid);
+ static ErrorOr<NonnullLockRefPtr<Plan9FSInode>> 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<NonnullRefPtr<FileSystem>> ProcFS::try_create()
+ErrorOr<NonnullLockRefPtr<FileSystem>> 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<void> ProcFSInode::add_child(Inode&, StringView, mode_t)
return EROFS;
}
-ErrorOr<NonnullRefPtr<Inode>> ProcFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
+ErrorOr<NonnullLockRefPtr<Inode>> ProcFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
{
return EROFS;
}
@@ -93,9 +93,9 @@ ErrorOr<void> ProcFSInode::chown(UserID, GroupID)
return EPERM;
}
-ErrorOr<NonnullRefPtr<ProcFSGlobalInode>> ProcFSGlobalInode::try_create(ProcFS const& fs, ProcFSExposedComponent const& component)
+ErrorOr<NonnullLockRefPtr<ProcFSGlobalInode>> 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<void> ProcFSGlobalInode::traverse_as_directory(Function<ErrorOr<void>(Fi
VERIFY_NOT_REACHED();
}
-ErrorOr<NonnullRefPtr<Inode>> ProcFSGlobalInode::lookup(StringView)
+ErrorOr<NonnullLockRefPtr<Inode>> ProcFSGlobalInode::lookup(StringView)
{
VERIFY_NOT_REACHED();
}
@@ -168,9 +168,9 @@ ErrorOr<size_t> ProcFSGlobalInode::write_bytes(off_t offset, size_t count, UserO
return m_associated_component->write_bytes(offset, count, buffer, fd);
}
-ErrorOr<NonnullRefPtr<ProcFSDirectoryInode>> ProcFSDirectoryInode::try_create(ProcFS const& procfs, ProcFSExposedComponent const& component)
+ErrorOr<NonnullLockRefPtr<ProcFSDirectoryInode>> 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<void> ProcFSDirectoryInode::traverse_as_directory(Function<ErrorOr<void>
return m_associated_component->traverse_as_directory(procfs().fsid(), move(callback));
}
-ErrorOr<NonnullRefPtr<Inode>> ProcFSDirectoryInode::lookup(StringView name)
+ErrorOr<NonnullLockRefPtr<Inode>> ProcFSDirectoryInode::lookup(StringView name)
{
MutexLocker locker(procfs().m_lock);
auto component = TRY(m_associated_component->lookup(name));
return component->to_inode(procfs());
}
-ErrorOr<NonnullRefPtr<ProcFSLinkInode>> ProcFSLinkInode::try_create(ProcFS const& procfs, ProcFSExposedComponent const& component)
+ErrorOr<NonnullLockRefPtr<ProcFSLinkInode>> 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<size_t> ProcFSProcessAssociatedInode::write_bytes(off_t, size_t, UserOrK
return ENOTSUP;
}
-ErrorOr<NonnullRefPtr<ProcFSProcessDirectoryInode>> ProcFSProcessDirectoryInode::try_create(ProcFS const& procfs, ProcessID pid)
+ErrorOr<NonnullLockRefPtr<ProcFSProcessDirectoryInode>> 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<void> ProcFSProcessDirectoryInode::traverse_as_directory(Function<ErrorO
return process->procfs_traits()->traverse_as_directory(procfs().fsid(), move(callback));
}
-ErrorOr<NonnullRefPtr<Inode>> ProcFSProcessDirectoryInode::lookup(StringView name)
+ErrorOr<NonnullLockRefPtr<Inode>> ProcFSProcessDirectoryInode::lookup(StringView name)
{
MutexLocker locker(procfs().m_lock);
auto process = Process::from_pid(associated_pid());
@@ -316,9 +316,9 @@ ErrorOr<NonnullRefPtr<Inode>> ProcFSProcessDirectoryInode::lookup(StringView nam
return ENOENT;
}
-ErrorOr<NonnullRefPtr<ProcFSProcessSubDirectoryInode>> ProcFSProcessSubDirectoryInode::try_create(ProcFS const& procfs, SegmentedProcFSIndex::ProcessSubDirectory sub_directory_type, ProcessID pid)
+ErrorOr<NonnullLockRefPtr<ProcFSProcessSubDirectoryInode>> 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<void> ProcFSProcessSubDirectoryInode::traverse_as_directory(Function<Err
VERIFY_NOT_REACHED();
}
-ErrorOr<NonnullRefPtr<Inode>> ProcFSProcessSubDirectoryInode::lookup(StringView name)
+ErrorOr<NonnullLockRefPtr<Inode>> ProcFSProcessSubDirectoryInode::lookup(StringView name)
{
MutexLocker locker(procfs().m_lock);
auto process = Process::from_pid(associated_pid());
@@ -397,21 +397,21 @@ ErrorOr<NonnullRefPtr<Inode>> ProcFSProcessSubDirectoryInode::lookup(StringView
}
}
-ErrorOr<NonnullRefPtr<ProcFSProcessPropertyInode>> ProcFSProcessPropertyInode::try_create_for_file_description_link(ProcFS const& procfs, unsigned file_description_index, ProcessID pid)
+ErrorOr<NonnullLockRefPtr<ProcFSProcessPropertyInode>> 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<NonnullRefPtr<ProcFSProcessPropertyInode>> ProcFSProcessPropertyInode::try_create_for_thread_stack(ProcFS const& procfs, ThreadID stack_thread_index, ProcessID pid)
+ErrorOr<NonnullLockRefPtr<ProcFSProcessPropertyInode>> 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<NonnullRefPtr<ProcFSProcessPropertyInode>> ProcFSProcessPropertyInode::try_create_for_pid_property(ProcFS const& procfs, SegmentedProcFSIndex::MainProcessProperty main_property_type, ProcessID pid)
+ErrorOr<NonnullLockRefPtr<ProcFSProcessPropertyInode>> 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<NonnullRefPtr<ProcFSProcessPropertyInode>> ProcFSProcessPropertyInode::try_create_for_child_process_link(ProcFS const& procfs, ProcessID child_pid, ProcessID pid)
+ErrorOr<NonnullLockRefPtr<ProcFSProcessPropertyInode>> 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<size_t> ProcFSProcessPropertyInode::read_bytes(off_t offset, size_t coun
return nread;
}
-ErrorOr<NonnullRefPtr<Inode>> ProcFSProcessPropertyInode::lookup(StringView)
+ErrorOr<NonnullLockRefPtr<Inode>> 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<NonnullRefPtr<FileSystem>> try_create();
+ static ErrorOr<NonnullLockRefPtr<FileSystem>> try_create();
virtual ErrorOr<void> initialize() override;
virtual StringView class_name() const override { return "ProcFS"sv; }
@@ -38,7 +38,7 @@ public:
private:
ProcFS();
- RefPtr<ProcFSDirectoryInode> m_root_inode;
+ LockRefPtr<ProcFSDirectoryInode> m_root_inode;
};
class ProcFSInode : public Inode {
@@ -57,7 +57,7 @@ protected:
virtual ErrorOr<void> attach(OpenFileDescription& description) override = 0;
virtual void did_seek(OpenFileDescription&, off_t) override = 0;
virtual ErrorOr<void> flush_metadata() override final;
- virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override final;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override final;
virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override final;
virtual ErrorOr<void> remove_child(StringView name) override final;
virtual ErrorOr<void> chmod(mode_t) override final;
@@ -68,7 +68,7 @@ class ProcFSGlobalInode : public ProcFSInode {
friend class ProcFS;
public:
- static ErrorOr<NonnullRefPtr<ProcFSGlobalInode>> try_create(ProcFS const&, ProcFSExposedComponent const&);
+ static ErrorOr<NonnullLockRefPtr<ProcFSGlobalInode>> 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<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView) override;
virtual ErrorOr<void> truncate(u64) override final;
virtual ErrorOr<void> set_mtime(time_t) override final;
- NonnullRefPtr<ProcFSExposedComponent> m_associated_component;
+ NonnullLockRefPtr<ProcFSExposedComponent> m_associated_component;
};
class ProcFSLinkInode : public ProcFSGlobalInode {
friend class ProcFS;
public:
- static ErrorOr<NonnullRefPtr<ProcFSLinkInode>> try_create(ProcFS const&, ProcFSExposedComponent const&);
+ static ErrorOr<NonnullLockRefPtr<ProcFSLinkInode>> 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<NonnullRefPtr<ProcFSDirectoryInode>> try_create(ProcFS const&, ProcFSExposedComponent const&);
+ static ErrorOr<NonnullLockRefPtr<ProcFSDirectoryInode>> try_create(ProcFS const&, ProcFSExposedComponent const&);
virtual ~ProcFSDirectoryInode() override;
protected:
@@ -112,7 +112,7 @@ protected:
// ^Inode
virtual InodeMetadata metadata() const override;
virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) override;
};
class ProcFSProcessAssociatedInode : public ProcFSInode {
@@ -133,7 +133,7 @@ class ProcFSProcessDirectoryInode final : public ProcFSProcessAssociatedInode {
friend class ProcFS;
public:
- static ErrorOr<NonnullRefPtr<ProcFSProcessDirectoryInode>> try_create(ProcFS const&, ProcessID);
+ static ErrorOr<NonnullLockRefPtr<ProcFSProcessDirectoryInode>> try_create(ProcFS const&, ProcessID);
private:
ProcFSProcessDirectoryInode(ProcFS const&, ProcessID);
@@ -143,14 +143,14 @@ private:
virtual InodeMetadata metadata() const override;
virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) override;
};
class ProcFSProcessSubDirectoryInode final : public ProcFSProcessAssociatedInode {
friend class ProcFS;
public:
- static ErrorOr<NonnullRefPtr<ProcFSProcessSubDirectoryInode>> try_create(ProcFS const&, SegmentedProcFSIndex::ProcessSubDirectory, ProcessID);
+ static ErrorOr<NonnullLockRefPtr<ProcFSProcessSubDirectoryInode>> 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<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> 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<NonnullRefPtr<ProcFSProcessPropertyInode>> try_create_for_file_description_link(ProcFS const&, unsigned, ProcessID);
- static ErrorOr<NonnullRefPtr<ProcFSProcessPropertyInode>> try_create_for_thread_stack(ProcFS const&, ThreadID, ProcessID);
- static ErrorOr<NonnullRefPtr<ProcFSProcessPropertyInode>> try_create_for_pid_property(ProcFS const&, SegmentedProcFSIndex::MainProcessProperty, ProcessID);
- static ErrorOr<NonnullRefPtr<ProcFSProcessPropertyInode>> try_create_for_child_process_link(ProcFS const&, ProcessID, ProcessID);
+ static ErrorOr<NonnullLockRefPtr<ProcFSProcessPropertyInode>> try_create_for_file_description_link(ProcFS const&, unsigned, ProcessID);
+ static ErrorOr<NonnullLockRefPtr<ProcFSProcessPropertyInode>> try_create_for_thread_stack(ProcFS const&, ThreadID, ProcessID);
+ static ErrorOr<NonnullLockRefPtr<ProcFSProcessPropertyInode>> try_create_for_pid_property(ProcFS const&, SegmentedProcFSIndex::MainProcessProperty, ProcessID);
+ static ErrorOr<NonnullLockRefPtr<ProcFSProcessPropertyInode>> 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<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override final;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override final;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) override final;
ErrorOr<void> refresh_data(OpenFileDescription& description);
ErrorOr<void> 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<NonnullRefPtr<FileSystem>> SysFS::try_create()
+ErrorOr<NonnullLockRefPtr<FileSystem>> 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<NonnullRefPtr<SysFSInode>> SysFSInode::try_create(SysFS const& fs, SysFSComponent const& component)
+ErrorOr<NonnullLockRefPtr<SysFSInode>> 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<void> SysFSInode::traverse_as_directory(Function<ErrorOr<void>(FileSyste
VERIFY_NOT_REACHED();
}
-ErrorOr<NonnullRefPtr<Inode>> SysFSInode::lookup(StringView)
+ErrorOr<NonnullLockRefPtr<Inode>> SysFSInode::lookup(StringView)
{
VERIFY_NOT_REACHED();
}
@@ -96,7 +96,7 @@ ErrorOr<size_t> SysFSInode::write_bytes(off_t offset, size_t count, UserOrKernel
return m_associated_component->write_bytes(offset, count, buffer, fd);
}
-ErrorOr<NonnullRefPtr<Inode>> SysFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
+ErrorOr<NonnullLockRefPtr<Inode>> SysFSInode::create_child(StringView, mode_t, dev_t, UserID, GroupID)
{
return EROFS;
}
@@ -131,9 +131,9 @@ ErrorOr<void> SysFSInode::truncate(u64 size)
return m_associated_component->truncate(size);
}
-ErrorOr<NonnullRefPtr<SysFSLinkInode>> SysFSLinkInode::try_create(SysFS const& sysfs, SysFSComponent const& component)
+ErrorOr<NonnullLockRefPtr<SysFSLinkInode>> 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<NonnullRefPtr<SysFSDirectoryInode>> SysFSDirectoryInode::try_create(SysFS const& sysfs, SysFSComponent const& component)
+ErrorOr<NonnullLockRefPtr<SysFSDirectoryInode>> 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<void> SysFSDirectoryInode::traverse_as_directory(Function<ErrorOr<void>(
return m_associated_component->traverse_as_directory(fs().fsid(), move(callback));
}
-ErrorOr<NonnullRefPtr<Inode>> SysFSDirectoryInode::lookup(StringView name)
+ErrorOr<NonnullLockRefPtr<Inode>> 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<NonnullRefPtr<FileSystem>> try_create();
+ static ErrorOr<NonnullLockRefPtr<FileSystem>> try_create();
virtual ErrorOr<void> initialize() override;
virtual StringView class_name() const override { return "SysFS"sv; }
@@ -29,7 +29,7 @@ public:
private:
SysFS();
- RefPtr<SysFSInode> m_root_inode;
+ LockRefPtr<SysFSInode> m_root_inode;
};
class SysFSInode : public Inode {
@@ -37,18 +37,18 @@ class SysFSInode : public Inode {
friend class SysFSDirectoryInode;
public:
- static ErrorOr<NonnullRefPtr<SysFSInode>> try_create(SysFS const&, SysFSComponent const&);
+ static ErrorOr<NonnullLockRefPtr<SysFSInode>> try_create(SysFS const&, SysFSComponent const&);
StringView name() const { return m_associated_component->name(); }
protected:
SysFSInode(SysFS const&, SysFSComponent const&);
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) override;
virtual ErrorOr<void> flush_metadata() override;
virtual InodeMetadata metadata() const override;
virtual ErrorOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) override;
- virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override;
virtual ErrorOr<void> remove_child(StringView name) override;
virtual ErrorOr<void> chmod(mode_t) override;
@@ -59,14 +59,14 @@ protected:
virtual ErrorOr<void> attach(OpenFileDescription& description) override final;
virtual void did_seek(OpenFileDescription&, off_t) override final;
- NonnullRefPtr<SysFSComponent> m_associated_component;
+ NonnullLockRefPtr<SysFSComponent> m_associated_component;
};
class SysFSLinkInode : public SysFSInode {
friend class SysFS;
public:
- static ErrorOr<NonnullRefPtr<SysFSLinkInode>> try_create(SysFS const&, SysFSComponent const&);
+ static ErrorOr<NonnullLockRefPtr<SysFSLinkInode>> try_create(SysFS const&, SysFSComponent const&);
virtual ~SysFSLinkInode() override;
protected:
@@ -79,7 +79,7 @@ class SysFSDirectoryInode : public SysFSInode {
friend class SysFS;
public:
- static ErrorOr<NonnullRefPtr<SysFSDirectoryInode>> try_create(SysFS const&, SysFSComponent const&);
+ static ErrorOr<NonnullLockRefPtr<SysFSDirectoryInode>> try_create(SysFS const&, SysFSComponent const&);
virtual ~SysFSDirectoryInode() override;
SysFS& fs() { return static_cast<SysFS&>(Inode::fs()); }
@@ -90,7 +90,7 @@ protected:
// ^Inode
virtual InodeMetadata metadata() const override;
virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> 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<void> SysFSDirectory::traverse_as_directory(FileSystemID fsid, Function<
});
}
-RefPtr<SysFSComponent> SysFSDirectory::lookup(StringView name)
+LockRefPtr<SysFSComponent> SysFSDirectory::lookup(StringView name)
{
- return m_child_components.with([&](auto& list) -> RefPtr<SysFSComponent> {
+ return m_child_components.with([&](auto& list) -> LockRefPtr<SysFSComponent> {
for (auto& child_component : list) {
if (child_component.name() == name) {
return child_component;
@@ -141,17 +141,17 @@ SysFSDirectory::SysFSDirectory(SysFSDirectory const& parent_directory)
{
}
-ErrorOr<NonnullRefPtr<SysFSInode>> SysFSDirectory::to_inode(SysFS const& sysfs_instance) const
+ErrorOr<NonnullLockRefPtr<SysFSInode>> SysFSDirectory::to_inode(SysFS const& sysfs_instance) const
{
return TRY(SysFSDirectoryInode::try_create(sysfs_instance, *this));
}
-ErrorOr<NonnullRefPtr<SysFSInode>> SysFSSymbolicLink::to_inode(SysFS const& sysfs_instance) const
+ErrorOr<NonnullLockRefPtr<SysFSInode>> SysFSSymbolicLink::to_inode(SysFS const& sysfs_instance) const
{
return TRY(SysFSLinkInode::try_create(sysfs_instance, *this));
}
-ErrorOr<NonnullRefPtr<SysFSInode>> SysFSComponent::to_inode(SysFS const& sysfs_instance) const
+ErrorOr<NonnullLockRefPtr<SysFSInode>> 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 <AK/AtomicRefCounted.h>
#include <AK/Error.h>
#include <AK/Function.h>
-#include <AK/RefPtr.h>
#include <AK/StringView.h>
#include <AK/Types.h>
#include <Kernel/FileSystem/File.h>
#include <Kernel/FileSystem/FileSystem.h>
#include <Kernel/FileSystem/OpenFileDescription.h>
#include <Kernel/Forward.h>
+#include <Kernel/Library/LockRefPtr.h>
namespace Kernel {
@@ -31,7 +31,7 @@ public:
virtual StringView name() const = 0;
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const { return Error::from_errno(ENOTIMPL); }
virtual ErrorOr<void> traverse_as_directory(FileSystemID, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const { VERIFY_NOT_REACHED(); }
- virtual RefPtr<SysFSComponent> lookup(StringView) { VERIFY_NOT_REACHED(); };
+ virtual LockRefPtr<SysFSComponent> lookup(StringView) { VERIFY_NOT_REACHED(); };
virtual mode_t permissions() const;
virtual ErrorOr<void> truncate(u64) { return EPERM; }
virtual size_t size() const { return 0; }
@@ -39,7 +39,7 @@ public:
virtual ErrorOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) { return EROFS; }
virtual ErrorOr<void> refresh_data(OpenFileDescription&) const { return {}; }
- virtual ErrorOr<NonnullRefPtr<SysFSInode>> to_inode(SysFS const&) const;
+ virtual ErrorOr<NonnullLockRefPtr<SysFSInode>> 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<SysFSDirectory> m_parent_directory;
+ LockRefPtr<SysFSDirectory> m_parent_directory;
- IntrusiveListNode<SysFSComponent, NonnullRefPtr<SysFSComponent>> m_list_node;
+ IntrusiveListNode<SysFSComponent, NonnullLockRefPtr<SysFSComponent>> m_list_node;
private:
InodeIndex m_component_index {};
@@ -63,7 +63,7 @@ private:
class SysFSSymbolicLink : public SysFSComponent {
public:
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override final;
- virtual ErrorOr<NonnullRefPtr<SysFSInode>> to_inode(SysFS const& sysfs_instance) const override final;
+ virtual ErrorOr<NonnullLockRefPtr<SysFSInode>> to_inode(SysFS const& sysfs_instance) const override final;
protected:
ErrorOr<NonnullOwnPtr<KString>> try_generate_return_path_to_mount_point() const;
@@ -71,15 +71,15 @@ protected:
explicit SysFSSymbolicLink(SysFSDirectory const& parent_directory, SysFSComponent const& pointed_component);
- RefPtr<SysFSComponent> m_pointed_component;
+ LockRefPtr<SysFSComponent> m_pointed_component;
};
class SysFSDirectory : public SysFSComponent {
public:
virtual ErrorOr<void> traverse_as_directory(FileSystemID, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override final;
- virtual RefPtr<SysFSComponent> lookup(StringView name) override final;
+ virtual LockRefPtr<SysFSComponent> lookup(StringView name) override final;
- virtual ErrorOr<NonnullRefPtr<SysFSInode>> to_inode(SysFS const& sysfs_instance) const override final;
+ virtual ErrorOr<NonnullLockRefPtr<SysFSInode>> to_inode(SysFS const& sysfs_instance) const override final;
using ChildList = SpinlockProtected<IntrusiveList<&SysFSComponent::m_list_node>>;
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<SysFSRootDirectory> m_root_directory;
+ NonnullLockRefPtr<SysFSRootDirectory> 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> SysFSRootDirectory::create()
+NonnullLockRefPtr<SysFSRootDirectory> 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<SysFSRootDirectory> create();
+ static NonnullLockRefPtr<SysFSRootDirectory> create();
private:
virtual bool is_root_directory() const override final { return true; }
SysFSRootDirectory();
- RefPtr<SysFSBusDirectory> m_buses_directory;
+ LockRefPtr<SysFSBusDirectory> 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> SysFSBusDirectory::must_create(SysFSRootDirectory const& parent_directory)
+UNMAP_AFTER_INIT NonnullLockRefPtr<SysFSBusDirectory> 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<SysFSBusDirectory> must_create(SysFSRootDirectory const&);
+ static NonnullLockRefPtr<SysFSBusDirectory> 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> PCIDeviceAttributeSysFSComponent::create(PCIDeviceSysFSDirectory const& device, PCI::RegisterOffset offset, size_t field_bytes_width)
+NonnullLockRefPtr<PCIDeviceAttributeSysFSComponent> 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<PCIDeviceAttributeSysFSComponent> create(PCIDeviceSysFSDirectory const& device, PCI::RegisterOffset offset, size_t field_bytes_width);
+ static NonnullLockRefPtr<PCIDeviceAttributeSysFSComponent> create(PCIDeviceSysFSDirectory const& device, PCI::RegisterOffset offset, size_t field_bytes_width);
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override;
virtual ~PCIDeviceAttributeSysFSComponent() {};
@@ -25,7 +25,7 @@ public:
protected:
ErrorOr<NonnullOwnPtr<KBuffer>> try_to_generate_buffer() const;
PCIDeviceAttributeSysFSComponent(PCIDeviceSysFSDirectory const& device, PCI::RegisterOffset offset, size_t field_bytes_width);
- NonnullRefPtr<PCIDeviceSysFSDirectory> m_device;
+ NonnullLockRefPtr<PCIDeviceSysFSDirectory> 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> PCIDeviceSysFSDirectory::create(SysFSDirectory const& parent_directory, PCI::Address address)
+UNMAP_AFTER_INIT NonnullLockRefPtr<PCIDeviceSysFSDirectory> 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<void> {
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<PCIDeviceSysFSDirectory> create(SysFSDirectory const&, PCI::Address);
+ static NonnullLockRefPtr<PCIDeviceSysFSDirectory> 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<NonnullRefPtr<SysFSUSBDeviceInformation>> SysFSUSBDeviceInformation::create(USB::Device& device)
+ErrorOr<NonnullLockRefPtr<SysFSUSBDeviceInformation>> 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<KString> 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<NonnullRefPtr<SysFSUSBDeviceInformation>> create(USB::Device&);
+ static ErrorOr<NonnullLockRefPtr<SysFSUSBDeviceInformation>> create(USB::Device&);
virtual StringView name() const override { return m_device_name->view(); }
protected:
@@ -28,7 +28,7 @@ protected:
virtual ErrorOr<size_t> read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
- NonnullRefPtr<USB::Device> m_device;
+ NonnullLockRefPtr<USB::Device> m_device;
private:
ErrorOr<void> 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> SysFSBlockDevicesDirectory::must_create(SysFSDeviceIdentifiersDirectory const& devices_directory)
+NonnullLockRefPtr<SysFSBlockDevicesDirectory> 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<SysFSBlockDevicesDirectory> must_create(SysFSDeviceIdentifiersDirectory const&);
+ static NonnullLockRefPtr<SysFSBlockDevicesDirectory> 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> SysFSCharacterDevicesDirectory::must_create(SysFSDeviceIdentifiersDirectory const& devices_directory)
+NonnullLockRefPtr<SysFSCharacterDevicesDirectory> 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<SysFSCharacterDevicesDirectory> must_create(SysFSDeviceIdentifiersDirectory const&);
+ static NonnullLockRefPtr<SysFSCharacterDevicesDirectory> 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> SysFSDeviceComponent::must_create(Device const& device)
+NonnullLockRefPtr<SysFSDeviceComponent> 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<KString> 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<SysFSDeviceComponent> {
+ , public LockWeakable<SysFSDeviceComponent> {
friend class SysFSBlockDevicesDirectory;
friend class SysFSCharacterDevicesDirectory;
public:
- static NonnullRefPtr<SysFSDeviceComponent> must_create(Device const&);
+ static NonnullLockRefPtr<SysFSDeviceComponent> 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> SysFSDeviceIdentifiersDirectory::must_create(SysFSRootDirectory const& root_directory)
+UNMAP_AFTER_INIT NonnullLockRefPtr<SysFSDeviceIdentifiersDirectory> 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<void> {
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<SysFSDeviceIdentifiersDirectory> must_create(SysFSRootDirectory const&);
+ static NonnullLockRefPtr<SysFSDeviceIdentifiersDirectory> 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<NonnullRefPtr<SysFSSymbolicLinkDeviceComponent>> SysFSSymbolicLinkDeviceComponent::try_create(SysFSCharacterDevicesDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component)
+ErrorOr<NonnullLockRefPtr<SysFSSymbolicLinkDeviceComponent>> 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<NonnullRefPtr<SysFSSymbolicLinkDeviceComponent>> SysFSSymbolicLinkDeviceComponent::try_create(SysFSBlockDevicesDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component)
+ErrorOr<NonnullLockRefPtr<SysFSSymbolicLinkDeviceComponent>> 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<KString> 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<SysFSSymbolicLinkDeviceComponent> {
+ , public LockWeakable<SysFSSymbolicLinkDeviceComponent> {
friend class SysFSComponentRegistry;
public:
- static ErrorOr<NonnullRefPtr<SysFSSymbolicLinkDeviceComponent>> try_create(SysFSCharacterDevicesDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component);
- static ErrorOr<NonnullRefPtr<SysFSSymbolicLinkDeviceComponent>> try_create(SysFSBlockDevicesDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component);
+ static ErrorOr<NonnullLockRefPtr<SysFSSymbolicLinkDeviceComponent>> try_create(SysFSCharacterDevicesDirectory const& parent_directory, Device const& device, SysFSComponent const& pointed_component);
+ static ErrorOr<NonnullLockRefPtr<SysFSSymbolicLinkDeviceComponent>> 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<KString> major_minor_formatted_device_name, Device const&, SysFSComponent const& pointed_component);
SysFSSymbolicLinkDeviceComponent(SysFSBlockDevicesDirectory const& parent_directory, NonnullOwnPtr<KString> major_minor_formatted_device_name, Device const&, SysFSComponent const& pointed_component);
- IntrusiveListNode<SysFSSymbolicLinkDeviceComponent, NonnullRefPtr<SysFSSymbolicLinkDeviceComponent>> m_list_node;
+ IntrusiveListNode<SysFSSymbolicLinkDeviceComponent, NonnullLockRefPtr<SysFSSymbolicLinkDeviceComponent>> m_list_node;
bool const m_block_device { false };
NonnullOwnPtr<KString> 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> SysFSDevicesDirectory::must_create(SysFSRootDirectory const& root_directory)
+UNMAP_AFTER_INIT NonnullLockRefPtr<SysFSDevicesDirectory> 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<void> {
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<SysFSDevicesDirectory> must_create(SysFSRootDirectory const&);
+ static NonnullLockRefPtr<SysFSDevicesDirectory> 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> SysFSGraphicsDirectory::must_create(SysFSDevicesDirectory const& parent_directory)
+UNMAP_AFTER_INIT NonnullLockRefPtr<SysFSGraphicsDirectory> 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<void> {
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<SysFSGraphicsDirectory> must_create(SysFSDevicesDirectory const&);
+ static NonnullLockRefPtr<SysFSGraphicsDirectory> 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> DisplayConnectorAttributeSysFSComponent::must_create(DisplayConnectorSysFSDirectory const& device_directory, Type type)
+NonnullLockRefPtr<DisplayConnectorAttributeSysFSComponent> 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<DisplayConnectorAttributeSysFSComponent> must_create(DisplayConnectorSysFSDirectory const& device_directory, Type);
+ static NonnullLockRefPtr<DisplayConnectorAttributeSysFSComponent> must_create(DisplayConnectorSysFSDirectory const& device_directory, Type);
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override;
virtual ~DisplayConnectorAttributeSysFSComponent() {};
@@ -35,7 +35,7 @@ public:
protected:
ErrorOr<NonnullOwnPtr<KBuffer>> try_to_generate_buffer() const;
DisplayConnectorAttributeSysFSComponent(DisplayConnectorSysFSDirectory const& device, Type);
- NonnullRefPtr<DisplayConnector> m_device;
+ NonnullLockRefPtr<DisplayConnector> 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<DisplayConn
return *m_device;
}
-UNMAP_AFTER_INIT NonnullRefPtr<DisplayConnectorSysFSDirectory> DisplayConnectorSysFSDirectory::create(SysFSDirectory const& parent_directory, DisplayConnector const& device)
+UNMAP_AFTER_INIT NonnullLockRefPtr<DisplayConnectorSysFSDirectory> 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<void> {
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<DisplayConnectorSysFSDirectory> create(SysFSDirectory const&, DisplayConnector const&);
+ static NonnullLockRefPtr<DisplayConnectorSysFSDirectory> create(SysFSDirectory const&, DisplayConnector const&);
virtual StringView name() const override { return m_device_directory_name->view(); }
@@ -23,7 +23,7 @@ public:
private:
DisplayConnectorSysFSDirectory(NonnullOwnPtr<KString> device_directory_name, SysFSDirectory const&, DisplayConnector const&);
- RefPtr<DisplayConnector> m_device;
+ LockRefPtr<DisplayConnector> m_device;
NonnullOwnPtr<KString> 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> SysFSDisplayConnectorsDirectory::must_create(SysFSGraphicsDirectory const& parent_directory)
+UNMAP_AFTER_INIT NonnullLockRefPtr<SysFSDisplayConnectorsDirectory> 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<SysFSDisplayConnectorsDirectory> must_create(SysFSGraphicsDirectory const&);
+ static NonnullLockRefPtr<SysFSDisplayConnectorsDirectory> must_create(SysFSGraphicsDirectory const&);
void plug(Badge<DisplayConnector>, DisplayConnectorSysFSDirectory&);
void unplug(Badge<DisplayConnector>, 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> StorageDeviceAttributeSysFSComponent::must_create(StorageDeviceSysFSDirectory const& device_directory, Type type)
+NonnullLockRefPtr<StorageDeviceAttributeSysFSComponent> 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<StorageDeviceAttributeSysFSComponent> must_create(StorageDeviceSysFSDirectory const& device_directory, Type);
+ static NonnullLockRefPtr<StorageDeviceAttributeSysFSComponent> must_create(StorageDeviceSysFSDirectory const& device_directory, Type);
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const override;
virtual ~StorageDeviceAttributeSysFSComponent() {};
@@ -31,7 +31,7 @@ public:
protected:
ErrorOr<NonnullOwnPtr<KBuffer>> try_to_generate_buffer() const;
StorageDeviceAttributeSysFSComponent(StorageDeviceSysFSDirectory const& device, Type);
- NonnullRefPtr<StorageDevice> m_device;
+ NonnullLockRefPtr<StorageDevice> 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<StorageDeviceAttr
return *m_device;
}
-UNMAP_AFTER_INIT NonnullRefPtr<StorageDeviceSysFSDirectory> StorageDeviceSysFSDirectory::create(SysFSDirectory const& parent_directory, StorageDevice const& device)
+UNMAP_AFTER_INIT NonnullLockRefPtr<StorageDeviceSysFSDirectory> 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<void> {
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<StorageDeviceSysFSDirectory> create(SysFSDirectory const&, StorageDevice const&);
+ static NonnullLockRefPtr<StorageDeviceSysFSDirectory> create(SysFSDirectory const&, StorageDevice const&);
virtual StringView name() const override { return m_device_directory_name->view(); }
@@ -23,7 +23,7 @@ public:
private:
StorageDeviceSysFSDirectory(NonnullOwnPtr<KString> device_directory_name, SysFSDirectory const&, StorageDevice const&);
- RefPtr<StorageDevice> m_device;
+ LockRefPtr<StorageDevice> m_device;
NonnullOwnPtr<KString> 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> SysFSStorageDirectory::must_create(SysFSDevicesDirectory const& parent_directory)
+UNMAP_AFTER_INIT NonnullLockRefPtr<SysFSStorageDirectory> 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<SysFSStorageDirectory> must_create(SysFSDevicesDirectory const&);
+ static NonnullLockRefPtr<SysFSStorageDirectory> must_create(SysFSDevicesDirectory const&);
void plug(Badge<StorageDevice>, StorageDeviceSysFSDirectory&);
void unplug(Badge<StorageDevice>, 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> BIOSSysFSComponent::must_create(Type type, PhysicalAddress blob_paddr, size_t blob_size)
+NonnullLockRefPtr<BIOSSysFSComponent> 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 <AK/RefPtr.h>
#include <AK/Types.h>
#include <AK/Vector.h>
#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.h>
#include <Kernel/KBuffer.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/PhysicalAddress.h>
namespace Kernel {
@@ -23,7 +23,7 @@ public:
};
public:
- static NonnullRefPtr<BIOSSysFSComponent> must_create(Type, PhysicalAddress, size_t blob_size);
+ static NonnullLockRefPtr<BIOSSysFSComponent> must_create(Type, PhysicalAddress, size_t blob_size);
virtual StringView name() const override;
virtual ErrorOr<size_t> 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> BIOSSysFSDirectory::must_create(FirmwareSysFSDirectory& firmware_directory)
+UNMAP_AFTER_INIT NonnullLockRefPtr<BIOSSysFSDirectory> 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 <AK/RefPtr.h>
#include <AK/Types.h>
#include <AK/Vector.h>
#include <Kernel/FileSystem/SysFS.h>
#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/PhysicalAddress.h>
namespace Kernel {
@@ -18,7 +18,7 @@ namespace Kernel {
class BIOSSysFSDirectory : public SysFSDirectory {
public:
virtual StringView name() const override { return "bios"sv; }
- static NonnullRefPtr<BIOSSysFSDirectory> must_create(FirmwareSysFSDirectory&);
+ static NonnullLockRefPtr<BIOSSysFSDirectory> 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> PowerStateSwitchNode::must_create(FirmwareSysFSDirectory& firmware_directory)
+UNMAP_AFTER_INIT NonnullLockRefPtr<PowerStateSwitchNode> 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 <AK/RefPtr.h>
#include <AK/Types.h>
#include <AK/Vector.h>
#include <Kernel/FileSystem/SysFS.h>
#include <Kernel/FileSystem/SysFS/Subsystems/Firmware/Directory.h>
#include <Kernel/KBuffer.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Memory/MappedROM.h>
#include <Kernel/Memory/Region.h>
#include <Kernel/PhysicalAddress.h>
@@ -23,7 +23,7 @@ namespace Kernel {
class PowerStateSwitchNode final : public SysFSComponent {
public:
virtual StringView name() const override { return "power_state"sv; }
- static NonnullRefPtr<PowerStateSwitchNode> must_create(FirmwareSysFSDirectory&);
+ static NonnullLockRefPtr<PowerStateSwitchNode> must_create(FirmwareSysFSDirectory&);
virtual mode_t permissions() const override;
virtual ErrorOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) override;
virtual ErrorOr<void> 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<NonnullRefPtr<FileSystem>> TmpFS::try_create()
+ErrorOr<NonnullLockRefPtr<FileSystem>> 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<TmpFSInode> parent)
+TmpFSInode::TmpFSInode(TmpFS& fs, InodeMetadata const& metadata, LockWeakPtr<TmpFSInode> 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<TmpFSIn
TmpFSInode::~TmpFSInode() = default;
-ErrorOr<NonnullRefPtr<TmpFSInode>> TmpFSInode::try_create(TmpFS& fs, InodeMetadata const& metadata, WeakPtr<TmpFSInode> parent)
+ErrorOr<NonnullLockRefPtr<TmpFSInode>> TmpFSInode::try_create(TmpFS& fs, InodeMetadata const& metadata, LockWeakPtr<TmpFSInode> 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<NonnullRefPtr<TmpFSInode>> TmpFSInode::try_create_root(TmpFS& fs)
+ErrorOr<NonnullLockRefPtr<TmpFSInode>> TmpFSInode::try_create_root(TmpFS& fs)
{
InodeMetadata metadata;
auto now = kgettimeofday().to_truncated_seconds();
@@ -147,7 +147,7 @@ ErrorOr<size_t> TmpFSInode::write_bytes(off_t offset, size_t size, UserOrKernelB
return size;
}
-ErrorOr<NonnullRefPtr<Inode>> TmpFSInode::lookup(StringView name)
+ErrorOr<NonnullLockRefPtr<Inode>> TmpFSInode::lookup(StringView name)
{
MutexLocker locker(m_inode_lock, Mutex::Mode::Shared);
VERIFY(is_directory());
@@ -205,7 +205,7 @@ ErrorOr<void> TmpFSInode::chown(UserID uid, GroupID gid)
return {};
}
-ErrorOr<NonnullRefPtr<Inode>> TmpFSInode::create_child(StringView name, mode_t mode, dev_t dev, UserID uid, GroupID gid)
+ErrorOr<NonnullLockRefPtr<Inode>> 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<NonnullRefPtr<FileSystem>> try_create();
+ static ErrorOr<NonnullLockRefPtr<FileSystem>> try_create();
virtual ErrorOr<void> initialize() override;
virtual StringView class_name() const override { return "TmpFS"sv; }
@@ -31,7 +31,7 @@ public:
private:
TmpFS();
- RefPtr<TmpFSInode> m_root_inode;
+ LockRefPtr<TmpFSInode> m_root_inode;
unsigned m_next_inode_index { 1 };
unsigned next_inode_index();
@@ -50,10 +50,10 @@ public:
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
virtual InodeMetadata metadata() const override;
virtual ErrorOr<void> traverse_as_directory(Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
- virtual ErrorOr<NonnullRefPtr<Inode>> lookup(StringView name) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> lookup(StringView name) override;
virtual ErrorOr<void> flush_metadata() override;
virtual ErrorOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const& buffer, OpenFileDescription*) override;
- virtual ErrorOr<NonnullRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> create_child(StringView name, mode_t, dev_t, UserID, GroupID) override;
virtual ErrorOr<void> add_child(Inode&, StringView name, mode_t) override;
virtual ErrorOr<void> remove_child(StringView name) override;
virtual ErrorOr<void> chmod(mode_t) override;
@@ -64,13 +64,13 @@ public:
virtual ErrorOr<void> set_mtime(time_t) override;
private:
- TmpFSInode(TmpFS& fs, InodeMetadata const& metadata, WeakPtr<TmpFSInode> parent);
- static ErrorOr<NonnullRefPtr<TmpFSInode>> try_create(TmpFS&, InodeMetadata const& metadata, WeakPtr<TmpFSInode> parent);
- static ErrorOr<NonnullRefPtr<TmpFSInode>> try_create_root(TmpFS&);
+ TmpFSInode(TmpFS& fs, InodeMetadata const& metadata, LockWeakPtr<TmpFSInode> parent);
+ static ErrorOr<NonnullLockRefPtr<TmpFSInode>> try_create(TmpFS&, InodeMetadata const& metadata, LockWeakPtr<TmpFSInode> parent);
+ static ErrorOr<NonnullLockRefPtr<TmpFSInode>> try_create_root(TmpFS&);
struct Child {
NonnullOwnPtr<KString> name;
- NonnullRefPtr<TmpFSInode> inode;
+ NonnullLockRefPtr<TmpFSInode> inode;
IntrusiveListNode<Child> list_node {};
using List = IntrusiveList<&Child::list_node>;
};
@@ -78,7 +78,7 @@ private:
Child* find_child_by_name(StringView);
InodeMetadata m_metadata;
- WeakPtr<TmpFSInode> m_parent;
+ LockWeakPtr<TmpFSInode> m_parent;
OwnPtr<KBuffer> 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<InodeMetadata> VirtualFileSystem::lookup_metadata(StringView path, Custo
return custody->inode().metadata();
}
-ErrorOr<NonnullRefPtr<OpenFileDescription>> VirtualFileSystem::open(StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> owner)
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> VirtualFileSystem::open(StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> owner)
{
if ((options & O_CREAT) && (options & O_DIRECTORY))
return EINVAL;
- RefPtr<Custody> parent_custody;
+ LockRefPtr<Custody> 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<void> 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<Custody> parent_custody;
+ LockRefPtr<Custody> 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<void> VirtualFileSystem::mknod(StringView path, mode_t mode, dev_t dev,
return {};
}
-ErrorOr<NonnullRefPtr<OpenFileDescription>> VirtualFileSystem::create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> owner)
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> VirtualFileSystem::create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> owner)
{
auto basename = KLexicalPath::basename(path);
auto parent_path = TRY(parent_custody.try_serialize_absolute_path());
@@ -397,7 +397,7 @@ ErrorOr<void> VirtualFileSystem::mkdir(StringView path, mode_t mode, Custody& ba
path = "/"sv;
}
- RefPtr<Custody> parent_custody;
+ LockRefPtr<Custody> 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<void> VirtualFileSystem::access(StringView path, int mode, Custody& base
return {};
}
-ErrorOr<NonnullRefPtr<Custody>> VirtualFileSystem::open_directory(StringView path, Custody& base)
+ErrorOr<NonnullLockRefPtr<Custody>> VirtualFileSystem::open_directory(StringView path, Custody& base)
{
auto custody = TRY(resolve_path(path, base));
auto& inode = custody->inode();
@@ -480,11 +480,11 @@ ErrorOr<void> VirtualFileSystem::chmod(StringView path, mode_t mode, Custody& ba
ErrorOr<void> VirtualFileSystem::rename(StringView old_path, StringView new_path, Custody& base)
{
- RefPtr<Custody> old_parent_custody;
+ LockRefPtr<Custody> 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<Custody> new_parent_custody;
+ LockRefPtr<Custody> 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<void> VirtualFileSystem::link(StringView old_path, StringView new_path,
auto old_custody = TRY(resolve_path(old_path, base));
auto& old_inode = old_custody->inode();
- RefPtr<Custody> parent_custody;
+ LockRefPtr<Custody> 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<void> VirtualFileSystem::link(StringView old_path, StringView new_path,
ErrorOr<void> VirtualFileSystem::unlink(StringView path, Custody& base)
{
- RefPtr<Custody> parent_custody;
+ LockRefPtr<Custody> 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<void> VirtualFileSystem::unlink(StringView path, Custody& base)
ErrorOr<void> VirtualFileSystem::symlink(StringView target, StringView linkpath, Custody& base)
{
- RefPtr<Custody> parent_custody;
+ LockRefPtr<Custody> 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<void> VirtualFileSystem::symlink(StringView target, StringView linkpath,
ErrorOr<void> VirtualFileSystem::rmdir(StringView path, Custody& base)
{
- RefPtr<Custody> parent_custody;
+ LockRefPtr<Custody> parent_custody;
auto custody = TRY(resolve_path(path, base, &parent_custody));
auto& inode = custody->inode();
@@ -871,7 +871,7 @@ ErrorOr<void> VirtualFileSystem::validate_path_against_process_veil(StringView p
return {};
}
-ErrorOr<NonnullRefPtr<Custody>> VirtualFileSystem::resolve_path(StringView path, Custody& base, RefPtr<Custody>* out_parent, int options, int symlink_recursion_level)
+ErrorOr<NonnullLockRefPtr<Custody>> VirtualFileSystem::resolve_path(StringView path, Custody& base, LockRefPtr<Custody>* 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<NonnullRefPtr<Custody>> VirtualFileSystem::resolve_path_without_veil(StringView path, Custody& base, RefPtr<Custody>* out_parent, int options, int symlink_recursion_level)
+ErrorOr<NonnullLockRefPtr<Custody>> VirtualFileSystem::resolve_path_without_veil(StringView path, Custody& base, LockRefPtr<Custody>* out_parent, int options, int symlink_recursion_level)
{
if (symlink_recursion_level >= symlink_recursion_limit)
return ELOOP;
@@ -910,7 +910,7 @@ ErrorOr<NonnullRefPtr<Custody>> VirtualFileSystem::resolve_path_without_veil(Str
GenericLexer path_lexer(path);
auto& current_process = Process::current();
- NonnullRefPtr<Custody> custody = path[0] == '/' ? root_custody() : base;
+ NonnullLockRefPtr<Custody> 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 <AK/HashMap.h>
#include <AK/NonnullOwnPtrVector.h>
#include <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <Kernel/FileSystem/FileSystem.h>
#include <Kernel/FileSystem/InodeIdentifier.h>
#include <Kernel/FileSystem/InodeMetadata.h>
#include <Kernel/FileSystem/Mount.h>
#include <Kernel/FileSystem/UnveilNode.h>
#include <Kernel/Forward.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Locking/SpinlockProtected.h>
namespace Kernel {
@@ -50,8 +50,8 @@ public:
ErrorOr<void> remount(Custody& mount_point, int new_flags);
ErrorOr<void> unmount(Inode& guest_inode);
- ErrorOr<NonnullRefPtr<OpenFileDescription>> open(StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> = {});
- ErrorOr<NonnullRefPtr<OpenFileDescription>> create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> = {});
+ ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open(StringView path, int options, mode_t mode, Custody& base, Optional<UidAndGid> = {});
+ ErrorOr<NonnullLockRefPtr<OpenFileDescription>> create(StringView path, int options, mode_t mode, Custody& parent_custody, Optional<UidAndGid> = {});
ErrorOr<void> mkdir(StringView path, mode_t mode, Custody& base);
ErrorOr<void> link(StringView old_path, StringView new_path, Custody& base);
ErrorOr<void> unlink(StringView path, Custody& base);
@@ -67,7 +67,7 @@ public:
ErrorOr<void> utimensat(StringView path, Custody& base, timespec const& atime, timespec const& mtime, int options = 0);
ErrorOr<void> rename(StringView oldpath, StringView newpath, Custody& base);
ErrorOr<void> mknod(StringView path, mode_t, dev_t, Custody& base);
- ErrorOr<NonnullRefPtr<Custody>> open_directory(StringView path, Custody& base);
+ ErrorOr<NonnullLockRefPtr<Custody>> open_directory(StringView path, Custody& base);
ErrorOr<void> for_each_mount(Function<ErrorOr<void>(Mount const&)>) const;
@@ -76,8 +76,8 @@ public:
static void sync();
Custody& root_custody();
- ErrorOr<NonnullRefPtr<Custody>> resolve_path(StringView path, Custody& base, RefPtr<Custody>* out_parent = nullptr, int options = 0, int symlink_recursion_level = 0);
- ErrorOr<NonnullRefPtr<Custody>> resolve_path_without_veil(StringView path, Custody& base, RefPtr<Custody>* out_parent = nullptr, int options = 0, int symlink_recursion_level = 0);
+ ErrorOr<NonnullLockRefPtr<Custody>> resolve_path(StringView path, Custody& base, LockRefPtr<Custody>* out_parent = nullptr, int options = 0, int symlink_recursion_level = 0);
+ ErrorOr<NonnullLockRefPtr<Custody>> resolve_path_without_veil(StringView path, Custody& base, LockRefPtr<Custody>* 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<Inode> m_root_inode;
- RefPtr<Custody> m_root_custody;
+ LockRefPtr<Inode> m_root_inode;
+ LockRefPtr<Custody> m_root_custody;
SpinlockProtected<Vector<Mount, 16>> 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> ACPISysFSComponent::create(StringView name, PhysicalAddress paddr, size_t table_size)
+UNMAP_AFTER_INIT NonnullLockRefPtr<ACPISysFSComponent> 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<size_t> 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> ACPISysFSDirectory::must_create(FirmwareSysFSDirectory& firmware_directory)
+UNMAP_AFTER_INIT NonnullLockRefPtr<ACPISysFSDirectory> 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 <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/CommandLine.h>
#include <Kernel/FileSystem/SysFS/Component.h>
@@ -14,6 +13,7 @@
#include <Kernel/Firmware/ACPI/Definitions.h>
#include <Kernel/Firmware/ACPI/Initialize.h>
#include <Kernel/Interrupts/IRQHandler.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Memory/Region.h>
#include <Kernel/Memory/TypedMapping.h>
#include <Kernel/PhysicalAddress.h>
@@ -24,7 +24,7 @@ namespace Kernel::ACPI {
class ACPISysFSDirectory : public SysFSDirectory {
public:
virtual StringView name() const override { return "acpi"sv; }
- static NonnullRefPtr<ACPISysFSDirectory> must_create(FirmwareSysFSDirectory& firmware_directory);
+ static NonnullLockRefPtr<ACPISysFSDirectory> 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<ACPISysFSComponent> create(StringView name, PhysicalAddress, size_t table_size);
+ static NonnullLockRefPtr<ACPISysFSComponent> create(StringView name, PhysicalAddress, size_t table_size);
virtual StringView name() const override { return m_table_name->view(); }
virtual ErrorOr<size_t> 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<ProcFSAdapters> must_create();
+ static NonnullLockRefPtr<ProcFSAdapters> must_create();
private:
ProcFSAdapters();
@@ -74,7 +74,7 @@ private:
class ProcFSARP final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSARP> must_create();
+ static NonnullLockRefPtr<ProcFSARP> must_create();
private:
ProcFSARP();
@@ -99,7 +99,7 @@ private:
class ProcFSRoute final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSRoute> must_create();
+ static NonnullLockRefPtr<ProcFSRoute> must_create();
private:
ProcFSRoute();
@@ -128,7 +128,7 @@ private:
class ProcFSTCP final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSTCP> must_create();
+ static NonnullLockRefPtr<ProcFSTCP> must_create();
private:
ProcFSTCP();
@@ -165,7 +165,7 @@ private:
class ProcFSLocalNet final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSLocalNet> must_create();
+ static NonnullLockRefPtr<ProcFSLocalNet> must_create();
private:
ProcFSLocalNet();
@@ -191,7 +191,7 @@ private:
class ProcFSUDP final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSUDP> must_create();
+ static NonnullLockRefPtr<ProcFSUDP> must_create();
private:
ProcFSUDP();
@@ -221,7 +221,7 @@ private:
class ProcFSNetworkDirectory : public ProcFSExposedDirectory {
public:
- static NonnullRefPtr<ProcFSNetworkDirectory> must_create(ProcFSRootDirectory const& parent_directory);
+ static NonnullLockRefPtr<ProcFSNetworkDirectory> must_create(ProcFSRootDirectory const& parent_directory);
private:
ProcFSNetworkDirectory(ProcFSRootDirectory const& parent_directory);
@@ -229,40 +229,40 @@ private:
class ProcFSSystemDirectory : public ProcFSExposedDirectory {
public:
- static NonnullRefPtr<ProcFSSystemDirectory> must_create(ProcFSRootDirectory const& parent_directory);
+ static NonnullLockRefPtr<ProcFSSystemDirectory> must_create(ProcFSRootDirectory const& parent_directory);
private:
ProcFSSystemDirectory(ProcFSRootDirectory const& parent_directory);
};
-UNMAP_AFTER_INIT NonnullRefPtr<ProcFSAdapters> ProcFSAdapters::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSAdapters> 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> ProcFSARP::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSARP> 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> ProcFSRoute::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSRoute> 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> ProcFSTCP::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSTCP> 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> ProcFSLocalNet::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSLocalNet> 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> ProcFSUDP::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSUDP> 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> ProcFSNetworkDirectory::must_create(ProcFSRootDirectory const& parent_directory)
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSNetworkDirectory> 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<ProcFSDumpKmallocStacks> must_create(ProcFSSystemDirectory const&);
+ static NonnullLockRefPtr<ProcFSDumpKmallocStacks> 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<ProcFSUBSanDeadly> must_create(ProcFSSystemDirectory const&);
+ static NonnullLockRefPtr<ProcFSUBSanDeadly> 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<ProcFSCapsLockRemap> must_create(ProcFSSystemDirectory const&);
+ static NonnullLockRefPtr<ProcFSCapsLockRemap> 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> ProcFSDumpKmallocStacks::must_create(ProcFSSystemDirectory const&)
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSDumpKmallocStacks> 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> ProcFSUBSanDeadly::must_create(ProcFSSystemDirectory const&)
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSUBSanDeadly> 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> ProcFSCapsLockRemap::must_create(ProcFSSystemDirectory const&)
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSCapsLockRemap> 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<ProcFSSelfProcessDirectory> must_create();
+ static NonnullLockRefPtr<ProcFSSelfProcessDirectory> must_create();
private:
ProcFSSelfProcessDirectory();
@@ -392,7 +392,7 @@ private:
class ProcFSDiskUsage final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSDiskUsage> must_create();
+ static NonnullLockRefPtr<ProcFSDiskUsage> must_create();
private:
ProcFSDiskUsage();
@@ -430,7 +430,7 @@ private:
class ProcFSMemoryStatus final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSMemoryStatus> must_create();
+ static NonnullLockRefPtr<ProcFSMemoryStatus> must_create();
private:
ProcFSMemoryStatus();
@@ -459,7 +459,7 @@ private:
class ProcFSSystemStatistics final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSSystemStatistics> must_create();
+ static NonnullLockRefPtr<ProcFSSystemStatistics> must_create();
private:
ProcFSSystemStatistics();
@@ -482,7 +482,7 @@ private:
class ProcFSOverallProcesses final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSOverallProcesses> must_create();
+ static NonnullLockRefPtr<ProcFSOverallProcesses> must_create();
private:
ProcFSOverallProcesses();
@@ -600,7 +600,7 @@ private:
};
class ProcFSCPUInformation final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSCPUInformation> must_create();
+ static NonnullLockRefPtr<ProcFSCPUInformation> must_create();
private:
ProcFSCPUInformation();
@@ -665,7 +665,7 @@ private:
};
class ProcFSDmesg final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSDmesg> must_create();
+ static NonnullLockRefPtr<ProcFSDmesg> must_create();
virtual mode_t required_mode() const override { return 0400; }
@@ -683,7 +683,7 @@ private:
};
class ProcFSInterrupts final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSInterrupts> must_create();
+ static NonnullLockRefPtr<ProcFSInterrupts> must_create();
private:
ProcFSInterrupts();
@@ -713,7 +713,7 @@ private:
};
class ProcFSKeymap final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSKeymap> must_create();
+ static NonnullLockRefPtr<ProcFSKeymap> must_create();
private:
ProcFSKeymap();
@@ -730,7 +730,7 @@ private:
class ProcFSDevices final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSDevices> must_create();
+ static NonnullLockRefPtr<ProcFSDevices> must_create();
private:
ProcFSDevices();
@@ -758,7 +758,7 @@ private:
};
class ProcFSUptime final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSUptime> must_create();
+ static NonnullLockRefPtr<ProcFSUptime> must_create();
private:
ProcFSUptime();
@@ -769,7 +769,7 @@ private:
};
class ProcFSCommandLine final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSCommandLine> must_create();
+ static NonnullLockRefPtr<ProcFSCommandLine> must_create();
private:
ProcFSCommandLine();
@@ -782,7 +782,7 @@ private:
};
class ProcFSSystemMode final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSSystemMode> must_create();
+ static NonnullLockRefPtr<ProcFSSystemMode> must_create();
private:
ProcFSSystemMode();
@@ -796,7 +796,7 @@ private:
class ProcFSProfile final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSProfile> must_create();
+ static NonnullLockRefPtr<ProcFSProfile> must_create();
virtual mode_t required_mode() const override { return 0400; }
@@ -813,7 +813,7 @@ private:
class ProcFSKernelBase final : public ProcFSGlobalInformation {
public:
- static NonnullRefPtr<ProcFSKernelBase> must_create();
+ static NonnullLockRefPtr<ProcFSKernelBase> must_create();
private:
ProcFSKernelBase();
@@ -828,66 +828,66 @@ private:
}
};
-UNMAP_AFTER_INIT NonnullRefPtr<ProcFSSelfProcessDirectory> ProcFSSelfProcessDirectory::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSSelfProcessDirectory> 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> ProcFSDiskUsage::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSDiskUsage> 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> ProcFSMemoryStatus::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSMemoryStatus> 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> ProcFSSystemStatistics::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSSystemStatistics> 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> ProcFSOverallProcesses::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSOverallProcesses> 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> ProcFSCPUInformation::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSCPUInformation> 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> ProcFSDmesg::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSDmesg> 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> ProcFSInterrupts::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSInterrupts> 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> ProcFSKeymap::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSKeymap> 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> ProcFSDevices::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSDevices> 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> ProcFSUptime::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSUptime> 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> ProcFSCommandLine::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSCommandLine> 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> ProcFSSystemMode::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSSystemMode> 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> ProcFSProfile::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSProfile> 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> ProcFSKernelBase::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSKernelBase> 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> ProcFSSystemDirectory::must_create(ProcFSRootDirectory const& parent_directory)
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSSystemDirectory> 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> ProcFSRootDirectory::must_create()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ProcFSRootDirectory> 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<void> ProcFSRootDirectory::traverse_as_directory(FileSystemID fsid, Func
});
}
-ErrorOr<NonnullRefPtr<ProcFSExposedComponent>> ProcFSRootDirectory::lookup(StringView name)
+ErrorOr<NonnullLockRefPtr<ProcFSExposedComponent>> 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> BochsDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, bool virtual_box_hardware)
+NonnullLockRefPtr<BochsDisplayConnector> BochsDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, bool virtual_box_hardware)
{
auto device_or_error = DeviceManagement::try_create_device<BochsDisplayConnector>(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 <AK/RefPtr.h>
#include <AK/Try.h>
#include <Kernel/Graphics/Bochs/Definitions.h>
#include <Kernel/Graphics/Console/GenericFramebufferConsole.h>
#include <Kernel/Graphics/DisplayConnector.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Memory/TypedMapping.h>
@@ -24,7 +24,7 @@ class BochsDisplayConnector
public:
AK_TYPEDEF_DISTINCT_ORDERED_ID(u16, IndexID);
- static NonnullRefPtr<BochsDisplayConnector> must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, bool virtual_box_hardware);
+ static NonnullLockRefPtr<BochsDisplayConnector> 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<Graphics::GenericFramebufferConsole> m_framebuffer_console;
+ LockRefPtr<Graphics::GenericFramebufferConsole> 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> BochsGraphicsAdapter::initialize(PCI::DeviceIdentifier const& pci_device_identifier)
+UNMAP_AFTER_INIT NonnullLockRefPtr<BochsGraphicsAdapter> 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<BochsGraphicsAdapter> initialize(PCI::DeviceIdentifier const&);
+ static NonnullLockRefPtr<BochsGraphicsAdapter> initialize(PCI::DeviceIdentifier const&);
virtual ~BochsGraphicsAdapter() = default;
private:
@@ -33,6 +33,6 @@ private:
explicit BochsGraphicsAdapter(PCI::DeviceIdentifier const&);
- RefPtr<BochsDisplayConnector> m_display_connector;
+ LockRefPtr<BochsDisplayConnector> 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> QEMUDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping<BochsDisplayMMIORegisters volatile> registers_mapping)
+NonnullLockRefPtr<QEMUDisplayConnector> QEMUDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping<BochsDisplayMMIORegisters volatile> registers_mapping)
{
auto device_or_error = DeviceManagement::try_create_device<QEMUDisplayConnector>(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 <AK/RefPtr.h>
#include <AK/Try.h>
#include <Kernel/Graphics/Bochs/DisplayConnector.h>
#include <Kernel/Graphics/Console/GenericFramebufferConsole.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Memory/TypedMapping.h>
@@ -22,7 +22,7 @@ class QEMUDisplayConnector final
friend class DeviceManagement;
public:
- static NonnullRefPtr<QEMUDisplayConnector> must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping<BochsDisplayMMIORegisters volatile>);
+ static NonnullLockRefPtr<QEMUDisplayConnector> must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping<BochsDisplayMMIORegisters volatile>);
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> ContiguousFramebufferConsole::initialize(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch)
+NonnullLockRefPtr<ContiguousFramebufferConsole> 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<ContiguousFramebufferConsole> initialize(PhysicalAddress, size_t width, size_t height, size_t pitch);
+ static NonnullLockRefPtr<ContiguousFramebufferConsole> 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> VGATextModeConsole::initialize()
+UNMAP_AFTER_INIT NonnullLockRefPtr<VGATextModeConsole> 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<Memory::Region> 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<VGATextModeConsole> initialize();
+ static NonnullLockRefPtr<VGATextModeConsole> 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<Memory::SharedFramebufferVMObject> m_shared_framebuffer_vmobject;
+ LockRefPtr<Memory::SharedFramebufferVMObject> m_shared_framebuffer_vmobject;
- WeakPtr<Process> m_responsible_process;
+ LockWeakPtr<Process> m_responsible_process;
Spinlock m_responsible_process_lock { LockRank::None };
- IntrusiveListNode<DisplayConnector, RefPtr<DisplayConnector>> m_list_node;
+ IntrusiveListNode<DisplayConnector, LockRefPtr<DisplayConnector>> 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> GenericDisplayConnector::must_create_with_preset_resolution(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch)
+NonnullLockRefPtr<GenericDisplayConnector> 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<GenericDisplayConnector>(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 <AK/RefPtr.h>
#include <AK/Try.h>
#include <Kernel/Graphics/Console/GenericFramebufferConsole.h>
#include <Kernel/Graphics/DisplayConnector.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Memory/TypedMapping.h>
@@ -20,7 +20,7 @@ class GenericDisplayConnector
friend class DeviceManagement;
public:
- static NonnullRefPtr<GenericDisplayConnector> must_create_with_preset_resolution(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch);
+ static NonnullLockRefPtr<GenericDisplayConnector> must_create_with_preset_resolution(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch);
protected:
ErrorOr<void> create_attached_framebuffer_console();
@@ -47,6 +47,6 @@ protected:
virtual void enable_console() override final;
virtual void disable_console() override final;
- RefPtr<Graphics::GenericFramebufferConsole> m_framebuffer_console;
+ LockRefPtr<Graphics::GenericFramebufferConsole> 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 <AK/Types.h>
-#include <AK/Weakable.h>
#include <Kernel/Bus/PCI/Definitions.h>
#include <Kernel/Devices/BlockDevice.h>
+#include <Kernel/Library/LockWeakable.h>
#include <Kernel/PhysicalAddress.h>
namespace Kernel {
class GenericGraphicsAdapter
: public AtomicRefCounted<GenericGraphicsAdapter>
- , public Weakable<GenericGraphicsAdapter> {
+ , public LockWeakable<GenericGraphicsAdapter> {
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<GenericGraphicsAdapter> adapter;
+ LockRefPtr<GenericGraphicsAdapter> 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 <AK/NonnullOwnPtr.h>
-#include <AK/NonnullRefPtr.h>
-#include <AK/NonnullRefPtrVector.h>
#include <AK/Types.h>
#include <Kernel/Bus/PCI/Definitions.h>
#include <Kernel/Graphics/Console/Console.h>
@@ -16,6 +14,8 @@
#include <Kernel/Graphics/Generic/DisplayConnector.h>
#include <Kernel/Graphics/GenericGraphicsAdapter.h>
#include <Kernel/Graphics/VirtIOGPU/GraphicsAdapter.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Memory/Region.h>
namespace Kernel {
@@ -37,7 +37,7 @@ public:
void disable_vga_text_mode_console_cursor();
void disable_vga_emulation_access_permanently();
- RefPtr<Graphics::Console> console() const { return m_console; }
+ LockRefPtr<Graphics::Console> 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<GenericGraphicsAdapter> m_graphics_devices;
- RefPtr<Graphics::Console> m_console;
+ NonnullLockRefPtrVector<GenericGraphicsAdapter> m_graphics_devices;
+ LockRefPtr<Graphics::Console> m_console;
// Note: This is only used when booting with kernel commandline that includes "graphics_subsystem_mode=limited"
- RefPtr<GenericDisplayConnector> m_preset_resolution_generic_display_connector;
+ LockRefPtr<GenericDisplayConnector> 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<IntelGraphics::PLLSettings> IntelNativeDisplayConnector::create_pll_set
return {};
}
-NonnullRefPtr<IntelNativeDisplayConnector> IntelNativeDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, PhysicalAddress registers_region_address, size_t registers_region_length)
+NonnullLockRefPtr<IntelNativeDisplayConnector> 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<IntelNativeDisplayConnector>(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 <AK/RefPtr.h>
#include <AK/Try.h>
#include <Kernel/Graphics/Console/GenericFramebufferConsole.h>
#include <Kernel/Graphics/Definitions.h>
#include <Kernel/Graphics/DisplayConnector.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Memory/TypedMapping.h>
namespace Kernel {
@@ -81,7 +81,7 @@ class IntelNativeDisplayConnector final
friend class DeviceManagement;
public:
- static NonnullRefPtr<IntelNativeDisplayConnector> must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, PhysicalAddress registers_region_address, size_t registers_region_length);
+ static NonnullLockRefPtr<IntelNativeDisplayConnector> 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<IntelGraphics::PLLSettings> create_pll_settings(u64 target_frequency, u64 reference_clock, IntelGraphics::PLLMaxSettings const&);
mutable Spinlock m_registers_lock { LockRank::None };
- RefPtr<Graphics::GenericFramebufferConsole> m_framebuffer_console;
+ LockRefPtr<Graphics::GenericFramebufferConsole> m_framebuffer_console;
const PhysicalAddress m_registers;
NonnullOwnPtr<Memory::Region> 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> IntelNativeGraphicsAdapter::initialize(PCI::DeviceIdentifier const& pci_device_identifier)
+LockRefPtr<IntelNativeGraphicsAdapter> 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<IntelNativeGraphicsAdapter> initialize(PCI::DeviceIdentifier const&);
+ static LockRefPtr<IntelNativeGraphicsAdapter> initialize(PCI::DeviceIdentifier const&);
virtual ~IntelNativeGraphicsAdapter() = default;
@@ -29,6 +29,6 @@ private:
explicit IntelNativeGraphicsAdapter(PCI::Address);
- RefPtr<IntelNativeDisplayConnector> m_display_connector;
+ LockRefPtr<IntelNativeDisplayConnector> 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> VMWareFramebufferConsole::initialize(VMWareDisplayConnector& parent_display_connector)
+NonnullLockRefPtr<VMWareFramebufferConsole> 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<Timer> refresh_timer = adopt_ref(*new (nothrow) Timer());
+ NonnullLockRefPtr<Timer> 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<VMWareFramebufferConsole> initialize(VMWareDisplayConnector& parent_display_connector);
+ static NonnullLockRefPtr<VMWareFramebufferConsole> 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<VMWareDisplayConnector> m_parent_display_connector;
+ LockRefPtr<VMWareDisplayConnector> 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> VMWareDisplayConnector::must_create(VMWareGraphicsAdapter const& parent_adapter, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size)
+NonnullLockRefPtr<VMWareDisplayConnector> VMWareDisplayConnector::must_create(VMWareGraphicsAdapter const& parent_adapter, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size)
{
auto connector = MUST(DeviceManagement::try_create_device<VMWareDisplayConnector>(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 <AK/RefPtr.h>
#include <AK/Try.h>
#include <Kernel/Graphics/Console/GenericFramebufferConsole.h>
#include <Kernel/Graphics/DisplayConnector.h>
#include <Kernel/Graphics/VMWare/GraphicsAdapter.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Memory/TypedMapping.h>
@@ -23,7 +23,7 @@ class VMWareDisplayConnector : public DisplayConnector {
friend class DeviceManagement;
public:
- static NonnullRefPtr<VMWareDisplayConnector> must_create(VMWareGraphicsAdapter const& parent_adapter, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size);
+ static NonnullLockRefPtr<VMWareDisplayConnector> 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<VMWareGraphicsAdapter> m_parent_adapter;
- RefPtr<VMWareFramebufferConsole> m_framebuffer_console;
+ NonnullLockRefPtr<VMWareGraphicsAdapter> m_parent_adapter;
+ LockRefPtr<VMWareFramebufferConsole> 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> VMWareGraphicsAdapter::try_initialize(PCI::DeviceIdentifier const& pci_device_identifier)
+UNMAP_AFTER_INIT LockRefPtr<VMWareGraphicsAdapter> 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<VMWareGraphicsAdapter> try_initialize(PCI::DeviceIdentifier const&);
+ static LockRefPtr<VMWareGraphicsAdapter> try_initialize(PCI::DeviceIdentifier const&);
virtual ~VMWareGraphicsAdapter() = default;
ErrorOr<void> modeset_primary_screen_resolution(Badge<VMWareDisplayConnector>, size_t width, size_t height);
@@ -49,7 +49,7 @@ private:
explicit VMWareGraphicsAdapter(PCI::DeviceIdentifier const&);
Memory::TypedMapping<volatile VMWareDisplayFIFORegisters> m_fifo_registers;
- RefPtr<VMWareDisplayConnector> m_display_connector;
+ LockRefPtr<VMWareDisplayConnector> 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> Console::initialize(VirtIODisplayConnector& parent_display_connector)
+NonnullLockRefPtr<Console> 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<Timer> refresh_timer = adopt_ref(*new Timer());
+ NonnullLockRefPtr<Timer> 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<Console> initialize(VirtIODisplayConnector& parent_display_connector);
+ static NonnullLockRefPtr<Console> 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<VirtIODisplayConnector> m_parent_display_connector;
+ NonnullLockRefPtr<VirtIODisplayConnector> 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> VirtIODisplayConnector::must_create(VirtIOGraphicsAdapter& graphics_adapter, Graphics::VirtIOGPU::ScanoutID scanout_id)
+NonnullLockRefPtr<VirtIODisplayConnector> VirtIODisplayConnector::must_create(VirtIOGraphicsAdapter& graphics_adapter, Graphics::VirtIOGPU::ScanoutID scanout_id)
{
auto device_or_error = DeviceManagement::try_create_device<VirtIODisplayConnector>(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<VirtIODisplayConnector> must_create(VirtIOGraphicsAdapter& graphics_adapter, Graphics::VirtIOGPU::ScanoutID scanout_id);
+ static NonnullLockRefPtr<VirtIODisplayConnector> must_create(VirtIOGraphicsAdapter& graphics_adapter, Graphics::VirtIOGPU::ScanoutID scanout_id);
void set_edid_bytes(Badge<VirtIOGraphicsAdapter>, Array<u8, 128> const& edid_bytes);
void set_safe_mode_setting_after_initialization(Badge<VirtIOGraphicsAdapter>);
@@ -81,8 +81,8 @@ private:
// Context used for kernel operations (e.g. flushing resources to scanout)
Graphics::VirtIOGPU::ContextID m_kernel_context_id;
- NonnullRefPtr<VirtIOGraphicsAdapter> m_graphics_adapter;
- RefPtr<Graphics::Console> m_console;
+ NonnullLockRefPtr<VirtIOGraphicsAdapter> m_graphics_adapter;
+ LockRefPtr<Graphics::Console> 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> VirtIOGPU3DDevice::must_create(VirtIOGraphicsAdapter const& adapter)
+NonnullLockRefPtr<VirtIOGPU3DDevice> 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<RefPtr<VirtIOGPU3DDevice::PerContextState>> VirtIOGPU3DDevice::get_context_for_description(OpenFileDescription& description)
+ErrorOr<LockRefPtr<VirtIOGPU3DDevice::PerContextState>> VirtIOGPU3DDevice::get_context_for_description(OpenFileDescription& description)
{
auto res = m_context_state_lookup.get(&description);
if (!res.has_value())
@@ -66,7 +66,7 @@ ErrorOr<void> 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<PerContextState> per_context_state = TRY(PerContextState::try_create(context_id));
+ LockRefPtr<PerContextState> 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<VirtIOGPU3DDevice> must_create(VirtIOGraphicsAdapter const&);
+ static NonnullLockRefPtr<VirtIOGPU3DDevice> must_create(VirtIOGraphicsAdapter const&);
private:
VirtIOGPU3DDevice(VirtIOGraphicsAdapter const& graphics_adapter, NonnullOwnPtr<Memory::Region> transfer_buffer_region);
class PerContextState final : public AtomicRefCounted<PerContextState> {
public:
- static ErrorOr<RefPtr<PerContextState>> try_create(Graphics::VirtIOGPU::ContextID context_id)
+ static ErrorOr<LockRefPtr<PerContextState>> 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<RefPtr<PerContextState>> get_context_for_description(OpenFileDescription&);
+ ErrorOr<LockRefPtr<PerContextState>> get_context_for_description(OpenFileDescription&);
- NonnullRefPtr<VirtIOGraphicsAdapter> m_graphics_adapter;
+ NonnullLockRefPtr<VirtIOGraphicsAdapter> m_graphics_adapter;
// Context used for kernel operations (e.g. flushing resources to scanout)
Graphics::VirtIOGPU::ContextID m_kernel_context_id;
- HashMap<OpenFileDescription*, RefPtr<PerContextState>> m_context_state_lookup;
+ HashMap<OpenFileDescription*, LockRefPtr<PerContextState>> m_context_state_lookup;
// Memory management for backing buffers
NonnullOwnPtr<Memory::Region> 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> VirtIOGraphicsAdapter::initialize(PCI::DeviceIdentifier const& device_identifier)
+NonnullLockRefPtr<VirtIOGraphicsAdapter> 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> 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<VirtIOGraphicsAdapter> initialize(PCI::DeviceIdentifier const&);
+ static NonnullLockRefPtr<VirtIOGraphicsAdapter> initialize(PCI::DeviceIdentifier const&);
virtual void initialize() override;
void initialize_3d_device();
@@ -63,7 +63,7 @@ private:
Graphics::VirtIOGPU::ResourceID resource_id { 0 };
};
- RefPtr<VirtIODisplayConnector> display_connector;
+ LockRefPtr<VirtIODisplayConnector> 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<u32> m_resource_id_counter { 1 };
Atomic<u32> m_context_id_counter { 1 };
- RefPtr<VirtIOGPU3DDevice> m_3d_device;
+ LockRefPtr<VirtIOGPU3DDevice> 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 <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Arch/IRQController.h>
#include <Kernel/Interrupts/GenericInterruptHandler.h>
+#include <Kernel/Library/LockRefPtr.h>
namespace Kernel {
@@ -40,7 +40,7 @@ protected:
private:
bool m_shared_with_others { false };
bool m_enabled { false };
- RefPtr<IRQController> m_responsible_irq_controller;
+ LockRefPtr<IRQController> 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 <AK/NonnullOwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Arch/IRQController.h>
#include <Kernel/Interrupts/GenericInterruptHandler.h>
+#include <Kernel/Library/LockRefPtr.h>
namespace Kernel {
class IRQHandler;
@@ -41,6 +41,6 @@ private:
explicit SharedIRQHandler(u8 interrupt_number);
bool m_enabled { true };
GenericInterruptHandler::List m_handlers;
- RefPtr<IRQController> m_responsible_irq_controller;
+ LockRefPtr<IRQController> 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<IRQController> m_responsible_irq_controller;
+ LockRefPtr<IRQController> m_responsible_irq_controller;
OwnPtr<GenericInterruptHandler> m_real_handler;
};
}
diff --git a/Kernel/Library/ThreadSafeRefPtr.h b/Kernel/Library/LockRefPtr.h
index b1e341d7e9..90f5889a8d 100644
--- a/Kernel/Library/ThreadSafeRefPtr.h
+++ b/Kernel/Library/LockRefPtr.h
@@ -10,16 +10,16 @@
#include <AK/Atomic.h>
#include <AK/Error.h>
#include <AK/Format.h>
-#include <AK/NonnullRefPtr.h>
#include <AK/StdLibExtras.h>
#include <AK/Traits.h>
#include <AK/Types.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
#ifdef KERNEL
# include <Kernel/Arch/Processor.h>
# include <Kernel/Arch/ScopedCritical.h>
#endif
-#define THREADSAFEREFPTR_SCRUB_BYTE 0xa0
+#define LOCKREFPTR_SCRUB_BYTE 0xa0
namespace AK {
@@ -27,7 +27,7 @@ template<typename T>
class OwnPtr;
template<typename T>
-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<FlatPtr>& 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<typename T, typename PtrTraits>
-class [[nodiscard]] RefPtr {
+class [[nodiscard]] LockRefPtr {
template<typename U, typename P>
- friend class RefPtr;
+ friend class LockRefPtr;
template<typename U>
- 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<T*>(ptr)))
{
ref_if_not_null(const_cast<T*>(ptr));
}
- RefPtr(const T& object)
+ LockRefPtr(const T& object)
: m_bits(PtrTraits::as_bits(const_cast<T*>(&object)))
{
T* ptr = const_cast<T*>(&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<T> const& other)
+ ALWAYS_INLINE LockRefPtr(NonnullLockRefPtr<T> const& other)
: m_bits(PtrTraits::as_bits(const_cast<T*>(other.add_ref())))
{
}
template<typename U>
- ALWAYS_INLINE RefPtr(NonnullRefPtr<U> const& other) requires(IsConvertible<U*, T*>)
+ ALWAYS_INLINE LockRefPtr(NonnullLockRefPtr<U> const& other) requires(IsConvertible<U*, T*>)
: m_bits(PtrTraits::as_bits(const_cast<U*>(other.add_ref())))
{
}
template<typename U>
- ALWAYS_INLINE RefPtr(NonnullRefPtr<U>&& other) requires(IsConvertible<U*, T*>)
+ ALWAYS_INLINE LockRefPtr(NonnullLockRefPtr<U>&& other) requires(IsConvertible<U*, T*>)
: m_bits(PtrTraits::as_bits(&other.leak_ref()))
{
VERIFY(!is_null());
}
- template<typename U, typename P = RefPtrTraits<U>>
- RefPtr(RefPtr<U, P>&& other) requires(IsConvertible<U*, T*>)
+ template<typename U, typename P = LockRefPtrTraits<U>>
+ LockRefPtr(LockRefPtr<U, P>&& other) requires(IsConvertible<U*, T*>)
: m_bits(PtrTraits::template convert_from<U, P>(other.leak_ref_raw()))
{
}
- RefPtr(RefPtr const& other)
+ LockRefPtr(LockRefPtr const& other)
: m_bits(other.add_ref_raw())
{
}
- template<typename U, typename P = RefPtrTraits<U>>
- RefPtr(RefPtr<U, P> const& other) requires(IsConvertible<U*, T*>)
+ template<typename U, typename P = LockRefPtrTraits<U>>
+ LockRefPtr(LockRefPtr<U, P> const& other) requires(IsConvertible<U*, T*>)
: 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<typename U>
- RefPtr(OwnPtr<U> const&) = delete;
+ LockRefPtr(OwnPtr<U> const&) = delete;
template<typename U>
- RefPtr& operator=(OwnPtr<U> const&) = delete;
+ LockRefPtr& operator=(OwnPtr<U> 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<typename U, typename P = RefPtrTraits<U>>
- void swap(RefPtr<U, P>& other) requires(IsConvertible<U*, T*>)
+ template<typename U, typename P = LockRefPtrTraits<U>>
+ void swap(LockRefPtr<U, P>& other) requires(IsConvertible<U*, T*>)
{
// 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<U, P>(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<typename U, typename P = RefPtrTraits<U>>
- ALWAYS_INLINE RefPtr& operator=(RefPtr<U, P>&& other) requires(IsConvertible<U*, T*>)
+ template<typename U, typename P = LockRefPtrTraits<U>>
+ ALWAYS_INLINE LockRefPtr& operator=(LockRefPtr<U, P>&& other) requires(IsConvertible<U*, T*>)
{
assign_raw(PtrTraits::template convert_from<U, P>(other.leak_ref_raw()));
return *this;
}
template<typename U>
- ALWAYS_INLINE RefPtr& operator=(NonnullRefPtr<U>&& other) requires(IsConvertible<U*, T*>)
+ ALWAYS_INLINE LockRefPtr& operator=(NonnullLockRefPtr<U>&& other) requires(IsConvertible<U*, T*>)
{
assign_raw(PtrTraits::as_bits(&other.leak_ref()));
return *this;
}
- ALWAYS_INLINE RefPtr& operator=(NonnullRefPtr<T> const& other)
+ ALWAYS_INLINE LockRefPtr& operator=(NonnullLockRefPtr<T> const& other)
{
assign_raw(PtrTraits::as_bits(other.add_ref()));
return *this;
}
template<typename U>
- ALWAYS_INLINE RefPtr& operator=(NonnullRefPtr<U> const& other) requires(IsConvertible<U*, T*>)
+ ALWAYS_INLINE LockRefPtr& operator=(NonnullLockRefPtr<U> const& other) requires(IsConvertible<U*, T*>)
{
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<typename U>
- ALWAYS_INLINE RefPtr& operator=(RefPtr<U> const& other) requires(IsConvertible<U*, T*>)
+ ALWAYS_INLINE LockRefPtr& operator=(LockRefPtr<U> const& other) requires(IsConvertible<U*, T*>)
{
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<T*>(ptr));
assign_raw(PtrTraits::as_bits(const_cast<T*>(ptr)));
return *this;
}
- ALWAYS_INLINE RefPtr& operator=(const T& object)
+ ALWAYS_INLINE LockRefPtr& operator=(const T& object)
{
const_cast<T&>(object).ref();
assign_raw(PtrTraits::as_bits(const_cast<T*>(&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<typename U, typename P = RefPtrTraits<U>>
- ALWAYS_INLINE bool assign_if_null(RefPtr<U, P>&& other)
+ template<typename U, typename P = LockRefPtrTraits<U>>
+ ALWAYS_INLINE bool assign_if_null(LockRefPtr<U, P>&& other)
{
if (this == &other)
return is_null();
@@ -309,11 +309,11 @@ public:
return PtrTraits::as_ptr(bits);
}
- NonnullRefPtr<T> release_nonnull()
+ NonnullLockRefPtr<T> release_nonnull()
{
FlatPtr bits = PtrTraits::exchange(m_bits, PtrTraits::default_null_value);
VERIFY(!PtrTraits::is_null(bits));
- return NonnullRefPtr<T>(NonnullRefPtr<T>::Adopt, *PtrTraits::as_ptr(bits));
+ return NonnullLockRefPtr<T>(NonnullLockRefPtr<T>::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<typename T>
-struct Formatter<RefPtr<T>> : Formatter<const T*> {
- ErrorOr<void> format(FormatBuilder& builder, RefPtr<T> const& value)
+struct Formatter<LockRefPtr<T>> : Formatter<const T*> {
+ ErrorOr<void> format(FormatBuilder& builder, LockRefPtr<T> const& value)
{
return Formatter<const T*>::format(builder, value.ptr());
}
};
template<typename T>
-struct Traits<RefPtr<T>> : public GenericTraits<RefPtr<T>> {
+struct Traits<LockRefPtr<T>> : public GenericTraits<LockRefPtr<T>> {
using PeekType = T*;
using ConstPeekType = const T*;
- static unsigned hash(RefPtr<T> const& p) { return ptr_hash(p.ptr()); }
- static bool equals(RefPtr<T> const& a, RefPtr<T> const& b) { return a.ptr() == b.ptr(); }
+ static unsigned hash(LockRefPtr<T> const& p) { return ptr_hash(p.ptr()); }
+ static bool equals(LockRefPtr<T> const& a, LockRefPtr<T> const& b) { return a.ptr() == b.ptr(); }
};
template<typename T, typename U>
-inline NonnullRefPtr<T> static_ptr_cast(NonnullRefPtr<U> const& ptr)
+inline NonnullLockRefPtr<T> static_ptr_cast(NonnullLockRefPtr<U> const& ptr)
{
- return NonnullRefPtr<T>(static_cast<const T&>(*ptr));
+ return NonnullLockRefPtr<T>(static_cast<const T&>(*ptr));
}
-template<typename T, typename U, typename PtrTraits = RefPtrTraits<T>>
-inline RefPtr<T> static_ptr_cast(RefPtr<U> const& ptr)
+template<typename T, typename U, typename PtrTraits = LockRefPtrTraits<T>>
+inline LockRefPtr<T> static_ptr_cast(LockRefPtr<U> const& ptr)
{
- return RefPtr<T, PtrTraits>(static_cast<const T*>(ptr.ptr()));
+ return LockRefPtr<T, PtrTraits>(static_cast<const T*>(ptr.ptr()));
}
template<typename T, typename PtrTraitsT, typename U, typename PtrTraitsU>
-inline void swap(RefPtr<T, PtrTraitsT>& a, RefPtr<U, PtrTraitsU>& b) requires(IsConvertible<U*, T*>)
+inline void swap(LockRefPtr<T, PtrTraitsT>& a, LockRefPtr<U, PtrTraitsU>& b) requires(IsConvertible<U*, T*>)
{
a.swap(b);
}
template<typename T>
-inline RefPtr<T> adopt_ref_if_nonnull(T* object)
+inline LockRefPtr<T> adopt_lock_ref_if_nonnull(T* object)
{
if (object)
- return RefPtr<T>(RefPtr<T>::Adopt, *object);
+ return LockRefPtr<T>(LockRefPtr<T>::Adopt, *object);
return {};
}
template<typename T, class... Args>
-requires(IsConstructible<T, Args...>) inline ErrorOr<NonnullRefPtr<T>> try_make_ref_counted(Args&&... args)
+requires(IsConstructible<T, Args...>) inline ErrorOr<NonnullLockRefPtr<T>> try_make_lock_ref_counted(Args&&... args)
{
- return adopt_nonnull_ref_or_enomem(new (nothrow) T(forward<Args>(args)...));
+ return adopt_nonnull_lock_ref_or_enomem(new (nothrow) T(forward<Args>(args)...));
}
// FIXME: Remove once P0960R3 is available in Clang.
template<typename T, class... Args>
-inline ErrorOr<NonnullRefPtr<T>> try_make_ref_counted(Args&&... args)
+inline ErrorOr<NonnullLockRefPtr<T>> try_make_lock_ref_counted(Args&&... args)
{
- return adopt_nonnull_ref_or_enomem(new (nothrow) T { forward<Args>(args)... });
+ return adopt_nonnull_lock_ref_or_enomem(new (nothrow) T { forward<Args>(args)... });
}
template<typename T>
-inline ErrorOr<NonnullRefPtr<T>> adopt_nonnull_ref_or_enomem(T* object)
+inline ErrorOr<NonnullLockRefPtr<T>> 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<NonnullRefPtr<T>> 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
index c50bab3651..3b63864ce2 100644
--- a/Kernel/Library/ThreadSafeWeakPtr.h
+++ b/Kernel/Library/LockWeakPtr.h
@@ -6,66 +6,66 @@
#pragma once
-#include <AK/Weakable.h>
+#include <Kernel/Library/LockWeakable.h>
namespace AK {
template<typename T>
-class [[nodiscard]] WeakPtr {
+class [[nodiscard]] LockWeakPtr {
template<typename U>
- friend class Weakable;
+ friend class LockWeakable;
public:
- WeakPtr() = default;
+ LockWeakPtr() = default;
template<typename U>
- WeakPtr(WeakPtr<U> const& other) requires(IsBaseOf<T, U>)
+ LockWeakPtr(WeakPtr<U> const& other) requires(IsBaseOf<T, U>)
: m_link(other.m_link)
{
}
template<typename U>
- WeakPtr(WeakPtr<U>&& other) requires(IsBaseOf<T, U>)
+ LockWeakPtr(WeakPtr<U>&& other) requires(IsBaseOf<T, U>)
: m_link(other.take_link())
{
}
template<typename U>
- WeakPtr& operator=(WeakPtr<U>&& other) requires(IsBaseOf<T, U>)
+ LockWeakPtr& operator=(WeakPtr<U>&& other) requires(IsBaseOf<T, U>)
{
m_link = other.take_link();
return *this;
}
template<typename U>
- WeakPtr& operator=(WeakPtr<U> const& other) requires(IsBaseOf<T, U>)
+ LockWeakPtr& operator=(WeakPtr<U> const& other) requires(IsBaseOf<T, U>)
{
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<typename U>
- WeakPtr(const U& object) requires(IsBaseOf<T, U>)
+ LockWeakPtr(const U& object) requires(IsBaseOf<T, U>)
: m_link(object.template try_make_weak_ptr<U>().release_value_but_fixme_should_propagate_errors().take_link())
{
}
template<typename U>
- WeakPtr(const U* object) requires(IsBaseOf<T, U>)
+ LockWeakPtr(const U* object) requires(IsBaseOf<T, U>)
{
if (object)
m_link = object->template try_make_weak_ptr<U>().release_value_but_fixme_should_propagate_errors().take_link();
}
template<typename U>
- WeakPtr(RefPtr<U> const& object) requires(IsBaseOf<T, U>)
+ LockWeakPtr(LockRefPtr<U> const& object) requires(IsBaseOf<T, U>)
{
object.do_while_locked([&](U* obj) {
if (obj)
@@ -74,7 +74,7 @@ public:
}
template<typename U>
- WeakPtr(NonnullRefPtr<U> const& object) requires(IsBaseOf<T, U>)
+ LockWeakPtr(NonnullLockRefPtr<U> const& object) requires(IsBaseOf<T, U>)
{
object.do_while_locked([&](U* obj) {
if (obj)
@@ -83,14 +83,14 @@ public:
}
template<typename U>
- WeakPtr& operator=(const U& object) requires(IsBaseOf<T, U>)
+ LockWeakPtr& operator=(const U& object) requires(IsBaseOf<T, U>)
{
m_link = object.template try_make_weak_ptr<U>().release_value_but_fixme_should_propagate_errors().take_link();
return *this;
}
template<typename U>
- WeakPtr& operator=(const U* object) requires(IsBaseOf<T, U>)
+ LockWeakPtr& operator=(const U* object) requires(IsBaseOf<T, U>)
{
if (object)
m_link = object->template try_make_weak_ptr<U>().release_value_but_fixme_should_propagate_errors().take_link();
@@ -100,7 +100,7 @@ public:
}
template<typename U>
- WeakPtr& operator=(RefPtr<U> const& object) requires(IsBaseOf<T, U>)
+ LockWeakPtr& operator=(LockRefPtr<U> const& object) requires(IsBaseOf<T, U>)
{
object.do_while_locked([&](U* obj) {
if (obj)
@@ -112,7 +112,7 @@ public:
}
template<typename U>
- WeakPtr& operator=(NonnullRefPtr<U> const& object) requires(IsBaseOf<T, U>)
+ LockWeakPtr& operator=(NonnullLockRefPtr<U> const& object) requires(IsBaseOf<T, U>)
{
object.do_while_locked([&](U* obj) {
if (obj)
@@ -123,13 +123,13 @@ public:
return *this;
}
- [[nodiscard]] RefPtr<T> strong_ref() const
+ [[nodiscard]] LockRefPtr<T> 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<T> ref;
+ LockRefPtr<T> 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<WeakLink> take_link() { return move(m_link); }
+ [[nodiscard]] LockRefPtr<WeakLink> take_link() { return move(m_link); }
private:
- WeakPtr(RefPtr<WeakLink> const& link)
+ LockWeakPtr(LockRefPtr<WeakLink> const& link)
: m_link(link)
{
}
- RefPtr<WeakLink> m_link;
+ LockRefPtr<WeakLink> m_link;
};
template<typename T>
template<typename U>
-inline ErrorOr<WeakPtr<U>> Weakable<T>::try_make_weak_ptr() const
+inline ErrorOr<LockWeakPtr<U>> LockWeakable<T>::try_make_weak_ptr() const
{
if constexpr (IsBaseOf<AtomicRefCountedBase, T>) {
// Checking m_being_destroyed isn't sufficient when dealing with
@@ -176,21 +176,21 @@ inline ErrorOr<WeakPtr<U>> Weakable<T>::try_make_weak_ptr() const
// that we prevent the destructor and revoke_weak_ptrs from being
// triggered until we're done.
if (!static_cast<const T*>(this)->try_ref())
- return WeakPtr<U> {};
+ return LockWeakPtr<U> {};
} 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<U> {};
+ return LockWeakPtr<U> {};
}
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<T&>(static_cast<const T&>(*this))))));
+ m_link.assign_if_null(TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) WeakLink(const_cast<T&>(static_cast<const T&>(*this))))));
}
- WeakPtr<U> weak_ptr(m_link);
+ LockWeakPtr<U> weak_ptr(m_link);
if constexpr (IsBaseOf<AtomicRefCountedBase, T>) {
// Now drop the reference we temporarily added
@@ -198,15 +198,15 @@ inline ErrorOr<WeakPtr<U>> Weakable<T>::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<U> {};
+ return LockWeakPtr<U> {};
}
}
return weak_ptr;
}
template<typename T>
-struct Formatter<WeakPtr<T>> : Formatter<const T*> {
- ErrorOr<void> format(FormatBuilder& builder, WeakPtr<T> const& value)
+struct Formatter<LockWeakPtr<T>> : Formatter<const T*> {
+ ErrorOr<void> format(FormatBuilder& builder, LockWeakPtr<T> const& value)
{
auto ref = value.strong_ref();
return Formatter<const T*>::format(builder, ref.ptr());
@@ -214,14 +214,14 @@ struct Formatter<WeakPtr<T>> : Formatter<const T*> {
};
template<typename T>
-ErrorOr<WeakPtr<T>> try_make_weak_ptr_if_nonnull(T const* ptr)
+ErrorOr<LockWeakPtr<T>> try_make_weak_ptr_if_nonnull(T const* ptr)
{
if (ptr) {
return ptr->template try_make_weak_ptr<T>();
}
- return WeakPtr<T> {};
+ return LockWeakPtr<T> {};
}
}
-using AK::WeakPtr;
+using AK::LockWeakPtr;
diff --git a/Kernel/Library/ThreadSafeWeakable.h b/Kernel/Library/LockWeakable.h
index d97a064a19..ed3e4367d5 100644
--- a/Kernel/Library/ThreadSafeWeakable.h
+++ b/Kernel/Library/LockWeakable.h
@@ -9,30 +9,30 @@
#include <AK/Assertions.h>
#include <AK/Atomic.h>
#include <AK/AtomicRefCounted.h>
-#include <AK/RefPtr.h>
#include <AK/StdLibExtras.h>
#include <Kernel/Arch/Processor.h>
#include <Kernel/Arch/ScopedCritical.h>
+#include <Kernel/Library/LockRefPtr.h>
namespace AK {
template<typename T>
-class Weakable;
+class LockWeakable;
template<typename T>
-class WeakPtr;
+class LockWeakPtr;
class WeakLink final : public AtomicRefCounted<WeakLink> {
template<typename T>
- friend class Weakable;
+ friend class LockWeakable;
template<typename T>
- friend class WeakPtr;
+ friend class LockWeakPtr;
public:
- template<typename T, typename PtrTraits = RefPtrTraits<T>>
- RefPtr<T, PtrTraits> strong_ref() const
+ template<typename T, typename PtrTraits = LockRefPtrTraits<T>>
+ LockRefPtr<T, PtrTraits> strong_ref() const
requires(IsBaseOf<AtomicRefCountedBase, T>)
{
- RefPtr<T, PtrTraits> ref;
+ LockRefPtr<T, PtrTraits> 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<typename T>
-class Weakable {
+class LockWeakable {
private:
class Link;
public:
template<typename U = T>
- ErrorOr<WeakPtr<U>> try_make_weak_ptr() const;
+ ErrorOr<LockWeakPtr<U>> 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<WeakLink> m_link;
+ mutable LockRefPtr<WeakLink> m_link;
Atomic<bool> m_being_destroyed { false };
};
}
-using AK::Weakable;
+using AK::LockWeakable;
diff --git a/Kernel/Library/ThreadSafeNonnullRefPtr.h b/Kernel/Library/NonnullLockRefPtr.h
index de7e08cbc2..44289a3b55 100644
--- a/Kernel/Library/ThreadSafeNonnullRefPtr.h
+++ b/Kernel/Library/NonnullLockRefPtr.h
@@ -9,6 +9,7 @@
#include <AK/Assertions.h>
#include <AK/Atomic.h>
#include <AK/Format.h>
+#include <AK/NonnullRefPtr.h>
#include <AK/Traits.h>
#include <AK/Types.h>
#ifdef KERNEL
@@ -16,104 +17,90 @@
# include <Kernel/Arch/ScopedCritical.h>
#endif
-#define THREADSAFENONNULLREFPTR_SCRUB_BYTE 0xa1
+#define NONNULLLOCKREFPTR_SCRUB_BYTE 0xa1
namespace AK {
template<typename T>
class OwnPtr;
template<typename T, typename PtrTraits>
-class RefPtr;
+class LockRefPtr;
template<typename T>
-ALWAYS_INLINE void ref_if_not_null(T* ptr)
-{
- if (ptr)
- ptr->ref();
-}
-
-template<typename T>
-ALWAYS_INLINE void unref_if_not_null(T* ptr)
-{
- if (ptr)
- ptr->unref();
-}
-
-template<typename T>
-class [[nodiscard]] NonnullRefPtr {
+class [[nodiscard]] NonnullLockRefPtr {
template<typename U, typename P>
- friend class RefPtr;
+ friend class LockRefPtr;
template<typename U>
- friend class NonnullRefPtr;
+ friend class NonnullLockRefPtr;
template<typename U>
- 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<T&>(object).ref();
}
template<typename U>
- ALWAYS_INLINE NonnullRefPtr(const U& object) requires(IsConvertible<U*, T*>)
- : m_bits((FlatPtr) static_cast<const T*>(&object))
+ ALWAYS_INLINE NonnullLockRefPtr(U const& object) requires(IsConvertible<U*, T*>)
+ : m_bits((FlatPtr) static_cast<T const*>(&object))
{
VERIFY(!(m_bits & 1));
- const_cast<T&>(static_cast<const T&>(object)).ref();
+ const_cast<T&>(static_cast<T const&>(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<typename U>
- ALWAYS_INLINE NonnullRefPtr(NonnullRefPtr<U>&& other) requires(IsConvertible<U*, T*>)
+ ALWAYS_INLINE NonnullLockRefPtr(NonnullLockRefPtr<U>&& other) requires(IsConvertible<U*, T*>)
: 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<typename U>
- ALWAYS_INLINE NonnullRefPtr(NonnullRefPtr<U> const& other) requires(IsConvertible<U*, T*>)
+ ALWAYS_INLINE NonnullLockRefPtr(NonnullLockRefPtr<U> const& other) requires(IsConvertible<U*, T*>)
: 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<typename U>
- NonnullRefPtr(OwnPtr<U> const&) = delete;
+ NonnullLockRefPtr(OwnPtr<U> const&) = delete;
template<typename U>
- NonnullRefPtr& operator=(OwnPtr<U> const&) = delete;
+ NonnullLockRefPtr& operator=(OwnPtr<U> const&) = delete;
template<typename U>
- NonnullRefPtr(RefPtr<U> const&) = delete;
+ NonnullLockRefPtr(LockRefPtr<U> const&) = delete;
template<typename U>
- NonnullRefPtr& operator=(RefPtr<U> const&) = delete;
- NonnullRefPtr(RefPtr<T> const&) = delete;
- NonnullRefPtr& operator=(RefPtr<T> const&) = delete;
+ NonnullLockRefPtr& operator=(LockRefPtr<U> const&) = delete;
+ NonnullLockRefPtr(LockRefPtr<T> const&) = delete;
+ NonnullLockRefPtr& operator=(LockRefPtr<T> 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<typename U>
- NonnullRefPtr& operator=(NonnullRefPtr<U> const& other) requires(IsConvertible<U*, T*>)
+ NonnullLockRefPtr& operator=(NonnullLockRefPtr<U> const& other) requires(IsConvertible<U*, T*>)
{
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<typename U>
- NonnullRefPtr& operator=(NonnullRefPtr<U>&& other) requires(IsConvertible<U*, T*>)
+ NonnullLockRefPtr& operator=(NonnullLockRefPtr<U>&& other) requires(IsConvertible<U*, T*>)
{
assign(&other.leak_ref());
return *this;
}
- NonnullRefPtr& operator=(const T& object)
+ NonnullLockRefPtr& operator=(T const& object)
{
const_cast<T&>(object).ref();
assign(const_cast<T*>(&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<typename U>
- void swap(NonnullRefPtr<U>& other) requires(IsConvertible<U*, T*>)
+ void swap(NonnullLockRefPtr<U>& other) requires(IsConvertible<U*, T*>)
{
// 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<typename T>
-inline NonnullRefPtr<T> adopt_ref(T& object)
+inline NonnullLockRefPtr<T> adopt_lock_ref(T& object)
{
- return NonnullRefPtr<T>(NonnullRefPtr<T>::Adopt, object);
+ return NonnullLockRefPtr<T>(NonnullLockRefPtr<T>::Adopt, object);
}
template<typename T>
-struct Formatter<NonnullRefPtr<T>> : Formatter<const T*> {
- ErrorOr<void> format(FormatBuilder& builder, NonnullRefPtr<T> const& value)
+struct Formatter<NonnullLockRefPtr<T>> : Formatter<T const*> {
+ ErrorOr<void> format(FormatBuilder& builder, NonnullLockRefPtr<T> const& value)
{
- return Formatter<const T*>::format(builder, value.ptr());
+ return Formatter<T const*>::format(builder, value.ptr());
}
};
template<typename T, typename U>
-inline void swap(NonnullRefPtr<T>& a, NonnullRefPtr<U>& b) requires(IsConvertible<U*, T*>)
+inline void swap(NonnullLockRefPtr<T>& a, NonnullLockRefPtr<U>& b) requires(IsConvertible<U*, T*>)
{
a.swap(b);
}
@@ -339,12 +326,12 @@ inline void swap(NonnullRefPtr<T>& a, NonnullRefPtr<U>& b) requires(IsConvertibl
}
template<typename T>
-struct Traits<NonnullRefPtr<T>> : public GenericTraits<NonnullRefPtr<T>> {
+struct Traits<NonnullLockRefPtr<T>> : public GenericTraits<NonnullLockRefPtr<T>> {
using PeekType = T*;
- using ConstPeekType = const T*;
- static unsigned hash(NonnullRefPtr<T> const& p) { return ptr_hash(p.ptr()); }
- static bool equals(NonnullRefPtr<T> const& a, NonnullRefPtr<T> const& b) { return a.ptr() == b.ptr(); }
+ using ConstPeekType = T const*;
+ static unsigned hash(NonnullLockRefPtr<T> const& p) { return ptr_hash(p.ptr()); }
+ static bool equals(NonnullLockRefPtr<T> const& a, NonnullLockRefPtr<T> 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 <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/NonnullPtrVector.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
+
+namespace AK {
+
+template<typename T, size_t inline_capacity>
+class NonnullLockRefPtrVector : public NonnullPtrVector<NonnullLockRefPtr<T>, inline_capacity> {
+ using NonnullPtrVector<NonnullLockRefPtr<T>, 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<Thread> m_holder;
+ LockRefPtr<Thread> 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<NonnullOwnPtr<AddressSpace>> AddressSpace::try_create(AddressSpace const
return space;
}
-AddressSpace::AddressSpace(NonnullRefPtr<PageDirectory> page_directory, VirtualRange total_range)
+AddressSpace::AddressSpace(NonnullLockRefPtr<PageDirectory> page_directory, VirtualRange total_range)
: m_page_directory(move(page_directory))
, m_region_tree(total_range)
{
@@ -173,12 +173,12 @@ ErrorOr<Region*> AddressSpace::allocate_region(RandomizeVirtualAddress randomize
return region.leak_ptr();
}
-ErrorOr<Region*> AddressSpace::allocate_region_with_vmobject(VirtualRange requested_range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, StringView name, int prot, bool shared)
+ErrorOr<Region*> AddressSpace::allocate_region_with_vmobject(VirtualRange requested_range, NonnullLockRefPtr<VMObject> 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<Region*> AddressSpace::allocate_region_with_vmobject(RandomizeVirtualAddress randomize_virtual_address, VirtualAddress requested_address, size_t requested_size, size_t requested_alignment, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, StringView name, int prot, bool shared)
+ErrorOr<Region*> AddressSpace::allocate_region_with_vmobject(RandomizeVirtualAddress randomize_virtual_address, VirtualAddress requested_address, size_t requested_size, size_t requested_alignment, NonnullLockRefPtr<VMObject> 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 <AK/RedBlackTree.h>
#include <AK/Vector.h>
-#include <AK/WeakPtr.h>
+#include <Kernel/Library/LockWeakPtr.h>
#include <Kernel/Memory/AllocationStrategy.h>
#include <Kernel/Memory/PageDirectory.h>
#include <Kernel/Memory/Region.h>
@@ -33,8 +33,8 @@ public:
ErrorOr<void> unmap_mmap_range(VirtualAddress, size_t);
- ErrorOr<Region*> allocate_region_with_vmobject(VirtualRange requested_range, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, StringView name, int prot, bool shared);
- ErrorOr<Region*> allocate_region_with_vmobject(RandomizeVirtualAddress, 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<Region*> allocate_region_with_vmobject(VirtualRange requested_range, NonnullLockRefPtr<VMObject>, size_t offset_in_vmobject, StringView name, int prot, bool shared);
+ ErrorOr<Region*> allocate_region_with_vmobject(RandomizeVirtualAddress, VirtualAddress requested_address, size_t requested_size, size_t requested_alignment, NonnullLockRefPtr<VMObject>, size_t offset_in_vmobject, StringView name, int prot, bool shared);
ErrorOr<Region*> 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<Region> take_region(Region& region);
@@ -65,11 +65,11 @@ public:
auto& region_tree() { return m_region_tree; }
private:
- AddressSpace(NonnullRefPtr<PageDirectory>, VirtualRange total_range);
+ AddressSpace(NonnullLockRefPtr<PageDirectory>, VirtualRange total_range);
mutable RecursiveSpinlock m_lock { LockRank::None };
- RefPtr<PageDirectory> m_page_directory;
+ LockRefPtr<PageDirectory> 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<NonnullRefPtr<VMObject>> AnonymousVMObject::try_clone()
+ErrorOr<NonnullLockRefPtr<VMObject>> AnonymousVMObject::try_clone()
{
// We need to acquire our lock so we copy a sane state
SpinlockLocker lock(m_lock);
@@ -50,7 +50,7 @@ ErrorOr<NonnullRefPtr<VMObject>> 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<NonnullRefPtr<VMObject>> AnonymousVMObject::try_clone()
return clone;
}
-ErrorOr<NonnullRefPtr<AnonymousVMObject>> AnonymousVMObject::try_create_with_size(size_t size, AllocationStrategy strategy)
+ErrorOr<NonnullLockRefPtr<AnonymousVMObject>> AnonymousVMObject::try_create_with_size(size_t size, AllocationStrategy strategy)
{
Optional<CommittedPhysicalPageSet> committed_pages;
if (strategy == AllocationStrategy::Reserve || strategy == AllocationStrategy::AllocateNow) {
@@ -84,19 +84,19 @@ ErrorOr<NonnullRefPtr<AnonymousVMObject>> 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<NonnullRefPtr<AnonymousVMObject>> AnonymousVMObject::try_create_physically_contiguous_with_size(size_t size)
+ErrorOr<NonnullLockRefPtr<AnonymousVMObject>> 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<RefPtr<PhysicalPage>>::try_create(contiguous_physical_pages.span()));
+ auto new_physical_pages = TRY(FixedArray<LockRefPtr<PhysicalPage>>::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<NonnullRefPtr<AnonymousVMObject>> AnonymousVMObject::try_create_purgeable_with_size(size_t size, AllocationStrategy strategy)
+ErrorOr<NonnullLockRefPtr<AnonymousVMObject>> AnonymousVMObject::try_create_purgeable_with_size(size_t size, AllocationStrategy strategy)
{
Optional<CommittedPhysicalPageSet> committed_pages;
if (strategy == AllocationStrategy::Reserve || strategy == AllocationStrategy::AllocateNow) {
@@ -105,18 +105,18 @@ ErrorOr<NonnullRefPtr<AnonymousVMObject>> 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<NonnullRefPtr<AnonymousVMObject>> AnonymousVMObject::try_create_with_physical_pages(Span<NonnullRefPtr<PhysicalPage>> physical_pages)
+ErrorOr<NonnullLockRefPtr<AnonymousVMObject>> AnonymousVMObject::try_create_with_physical_pages(Span<NonnullLockRefPtr<PhysicalPage>> physical_pages)
{
- auto new_physical_pages = TRY(FixedArray<RefPtr<PhysicalPage>>::try_create(physical_pages));
- return adopt_nonnull_ref_or_enomem(new (nothrow) AnonymousVMObject(move(new_physical_pages)));
+ auto new_physical_pages = TRY(FixedArray<LockRefPtr<PhysicalPage>>::try_create(physical_pages));
+ return adopt_nonnull_lock_ref_or_enomem(new (nothrow) AnonymousVMObject(move(new_physical_pages)));
}
-ErrorOr<NonnullRefPtr<AnonymousVMObject>> AnonymousVMObject::try_create_for_physical_range(PhysicalAddress paddr, size_t size)
+ErrorOr<NonnullLockRefPtr<AnonymousVMObject>> 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<NonnullRefPtr<AnonymousVMObject>> 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<NonnullRefPtr<AnonymousVMObject>> AnonymousVMObject::try_create_with_shared_cow(AnonymousVMObject const& other, NonnullRefPtr<SharedCommittedCowPages> shared_committed_cow_pages, FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages)
+ErrorOr<NonnullLockRefPtr<AnonymousVMObject>> AnonymousVMObject::try_create_with_shared_cow(AnonymousVMObject const& other, NonnullLockRefPtr<SharedCommittedCowPages> shared_committed_cow_pages, FixedArray<LockRefPtr<PhysicalPage>>&& new_physical_pages)
{
auto weak_parent = TRY(other.try_make_weak_ptr<AnonymousVMObject>());
- 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<RefPtr<PhysicalPage>>&& new_physical_pages, AllocationStrategy strategy, Optional<CommittedPhysicalPageSet> committed_pages)
+AnonymousVMObject::AnonymousVMObject(FixedArray<LockRefPtr<PhysicalPage>>&& new_physical_pages, AllocationStrategy strategy, Optional<CommittedPhysicalPageSet> committed_pages)
: VMObject(move(new_physical_pages))
, m_unused_committed_pages(move(committed_pages))
{
@@ -154,7 +154,7 @@ AnonymousVMObject::AnonymousVMObject(FixedArray<RefPtr<PhysicalPage>>&& new_phys
}
}
-AnonymousVMObject::AnonymousVMObject(PhysicalAddress paddr, FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages)
+AnonymousVMObject::AnonymousVMObject(PhysicalAddress paddr, FixedArray<LockRefPtr<PhysicalPage>>&& new_physical_pages)
: VMObject(move(new_physical_pages))
{
VERIFY(paddr.page_base() == paddr);
@@ -162,12 +162,12 @@ AnonymousVMObject::AnonymousVMObject(PhysicalAddress paddr, FixedArray<RefPtr<Ph
physical_pages()[i] = PhysicalPage::create(paddr.offset(i * PAGE_SIZE), MayReturnToFreeList::No);
}
-AnonymousVMObject::AnonymousVMObject(FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages)
+AnonymousVMObject::AnonymousVMObject(FixedArray<LockRefPtr<PhysicalPage>>&& new_physical_pages)
: VMObject(move(new_physical_pages))
{
}
-AnonymousVMObject::AnonymousVMObject(WeakPtr<AnonymousVMObject> other, NonnullRefPtr<SharedCommittedCowPages> shared_committed_cow_pages, FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages)
+AnonymousVMObject::AnonymousVMObject(LockWeakPtr<AnonymousVMObject> other, NonnullLockRefPtr<SharedCommittedCowPages> shared_committed_cow_pages, FixedArray<LockRefPtr<PhysicalPage>>&& 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<void> AnonymousVMObject::set_volatile(bool is_volatile, bool& was_purged
return {};
}
-NonnullRefPtr<PhysicalPage> AnonymousVMObject::allocate_committed_page(Badge<Region>)
+NonnullLockRefPtr<PhysicalPage> AnonymousVMObject::allocate_committed_page(Badge<Region>)
{
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<PhysicalPage> page;
+ LockRefPtr<PhysicalPage> 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<PhysicalPage> AnonymousVMObject::SharedCommittedCowPages::take_one()
+NonnullLockRefPtr<PhysicalPage> 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<NonnullRefPtr<AnonymousVMObject>> try_create_with_size(size_t, AllocationStrategy);
- static ErrorOr<NonnullRefPtr<AnonymousVMObject>> try_create_for_physical_range(PhysicalAddress paddr, size_t size);
- static ErrorOr<NonnullRefPtr<AnonymousVMObject>> try_create_with_physical_pages(Span<NonnullRefPtr<PhysicalPage>>);
- static ErrorOr<NonnullRefPtr<AnonymousVMObject>> try_create_purgeable_with_size(size_t, AllocationStrategy);
- static ErrorOr<NonnullRefPtr<AnonymousVMObject>> try_create_physically_contiguous_with_size(size_t);
- virtual ErrorOr<NonnullRefPtr<VMObject>> try_clone() override;
-
- [[nodiscard]] NonnullRefPtr<PhysicalPage> allocate_committed_page(Badge<Region>);
+ static ErrorOr<NonnullLockRefPtr<AnonymousVMObject>> try_create_with_size(size_t, AllocationStrategy);
+ static ErrorOr<NonnullLockRefPtr<AnonymousVMObject>> try_create_for_physical_range(PhysicalAddress paddr, size_t size);
+ static ErrorOr<NonnullLockRefPtr<AnonymousVMObject>> try_create_with_physical_pages(Span<NonnullLockRefPtr<PhysicalPage>>);
+ static ErrorOr<NonnullLockRefPtr<AnonymousVMObject>> try_create_purgeable_with_size(size_t, AllocationStrategy);
+ static ErrorOr<NonnullLockRefPtr<AnonymousVMObject>> try_create_physically_contiguous_with_size(size_t);
+ virtual ErrorOr<NonnullLockRefPtr<VMObject>> try_clone() override;
+
+ [[nodiscard]] NonnullLockRefPtr<PhysicalPage> allocate_committed_page(Badge<Region>);
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<NonnullRefPtr<AnonymousVMObject>> try_create_with_shared_cow(AnonymousVMObject const&, NonnullRefPtr<SharedCommittedCowPages>, FixedArray<RefPtr<PhysicalPage>>&&);
+ static ErrorOr<NonnullLockRefPtr<AnonymousVMObject>> try_create_with_shared_cow(AnonymousVMObject const&, NonnullLockRefPtr<SharedCommittedCowPages>, FixedArray<LockRefPtr<PhysicalPage>>&&);
- explicit AnonymousVMObject(FixedArray<RefPtr<PhysicalPage>>&&, AllocationStrategy, Optional<CommittedPhysicalPageSet>);
- explicit AnonymousVMObject(PhysicalAddress, FixedArray<RefPtr<PhysicalPage>>&&);
- explicit AnonymousVMObject(FixedArray<RefPtr<PhysicalPage>>&&);
- explicit AnonymousVMObject(WeakPtr<AnonymousVMObject>, NonnullRefPtr<SharedCommittedCowPages>, FixedArray<RefPtr<PhysicalPage>>&&);
+ explicit AnonymousVMObject(FixedArray<LockRefPtr<PhysicalPage>>&&, AllocationStrategy, Optional<CommittedPhysicalPageSet>);
+ explicit AnonymousVMObject(PhysicalAddress, FixedArray<LockRefPtr<PhysicalPage>>&&);
+ explicit AnonymousVMObject(FixedArray<LockRefPtr<PhysicalPage>>&&);
+ explicit AnonymousVMObject(LockWeakPtr<AnonymousVMObject>, NonnullLockRefPtr<SharedCommittedCowPages>, FixedArray<LockRefPtr<PhysicalPage>>&&);
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<PhysicalPage> take_one();
+ [[nodiscard]] NonnullLockRefPtr<PhysicalPage> take_one();
void uncommit_one();
private:
@@ -82,8 +82,8 @@ private:
CommittedPhysicalPageSet m_committed_pages;
};
- WeakPtr<AnonymousVMObject> m_cow_parent;
- RefPtr<SharedCommittedCowPages> m_shared_committed_cow_pages;
+ LockWeakPtr<AnonymousVMObject> m_cow_parent;
+ LockRefPtr<SharedCommittedCowPages> 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<RefPtr<PhysicalPage>>&& new_physical_pages, Bitmap dirty_pages)
+InodeVMObject::InodeVMObject(Inode& inode, FixedArray<LockRefPtr<PhysicalPage>>&& 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<RefPtr<PhysicalPage>>&& new_physical_pages, Bitmap dirty_pages)
+InodeVMObject::InodeVMObject(InodeVMObject const& other, FixedArray<LockRefPtr<PhysicalPage>>&& 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<RefPtr<PhysicalPage>>&&, Bitmap dirty_pages);
- explicit InodeVMObject(InodeVMObject const&, FixedArray<RefPtr<PhysicalPage>>&&, Bitmap dirty_pages);
+ explicit InodeVMObject(Inode&, FixedArray<LockRefPtr<PhysicalPage>>&&, Bitmap dirty_pages);
+ explicit InodeVMObject(InodeVMObject const&, FixedArray<LockRefPtr<PhysicalPage>>&&, 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<Inode> m_inode;
+ NonnullLockRefPtr<Inode> 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<NonnullOwnPtr<Region>> MemoryManager::allocate_contiguous_kernel_region(
return region;
}
-ErrorOr<NonnullOwnPtr<Memory::Region>> MemoryManager::allocate_dma_buffer_page(StringView name, Memory::Region::Access access, RefPtr<Memory::PhysicalPage>& dma_buffer_page)
+ErrorOr<NonnullOwnPtr<Memory::Region>> MemoryManager::allocate_dma_buffer_page(StringView name, Memory::Region::Access access, LockRefPtr<Memory::PhysicalPage>& 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<NonnullOwnPtr<Memory::Region>> MemoryManager::allocate_dma_buffer_page(S
ErrorOr<NonnullOwnPtr<Memory::Region>> MemoryManager::allocate_dma_buffer_page(StringView name, Memory::Region::Access access)
{
- RefPtr<Memory::PhysicalPage> dma_buffer_page;
+ LockRefPtr<Memory::PhysicalPage> dma_buffer_page;
return allocate_dma_buffer_page(name, access, dma_buffer_page);
}
-ErrorOr<NonnullOwnPtr<Memory::Region>> MemoryManager::allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access, NonnullRefPtrVector<Memory::PhysicalPage>& dma_buffer_pages)
+ErrorOr<NonnullOwnPtr<Memory::Region>> MemoryManager::allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access, NonnullLockRefPtrVector<Memory::PhysicalPage>& dma_buffer_pages)
{
VERIFY(!(size % PAGE_SIZE));
dma_buffer_pages = TRY(allocate_contiguous_physical_pages(size));
@@ -782,7 +782,7 @@ ErrorOr<NonnullOwnPtr<Memory::Region>> MemoryManager::allocate_dma_buffer_pages(
ErrorOr<NonnullOwnPtr<Memory::Region>> MemoryManager::allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access)
{
VERIFY(!(size % PAGE_SIZE));
- NonnullRefPtrVector<Memory::PhysicalPage> dma_buffer_pages;
+ NonnullLockRefPtrVector<Memory::PhysicalPage> 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<PhysicalPage> MemoryManager::find_free_physical_page(bool committed)
+LockRefPtr<PhysicalPage> MemoryManager::find_free_physical_page(bool committed)
{
VERIFY(s_mm_lock.is_locked());
- RefPtr<PhysicalPage> page;
+ LockRefPtr<PhysicalPage> 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<PhysicalPage> MemoryManager::find_free_physical_page(bool committed)
return page;
}
-NonnullRefPtr<PhysicalPage> MemoryManager::allocate_committed_physical_page(Badge<CommittedPhysicalPageSet>, ShouldZeroFill should_zero_fill)
+NonnullLockRefPtr<PhysicalPage> MemoryManager::allocate_committed_physical_page(Badge<CommittedPhysicalPageSet>, ShouldZeroFill should_zero_fill)
{
SpinlockLocker lock(s_mm_lock);
auto page = find_free_physical_page(true);
@@ -921,7 +921,7 @@ NonnullRefPtr<PhysicalPage> MemoryManager::allocate_committed_physical_page(Badg
return page.release_nonnull();
}
-ErrorOr<NonnullRefPtr<PhysicalPage>> MemoryManager::allocate_physical_page(ShouldZeroFill should_zero_fill, bool* did_purge)
+ErrorOr<NonnullLockRefPtr<PhysicalPage>> 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<NonnullRefPtr<PhysicalPage>> MemoryManager::allocate_physical_page(Shoul
return page.release_nonnull();
}
-ErrorOr<NonnullRefPtrVector<PhysicalPage>> MemoryManager::allocate_contiguous_physical_pages(size_t size)
+ErrorOr<NonnullLockRefPtrVector<PhysicalPage>> 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<PhysicalPage> CommittedPhysicalPageSet::take_one()
+NonnullLockRefPtr<PhysicalPage> 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 <AK/HashTable.h>
#include <AK/IntrusiveRedBlackTree.h>
#include <AK/NonnullOwnPtrVector.h>
-#include <AK/NonnullRefPtrVector.h>
#include <Kernel/Forward.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Memory/AllocationStrategy.h>
#include <Kernel/Memory/PhysicalPage.h>
@@ -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<PhysicalPage> take_one();
+ [[nodiscard]] NonnullLockRefPtr<PhysicalPage> take_one();
void uncommit_one();
void operator=(CommittedPhysicalPageSet&&) = delete;
@@ -173,15 +173,15 @@ public:
ErrorOr<CommittedPhysicalPageSet> commit_physical_pages(size_t page_count);
void uncommit_physical_pages(Badge<CommittedPhysicalPageSet>, size_t page_count);
- NonnullRefPtr<PhysicalPage> allocate_committed_physical_page(Badge<CommittedPhysicalPageSet>, ShouldZeroFill = ShouldZeroFill::Yes);
- ErrorOr<NonnullRefPtr<PhysicalPage>> allocate_physical_page(ShouldZeroFill = ShouldZeroFill::Yes, bool* did_purge = nullptr);
- ErrorOr<NonnullRefPtrVector<PhysicalPage>> allocate_contiguous_physical_pages(size_t size);
+ NonnullLockRefPtr<PhysicalPage> allocate_committed_physical_page(Badge<CommittedPhysicalPageSet>, ShouldZeroFill = ShouldZeroFill::Yes);
+ ErrorOr<NonnullLockRefPtr<PhysicalPage>> allocate_physical_page(ShouldZeroFill = ShouldZeroFill::Yes, bool* did_purge = nullptr);
+ ErrorOr<NonnullLockRefPtrVector<PhysicalPage>> allocate_contiguous_physical_pages(size_t size);
void deallocate_physical_page(PhysicalAddress);
ErrorOr<NonnullOwnPtr<Region>> allocate_contiguous_kernel_region(size_t, StringView name, Region::Access access, Region::Cacheable = Region::Cacheable::Yes);
- ErrorOr<NonnullOwnPtr<Memory::Region>> allocate_dma_buffer_page(StringView name, Memory::Region::Access access, RefPtr<Memory::PhysicalPage>& dma_buffer_page);
+ ErrorOr<NonnullOwnPtr<Memory::Region>> allocate_dma_buffer_page(StringView name, Memory::Region::Access access, LockRefPtr<Memory::PhysicalPage>& dma_buffer_page);
ErrorOr<NonnullOwnPtr<Memory::Region>> allocate_dma_buffer_page(StringView name, Memory::Region::Access access);
- ErrorOr<NonnullOwnPtr<Memory::Region>> allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access, NonnullRefPtrVector<Memory::PhysicalPage>& dma_buffer_pages);
+ ErrorOr<NonnullOwnPtr<Memory::Region>> allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access, NonnullLockRefPtrVector<Memory::PhysicalPage>& dma_buffer_pages);
ErrorOr<NonnullOwnPtr<Memory::Region>> allocate_dma_buffer_pages(size_t size, StringView name, Memory::Region::Access access);
ErrorOr<NonnullOwnPtr<Region>> allocate_kernel_region(size_t, StringView name, Region::Access access, AllocationStrategy strategy = AllocationStrategy::Reserve, Region::Cacheable = Region::Cacheable::Yes);
ErrorOr<NonnullOwnPtr<Region>> 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<PhysicalPage> find_free_physical_page(bool);
+ LockRefPtr<PhysicalPage> 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<PageDirectory> m_kernel_page_directory;
+ LockRefPtr<PageDirectory> m_kernel_page_directory;
- RefPtr<PhysicalPage> m_shared_zero_page;
- RefPtr<PhysicalPage> m_lazy_committed_page;
+ LockRefPtr<PhysicalPage> m_shared_zero_page;
+ LockRefPtr<PhysicalPage> 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> PageDirectory::must_create_kernel_page_directory()
+UNMAP_AFTER_INIT NonnullLockRefPtr<PageDirectory> 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<NonnullRefPtr<PageDirectory>> PageDirectory::try_create_for_userspace()
+ErrorOr<NonnullLockRefPtr<PageDirectory>> 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 <AK/Badge.h>
#include <AK/HashMap.h>
#include <AK/IntrusiveRedBlackTree.h>
-#include <AK/RefPtr.h>
#include <Kernel/Forward.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Memory/PhysicalPage.h>
@@ -21,9 +21,9 @@ class PageDirectory final : public AtomicRefCounted<PageDirectory> {
friend class MemoryManager;
public:
- static ErrorOr<NonnullRefPtr<PageDirectory>> try_create_for_userspace();
- static NonnullRefPtr<PageDirectory> must_create_kernel_page_directory();
- static RefPtr<PageDirectory> find_current();
+ static ErrorOr<NonnullLockRefPtr<PageDirectory>> try_create_for_userspace();
+ static NonnullLockRefPtr<PageDirectory> must_create_kernel_page_directory();
+ static LockRefPtr<PageDirectory> find_current();
~PageDirectory();
@@ -64,13 +64,13 @@ private:
AddressSpace* m_space { nullptr };
#if ARCH(X86_64)
- RefPtr<PhysicalPage> m_pml4t;
+ LockRefPtr<PhysicalPage> m_pml4t;
#endif
- RefPtr<PhysicalPage> m_directory_table;
+ LockRefPtr<PhysicalPage> m_directory_table;
#if ARCH(X86_64)
- RefPtr<PhysicalPage> m_directory_pages[512];
+ LockRefPtr<PhysicalPage> m_directory_pages[512];
#else
- RefPtr<PhysicalPage> m_directory_pages[4];
+ LockRefPtr<PhysicalPage> 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> PhysicalPage::create(PhysicalAddress paddr, MayReturnToFreeList may_return_to_freelist)
+NonnullLockRefPtr<PhysicalPage> 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 <AK/NonnullRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
#include <Kernel/PhysicalAddress.h>
namespace Kernel::Memory {
@@ -36,7 +36,7 @@ public:
free_this();
}
- static NonnullRefPtr<PhysicalPage> create(PhysicalAddress, MayReturnToFreeList may_return_to_freelist = MayReturnToFreeList::Yes);
+ static NonnullLockRefPtr<PhysicalPage> 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 <AK/BuiltinWrappers.h>
-#include <AK/NonnullRefPtr.h>
-#include <AK/RefPtr.h>
#include <Kernel/Assertions.h>
+#include <Kernel/Library/LockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
#include <Kernel/Memory/MemoryManager.h>
#include <Kernel/Memory/PhysicalRegion.h>
#include <Kernel/Memory/PhysicalZone.h>
@@ -76,7 +76,7 @@ OwnPtr<PhysicalRegion> PhysicalRegion::try_take_pages_from_beginning(unsigned pa
return try_create(taken_lower, taken_upper);
}
-NonnullRefPtrVector<PhysicalPage> PhysicalRegion::take_contiguous_free_pages(size_t count)
+NonnullLockRefPtrVector<PhysicalPage> 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<PhysicalPage> PhysicalRegion::take_contiguous_free_pages(siz
if (!page_base.has_value())
return {};
- NonnullRefPtrVector<PhysicalPage> physical_pages;
+ NonnullLockRefPtrVector<PhysicalPage> physical_pages;
physical_pages.ensure_capacity(count);
for (size_t i = 0; i < count; ++i)
@@ -104,7 +104,7 @@ NonnullRefPtrVector<PhysicalPage> PhysicalRegion::take_contiguous_free_pages(siz
return physical_pages;
}
-RefPtr<PhysicalPage> PhysicalRegion::take_free_page()
+LockRefPtr<PhysicalPage> 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<PhysicalRegion> try_take_pages_from_beginning(unsigned);
- RefPtr<PhysicalPage> take_free_page();
- NonnullRefPtrVector<PhysicalPage> take_contiguous_free_pages(size_t count);
+ LockRefPtr<PhysicalPage> take_free_page();
+ NonnullLockRefPtrVector<PhysicalPage> 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<NonnullRefPtr<PrivateInodeVMObject>> PrivateInodeVMObject::try_create_with_inode(Inode& inode)
+ErrorOr<NonnullLockRefPtr<PrivateInodeVMObject>> 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<NonnullRefPtr<VMObject>> PrivateInodeVMObject::try_clone()
+ErrorOr<NonnullLockRefPtr<VMObject>> 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<VMObject>(new (nothrow) PrivateInodeVMObject(*this, move(new_physical_pages), move(dirty_pages)));
+ return adopt_nonnull_lock_ref_or_enomem<VMObject>(new (nothrow) PrivateInodeVMObject(*this, move(new_physical_pages), move(dirty_pages)));
}
-PrivateInodeVMObject::PrivateInodeVMObject(Inode& inode, FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages, Bitmap dirty_pages)
+PrivateInodeVMObject::PrivateInodeVMObject(Inode& inode, FixedArray<LockRefPtr<PhysicalPage>>&& new_physical_pages, Bitmap dirty_pages)
: InodeVMObject(inode, move(new_physical_pages), move(dirty_pages))
{
}
-PrivateInodeVMObject::PrivateInodeVMObject(PrivateInodeVMObject const& other, FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages, Bitmap dirty_pages)
+PrivateInodeVMObject::PrivateInodeVMObject(PrivateInodeVMObject const& other, FixedArray<LockRefPtr<PhysicalPage>>&& 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<NonnullRefPtr<PrivateInodeVMObject>> try_create_with_inode(Inode&);
- virtual ErrorOr<NonnullRefPtr<VMObject>> try_clone() override;
+ static ErrorOr<NonnullLockRefPtr<PrivateInodeVMObject>> try_create_with_inode(Inode&);
+ virtual ErrorOr<NonnullLockRefPtr<VMObject>> try_clone() override;
private:
virtual bool is_private_inode() const override { return true; }
- explicit PrivateInodeVMObject(Inode&, FixedArray<RefPtr<PhysicalPage>>&&, Bitmap dirty_pages);
- explicit PrivateInodeVMObject(PrivateInodeVMObject const&, FixedArray<RefPtr<PhysicalPage>>&&, Bitmap dirty_pages);
+ explicit PrivateInodeVMObject(Inode&, FixedArray<LockRefPtr<PhysicalPage>>&&, Bitmap dirty_pages);
+ explicit PrivateInodeVMObject(PrivateInodeVMObject const&, FixedArray<LockRefPtr<PhysicalPage>>&&, 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> vmobject, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable cacheable, bool shared)
+Region::Region(NonnullLockRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> 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> vmobject, size_t offset_in_vmobject, OwnP
m_vmobject->add_region(*this);
}
-Region::Region(VirtualRange const& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable cacheable, bool shared)
+Region::Region(VirtualRange const& range, NonnullLockRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> 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<NonnullOwnPtr<Region>> Region::create_unbacked()
return adopt_nonnull_own_or_enomem(new (nothrow) Region);
}
-ErrorOr<NonnullOwnPtr<Region>> Region::create_unplaced(NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable cacheable, bool shared)
+ErrorOr<NonnullOwnPtr<Region>> Region::create_unplaced(NonnullLockRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> 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<NonnullOwnPtr<Region>> Region::try_clone()
return clone_region;
}
-void Region::set_vmobject(NonnullRefPtr<VMObject>&& obj)
+void Region::set_vmobject(NonnullLockRefPtr<VMObject>&& obj)
{
if (m_vmobject.ptr() == obj.ptr())
return;
@@ -182,7 +182,7 @@ size_t Region::amount_shared() const
return bytes;
}
-ErrorOr<NonnullOwnPtr<Region>> Region::try_create_user_accessible(VirtualRange const& range, NonnullRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable cacheable, bool shared)
+ErrorOr<NonnullOwnPtr<Region>> Region::try_create_user_accessible(VirtualRange const& range, NonnullLockRefPtr<VMObject> vmobject, size_t offset_in_vmobject, OwnPtr<KString> 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<void> Region::set_should_cow(size_t page_index, bool cow)
return {};
}
-bool Region::map_individual_page_impl(size_t page_index, RefPtr<PhysicalPage> page)
+bool Region::map_individual_page_impl(size_t page_index, LockRefPtr<PhysicalPage> 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<PhysicalPage> pa
bool Region::map_individual_page_impl(size_t page_index)
{
- RefPtr<PhysicalPage> page;
+ LockRefPtr<PhysicalPage> 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<PhysicalPage> physical_page)
+bool Region::remap_vmobject_page(size_t page_index, NonnullLockRefPtr<PhysicalPage> 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<PhysicalPage> new_physical_page;
+ LockRefPtr<PhysicalPage> 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<PhysicalPage> Region::physical_page(size_t index) const
+LockRefPtr<PhysicalPage> 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<PhysicalPage>& Region::physical_page_slot(size_t index)
+LockRefPtr<PhysicalPage>& 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 <AK/EnumBits.h>
#include <AK/IntrusiveList.h>
#include <AK/IntrusiveRedBlackTree.h>
-#include <AK/Weakable.h>
#include <Kernel/Forward.h>
#include <Kernel/KString.h>
+#include <Kernel/Library/LockWeakable.h>
#include <Kernel/Memory/PageFaultResponse.h>
#include <Kernel/Memory/VirtualRange.h>
#include <Kernel/Sections.h>
@@ -30,7 +30,7 @@ enum class ShouldFlushTLB {
};
class Region final
- : public Weakable<Region> {
+ : public LockWeakable<Region> {
friend class AddressSpace;
friend class MemoryManager;
friend class RegionTree;
@@ -54,9 +54,9 @@ public:
Yes,
};
- static ErrorOr<NonnullOwnPtr<Region>> try_create_user_accessible(VirtualRange const&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable, bool shared);
+ static ErrorOr<NonnullOwnPtr<Region>> try_create_user_accessible(VirtualRange const&, NonnullLockRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable, bool shared);
static ErrorOr<NonnullOwnPtr<Region>> create_unbacked();
- static ErrorOr<NonnullOwnPtr<Region>> create_unplaced(NonnullRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString> name, Region::Access access, Cacheable = Cacheable::Yes, bool shared = false);
+ static ErrorOr<NonnullOwnPtr<Region>> create_unplaced(NonnullLockRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString> 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<VMObject>&&);
+ void set_vmobject(NonnullLockRefPtr<VMObject>&&);
[[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<PhysicalPage> physical_page(size_t index) const;
- RefPtr<PhysicalPage>& physical_page_slot(size_t index);
+ LockRefPtr<PhysicalPage> physical_page(size_t index) const;
+ LockRefPtr<PhysicalPage>& physical_page_slot(size_t index);
[[nodiscard]] size_t offset_in_vmobject() const
{
@@ -196,10 +196,10 @@ public:
private:
Region();
- Region(NonnullRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString>, Region::Access access, Cacheable, bool shared);
- Region(VirtualRange const&, NonnullRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString>, Region::Access access, Cacheable, bool shared);
+ Region(NonnullLockRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString>, Region::Access access, Cacheable, bool shared);
+ Region(VirtualRange const&, NonnullLockRefPtr<VMObject>, size_t offset_in_vmobject, OwnPtr<KString>, Region::Access access, Cacheable, bool shared);
- [[nodiscard]] bool remap_vmobject_page(size_t page_index, NonnullRefPtr<PhysicalPage>);
+ [[nodiscard]] bool remap_vmobject_page(size_t page_index, NonnullLockRefPtr<PhysicalPage>);
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<PhysicalPage>);
+ [[nodiscard]] bool map_individual_page_impl(size_t page_index, LockRefPtr<PhysicalPage>);
- RefPtr<PageDirectory> m_page_directory;
+ LockRefPtr<PageDirectory> m_page_directory;
VirtualRange m_range;
size_t m_offset_in_vmobject { 0 };
- RefPtr<VMObject> m_vmobject;
+ LockRefPtr<VMObject> m_vmobject;
OwnPtr<KString> 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> ScatterGatherList::try_create(AsyncBlockDeviceRequest& request, Span<NonnullRefPtr<PhysicalPage>> allocated_pages, size_t device_block_size)
+LockRefPtr<ScatterGatherList> ScatterGatherList::try_create(AsyncBlockDeviceRequest& request, Span<NonnullLockRefPtr<PhysicalPage>> 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<AnonymousVMObject> vm_object, AsyncBlockDeviceRequest& request, size_t device_block_size)
+ScatterGatherList::ScatterGatherList(NonnullLockRefPtr<AnonymousVMObject> 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<ScatterGatherList> {
public:
- static RefPtr<ScatterGatherList> try_create(AsyncBlockDeviceRequest&, Span<NonnullRefPtr<PhysicalPage>> allocated_pages, size_t device_block_size);
+ static LockRefPtr<ScatterGatherList> try_create(AsyncBlockDeviceRequest&, Span<NonnullLockRefPtr<PhysicalPage>> 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<AnonymousVMObject>, AsyncBlockDeviceRequest&, size_t device_block_size);
- NonnullRefPtr<AnonymousVMObject> m_vm_object;
+ ScatterGatherList(NonnullLockRefPtr<AnonymousVMObject>, AsyncBlockDeviceRequest&, size_t device_block_size);
+ NonnullLockRefPtr<AnonymousVMObject> m_vm_object;
OwnPtr<Region> 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<NonnullRefPtr<SharedFramebufferVMObject>> SharedFramebufferVMObject::try_create_for_physical_range(PhysicalAddress paddr, size_t size)
+ErrorOr<NonnullLockRefPtr<SharedFramebufferVMObject>> 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<size_t>(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<NonnullRefPtr<SharedFramebufferVMObject>> SharedFramebufferVMObject::try_create_at_arbitrary_physical_range(size_t size)
+ErrorOr<NonnullLockRefPtr<SharedFramebufferVMObject>> 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<size_t>(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<NonnullRefPtr<SharedFramebufferVMObject::FakeWritesFramebufferVMObject>> SharedFramebufferVMObject::FakeWritesFramebufferVMObject::try_create(Badge<SharedFramebufferVMObject>, SharedFramebufferVMObject const& parent_object)
+ErrorOr<NonnullLockRefPtr<SharedFramebufferVMObject::FakeWritesFramebufferVMObject>> SharedFramebufferVMObject::FakeWritesFramebufferVMObject::try_create(Badge<SharedFramebufferVMObject>, 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<NonnullRefPtr<SharedFramebufferVMObject::RealWritesFramebufferVMObject>> SharedFramebufferVMObject::RealWritesFramebufferVMObject::try_create(Badge<SharedFramebufferVMObject>, SharedFramebufferVMObject const& parent_object)
+ErrorOr<NonnullLockRefPtr<SharedFramebufferVMObject::RealWritesFramebufferVMObject>> SharedFramebufferVMObject::RealWritesFramebufferVMObject::try_create(Badge<SharedFramebufferVMObject>, 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<void> SharedFramebufferVMObject::create_fake_writes_framebuffer_vm_object()
@@ -56,21 +56,21 @@ ErrorOr<void> SharedFramebufferVMObject::create_real_writes_framebuffer_vm_objec
return {};
}
-Span<RefPtr<PhysicalPage>> SharedFramebufferVMObject::real_framebuffer_physical_pages()
+Span<LockRefPtr<PhysicalPage>> SharedFramebufferVMObject::real_framebuffer_physical_pages()
{
return m_real_framebuffer_vmobject->physical_pages();
}
-Span<RefPtr<PhysicalPage> const> SharedFramebufferVMObject::real_framebuffer_physical_pages() const
+Span<LockRefPtr<PhysicalPage> const> SharedFramebufferVMObject::real_framebuffer_physical_pages() const
{
return m_real_framebuffer_vmobject->physical_pages();
}
-Span<RefPtr<PhysicalPage>> SharedFramebufferVMObject::fake_sink_framebuffer_physical_pages()
+Span<LockRefPtr<PhysicalPage>> SharedFramebufferVMObject::fake_sink_framebuffer_physical_pages()
{
return m_physical_pages.span();
}
-Span<RefPtr<PhysicalPage> const> SharedFramebufferVMObject::fake_sink_framebuffer_physical_pages() const
+Span<LockRefPtr<PhysicalPage> 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<Kernel::
});
}
-Span<RefPtr<PhysicalPage> const> SharedFramebufferVMObject::physical_pages() const
+Span<LockRefPtr<PhysicalPage> 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<RefPtr<PhysicalPage>> SharedFramebufferVMObject::physical_pages()
+Span<LockRefPtr<PhysicalPage>> SharedFramebufferVMObject::physical_pages()
{
SpinlockLocker locker(m_writes_state_lock);
if (m_writes_are_faked)
@@ -107,7 +107,7 @@ Span<RefPtr<PhysicalPage>> SharedFramebufferVMObject::physical_pages()
return m_real_framebuffer_vmobject->physical_pages();
}
-SharedFramebufferVMObject::SharedFramebufferVMObject(FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages, CommittedPhysicalPageSet committed_pages, AnonymousVMObject& real_framebuffer_vmobject)
+SharedFramebufferVMObject::SharedFramebufferVMObject(FixedArray<LockRefPtr<PhysicalPage>>&& 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<NonnullRefPtr<FakeWritesFramebufferVMObject>> try_create(Badge<SharedFramebufferVMObject>, SharedFramebufferVMObject const& parent_object);
+ static ErrorOr<NonnullLockRefPtr<FakeWritesFramebufferVMObject>> try_create(Badge<SharedFramebufferVMObject>, SharedFramebufferVMObject const& parent_object);
private:
- FakeWritesFramebufferVMObject(SharedFramebufferVMObject const& parent_object, FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages)
+ FakeWritesFramebufferVMObject(SharedFramebufferVMObject const& parent_object, FixedArray<LockRefPtr<PhysicalPage>>&& new_physical_pages)
: VMObject(move(new_physical_pages))
, m_parent_object(parent_object)
{
}
virtual StringView class_name() const override { return "FakeWritesFramebufferVMObject"sv; }
- virtual ErrorOr<NonnullRefPtr<VMObject>> try_clone() override { return Error::from_errno(ENOTIMPL); }
- virtual Span<RefPtr<PhysicalPage> const> physical_pages() const override { return m_parent_object->fake_sink_framebuffer_physical_pages(); }
- virtual Span<RefPtr<PhysicalPage>> physical_pages() override { return m_parent_object->fake_sink_framebuffer_physical_pages(); }
- NonnullRefPtr<SharedFramebufferVMObject> m_parent_object;
+ virtual ErrorOr<NonnullLockRefPtr<VMObject>> try_clone() override { return Error::from_errno(ENOTIMPL); }
+ virtual Span<LockRefPtr<PhysicalPage> const> physical_pages() const override { return m_parent_object->fake_sink_framebuffer_physical_pages(); }
+ virtual Span<LockRefPtr<PhysicalPage>> physical_pages() override { return m_parent_object->fake_sink_framebuffer_physical_pages(); }
+ NonnullLockRefPtr<SharedFramebufferVMObject> m_parent_object;
};
class RealWritesFramebufferVMObject final : public VMObject {
public:
- static ErrorOr<NonnullRefPtr<RealWritesFramebufferVMObject>> try_create(Badge<SharedFramebufferVMObject>, SharedFramebufferVMObject const& parent_object);
+ static ErrorOr<NonnullLockRefPtr<RealWritesFramebufferVMObject>> try_create(Badge<SharedFramebufferVMObject>, SharedFramebufferVMObject const& parent_object);
private:
- RealWritesFramebufferVMObject(SharedFramebufferVMObject const& parent_object, FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages)
+ RealWritesFramebufferVMObject(SharedFramebufferVMObject const& parent_object, FixedArray<LockRefPtr<PhysicalPage>>&& new_physical_pages)
: VMObject(move(new_physical_pages))
, m_parent_object(parent_object)
{
}
virtual StringView class_name() const override { return "RealWritesFramebufferVMObject"sv; }
- virtual ErrorOr<NonnullRefPtr<VMObject>> try_clone() override { return Error::from_errno(ENOTIMPL); }
- virtual Span<RefPtr<PhysicalPage> const> physical_pages() const override { return m_parent_object->real_framebuffer_physical_pages(); }
- virtual Span<RefPtr<PhysicalPage>> physical_pages() override { return m_parent_object->real_framebuffer_physical_pages(); }
- NonnullRefPtr<SharedFramebufferVMObject> m_parent_object;
+ virtual ErrorOr<NonnullLockRefPtr<VMObject>> try_clone() override { return Error::from_errno(ENOTIMPL); }
+ virtual Span<LockRefPtr<PhysicalPage> const> physical_pages() const override { return m_parent_object->real_framebuffer_physical_pages(); }
+ virtual Span<LockRefPtr<PhysicalPage>> physical_pages() override { return m_parent_object->real_framebuffer_physical_pages(); }
+ NonnullLockRefPtr<SharedFramebufferVMObject> m_parent_object;
};
virtual ~SharedFramebufferVMObject() override = default;
- static ErrorOr<NonnullRefPtr<SharedFramebufferVMObject>> try_create_for_physical_range(PhysicalAddress paddr, size_t size);
- static ErrorOr<NonnullRefPtr<SharedFramebufferVMObject>> try_create_at_arbitrary_physical_range(size_t size);
- virtual ErrorOr<NonnullRefPtr<VMObject>> try_clone() override { return Error::from_errno(ENOTIMPL); }
+ static ErrorOr<NonnullLockRefPtr<SharedFramebufferVMObject>> try_create_for_physical_range(PhysicalAddress paddr, size_t size);
+ static ErrorOr<NonnullLockRefPtr<SharedFramebufferVMObject>> try_create_at_arbitrary_physical_range(size_t size);
+ virtual ErrorOr<NonnullLockRefPtr<VMObject>> try_clone() override { return Error::from_errno(ENOTIMPL); }
void switch_to_fake_sink_framebuffer_writes(Badge<Kernel::DisplayConnector>);
void switch_to_real_framebuffer_writes(Badge<Kernel::DisplayConnector>);
- virtual Span<RefPtr<PhysicalPage> const> physical_pages() const override;
- virtual Span<RefPtr<PhysicalPage>> physical_pages() override;
+ virtual Span<LockRefPtr<PhysicalPage> const> physical_pages() const override;
+ virtual Span<LockRefPtr<PhysicalPage>> physical_pages() override;
- Span<RefPtr<PhysicalPage>> fake_sink_framebuffer_physical_pages();
- Span<RefPtr<PhysicalPage> const> fake_sink_framebuffer_physical_pages() const;
+ Span<LockRefPtr<PhysicalPage>> fake_sink_framebuffer_physical_pages();
+ Span<LockRefPtr<PhysicalPage> const> fake_sink_framebuffer_physical_pages() const;
- Span<RefPtr<PhysicalPage>> real_framebuffer_physical_pages();
- Span<RefPtr<PhysicalPage> const> real_framebuffer_physical_pages() const;
+ Span<LockRefPtr<PhysicalPage>> real_framebuffer_physical_pages();
+ Span<LockRefPtr<PhysicalPage> 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<RefPtr<PhysicalPage>>&& new_physical_pages, CommittedPhysicalPageSet, AnonymousVMObject& real_framebuffer_vmobject);
+ SharedFramebufferVMObject(FixedArray<LockRefPtr<PhysicalPage>>&& new_physical_pages, CommittedPhysicalPageSet, AnonymousVMObject& real_framebuffer_vmobject);
virtual StringView class_name() const override { return "SharedFramebufferVMObject"sv; }
ErrorOr<void> create_fake_writes_framebuffer_vm_object();
ErrorOr<void> create_real_writes_framebuffer_vm_object();
- NonnullRefPtr<AnonymousVMObject> m_real_framebuffer_vmobject;
- RefPtr<FakeWritesFramebufferVMObject> m_fake_writes_framebuffer_vmobject;
- RefPtr<RealWritesFramebufferVMObject> m_real_writes_framebuffer_vmobject;
+ NonnullLockRefPtr<AnonymousVMObject> m_real_framebuffer_vmobject;
+ LockRefPtr<FakeWritesFramebufferVMObject> m_fake_writes_framebuffer_vmobject;
+ LockRefPtr<RealWritesFramebufferVMObject> 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<NonnullRefPtr<SharedInodeVMObject>> SharedInodeVMObject::try_create_with_inode(Inode& inode)
+ErrorOr<NonnullLockRefPtr<SharedInodeVMObject>> 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<NonnullRefPtr<VMObject>> SharedInodeVMObject::try_clone()
+ErrorOr<NonnullLockRefPtr<VMObject>> 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<VMObject>(new (nothrow) SharedInodeVMObject(*this, move(new_physical_pages), move(dirty_pages)));
+ return adopt_nonnull_lock_ref_or_enomem<VMObject>(new (nothrow) SharedInodeVMObject(*this, move(new_physical_pages), move(dirty_pages)));
}
-SharedInodeVMObject::SharedInodeVMObject(Inode& inode, FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages, Bitmap dirty_pages)
+SharedInodeVMObject::SharedInodeVMObject(Inode& inode, FixedArray<LockRefPtr<PhysicalPage>>&& new_physical_pages, Bitmap dirty_pages)
: InodeVMObject(inode, move(new_physical_pages), move(dirty_pages))
{
}
-SharedInodeVMObject::SharedInodeVMObject(SharedInodeVMObject const& other, FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages, Bitmap dirty_pages)
+SharedInodeVMObject::SharedInodeVMObject(SharedInodeVMObject const& other, FixedArray<LockRefPtr<PhysicalPage>>&& 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<NonnullRefPtr<SharedInodeVMObject>> try_create_with_inode(Inode&);
- virtual ErrorOr<NonnullRefPtr<VMObject>> try_clone() override;
+ static ErrorOr<NonnullLockRefPtr<SharedInodeVMObject>> try_create_with_inode(Inode&);
+ virtual ErrorOr<NonnullLockRefPtr<VMObject>> try_clone() override;
ErrorOr<void> 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<RefPtr<PhysicalPage>>&&, Bitmap dirty_pages);
- explicit SharedInodeVMObject(SharedInodeVMObject const&, FixedArray<RefPtr<PhysicalPage>>&&, Bitmap dirty_pages);
+ explicit SharedInodeVMObject(Inode&, FixedArray<LockRefPtr<PhysicalPage>>&&, Bitmap dirty_pages);
+ explicit SharedInodeVMObject(SharedInodeVMObject const&, FixedArray<LockRefPtr<PhysicalPage>>&&, 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::AllInstancesList>& VMObject::all_instances()
return s_all_instances;
}
-ErrorOr<FixedArray<RefPtr<PhysicalPage>>> VMObject::try_clone_physical_pages() const
+ErrorOr<FixedArray<LockRefPtr<PhysicalPage>>> VMObject::try_clone_physical_pages() const
{
return m_physical_pages.try_clone();
}
-ErrorOr<FixedArray<RefPtr<PhysicalPage>>> VMObject::try_create_physical_pages(size_t size)
+ErrorOr<FixedArray<LockRefPtr<PhysicalPage>>> VMObject::try_create_physical_pages(size_t size)
{
- return FixedArray<RefPtr<PhysicalPage>>::try_create(ceil_div(size, static_cast<size_t>(PAGE_SIZE)));
+ return FixedArray<LockRefPtr<PhysicalPage>>::try_create(ceil_div(size, static_cast<size_t>(PAGE_SIZE)));
}
-VMObject::VMObject(FixedArray<RefPtr<PhysicalPage>>&& new_physical_pages)
+VMObject::VMObject(FixedArray<LockRefPtr<PhysicalPage>>&& 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 <AK/FixedArray.h>
#include <AK/IntrusiveList.h>
-#include <AK/RefPtr.h>
-#include <AK/Weakable.h>
#include <Kernel/Forward.h>
#include <Kernel/Library/ListedRefCounted.h>
+#include <Kernel/Library/LockRefPtr.h>
+#include <Kernel/Library/LockWeakable.h>
#include <Kernel/Locking/Mutex.h>
#include <Kernel/Memory/Region.h>
@@ -19,14 +19,14 @@ namespace Kernel::Memory {
class VMObject
: public ListedRefCounted<VMObject, LockType::Spinlock>
- , public Weakable<VMObject> {
+ , public LockWeakable<VMObject> {
friend class MemoryManager;
friend class Region;
public:
virtual ~VMObject();
- virtual ErrorOr<NonnullRefPtr<VMObject>> try_clone() = 0;
+ virtual ErrorOr<NonnullLockRefPtr<VMObject>> 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<RefPtr<PhysicalPage> const> physical_pages() const { return m_physical_pages.span(); }
- virtual Span<RefPtr<PhysicalPage>> physical_pages() { return m_physical_pages.span(); }
+ virtual Span<LockRefPtr<PhysicalPage> const> physical_pages() const { return m_physical_pages.span(); }
+ virtual Span<LockRefPtr<PhysicalPage>> 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<FixedArray<RefPtr<PhysicalPage>>> try_create_physical_pages(size_t);
- ErrorOr<FixedArray<RefPtr<PhysicalPage>>> try_clone_physical_pages() const;
- explicit VMObject(FixedArray<RefPtr<PhysicalPage>>&&);
+ static ErrorOr<FixedArray<LockRefPtr<PhysicalPage>>> try_create_physical_pages(size_t);
+ ErrorOr<FixedArray<LockRefPtr<PhysicalPage>>> try_clone_physical_pages() const;
+ explicit VMObject(FixedArray<LockRefPtr<PhysicalPage>>&&);
template<typename Callback>
void for_each_region(Callback);
IntrusiveListNode<VMObject> m_list_node;
- FixedArray<RefPtr<PhysicalPage>> m_physical_pages;
+ FixedArray<LockRefPtr<PhysicalPage>> 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<NonnullOwnPtr<DoubleBuffer>> IPv4Socket::try_create_receive_buffer()
return DoubleBuffer::try_create("IPv4Socket: Receive buffer"sv, 256 * KiB);
}
-ErrorOr<NonnullRefPtr<Socket>> IPv4Socket::create(int type, int protocol)
+ErrorOr<NonnullLockRefPtr<Socket>> IPv4Socket::create(int type, int protocol)
{
auto receive_buffer = TRY(IPv4Socket::try_create_receive_buffer());
@@ -49,7 +49,7 @@ ErrorOr<NonnullRefPtr<Socket>> 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<NonnullRefPtr<Socket>> create(int type, int protocol);
+ static ErrorOr<NonnullLockRefPtr<Socket>> create(int type, int protocol);
virtual ~IPv4Socket() override;
virtual ErrorOr<void> 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> E1000ENetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier)
+UNMAP_AFTER_INIT LockRefPtr<E1000ENetworkAdapter> 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> 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<E1000ENetworkAdapter> try_to_initialize(PCI::DeviceIdentifier const&);
+ static LockRefPtr<E1000ENetworkAdapter> 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> E1000NetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier)
+UNMAP_AFTER_INIT LockRefPtr<E1000NetworkAdapter> 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> 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<E1000NetworkAdapter> try_to_initialize(PCI::DeviceIdentifier const&);
+ static LockRefPtr<E1000NetworkAdapter> 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<void> LocalSocket::try_for_each(Function<ErrorOr<void>(LocalSocket const
});
}
-ErrorOr<NonnullRefPtr<LocalSocket>> LocalSocket::try_create(int type)
+ErrorOr<NonnullLockRefPtr<LocalSocket>> 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<SocketPair> LocalSocket::try_create_connected_pair(int type)
@@ -469,7 +469,7 @@ ErrorOr<void> LocalSocket::chown(OpenFileDescription&, UserID uid, GroupID gid)
return {};
}
-NonnullRefPtrVector<OpenFileDescription>& LocalSocket::recvfd_queue_for(OpenFileDescription const& description)
+NonnullLockRefPtrVector<OpenFileDescription>& LocalSocket::recvfd_queue_for(OpenFileDescription const& description)
{
auto role = this->role(description);
if (role == Role::Connected)
@@ -479,7 +479,7 @@ NonnullRefPtrVector<OpenFileDescription>& LocalSocket::recvfd_queue_for(OpenFile
VERIFY_NOT_REACHED();
}
-NonnullRefPtrVector<OpenFileDescription>& LocalSocket::sendfd_queue_for(OpenFileDescription const& description)
+NonnullLockRefPtrVector<OpenFileDescription>& LocalSocket::sendfd_queue_for(OpenFileDescription const& description)
{
auto role = this->role(description);
if (role == Role::Connected)
@@ -489,7 +489,7 @@ NonnullRefPtrVector<OpenFileDescription>& LocalSocket::sendfd_queue_for(OpenFile
VERIFY_NOT_REACHED();
}
-ErrorOr<void> LocalSocket::sendfd(OpenFileDescription const& socket_description, NonnullRefPtr<OpenFileDescription> passing_description)
+ErrorOr<void> LocalSocket::sendfd(OpenFileDescription const& socket_description, NonnullLockRefPtr<OpenFileDescription> passing_description)
{
MutexLocker locker(mutex());
auto role = this->role(socket_description);
@@ -503,7 +503,7 @@ ErrorOr<void> LocalSocket::sendfd(OpenFileDescription const& socket_description,
return {};
}
-ErrorOr<NonnullRefPtr<OpenFileDescription>> LocalSocket::recvfd(OpenFileDescription const& socket_description)
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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<OpenFileDescription> description0;
- NonnullRefPtr<OpenFileDescription> description1;
+ NonnullLockRefPtr<OpenFileDescription> description0;
+ NonnullLockRefPtr<OpenFileDescription> description1;
};
class LocalSocket final : public Socket {
public:
- static ErrorOr<NonnullRefPtr<LocalSocket>> try_create(int type);
+ static ErrorOr<NonnullLockRefPtr<LocalSocket>> try_create(int type);
static ErrorOr<SocketPair> try_create_connected_pair(int type);
virtual ~LocalSocket() override;
- ErrorOr<void> sendfd(OpenFileDescription const& socket_description, NonnullRefPtr<OpenFileDescription> passing_description);
- ErrorOr<NonnullRefPtr<OpenFileDescription>> recvfd(OpenFileDescription const& socket_description);
+ ErrorOr<void> sendfd(OpenFileDescription const& socket_description, NonnullLockRefPtr<OpenFileDescription> passing_description);
+ ErrorOr<NonnullLockRefPtr<OpenFileDescription>> recvfd(OpenFileDescription const& socket_description);
static void for_each(Function<void(LocalSocket const&)>);
static ErrorOr<void> try_for_each(Function<ErrorOr<void>(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<OpenFileDescription>& sendfd_queue_for(OpenFileDescription const&);
- NonnullRefPtrVector<OpenFileDescription>& recvfd_queue_for(OpenFileDescription const&);
+ NonnullLockRefPtrVector<OpenFileDescription>& sendfd_queue_for(OpenFileDescription const&);
+ NonnullLockRefPtrVector<OpenFileDescription>& 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<void> try_set_path(StringView);
// The inode this socket is bound to.
- WeakPtr<Inode> m_inode;
+ LockWeakPtr<Inode> m_inode;
UserID m_prebind_uid { 0 };
GroupID m_prebind_gid { 0 };
@@ -100,8 +100,8 @@ private:
NonnullOwnPtr<DoubleBuffer> m_for_client;
NonnullOwnPtr<DoubleBuffer> m_for_server;
- NonnullRefPtrVector<OpenFileDescription> m_fds_for_client;
- NonnullRefPtrVector<OpenFileDescription> m_fds_for_server;
+ NonnullLockRefPtrVector<OpenFileDescription> m_fds_for_client;
+ NonnullLockRefPtrVector<OpenFileDescription> m_fds_for_server;
IntrusiveListNode<LocalSocket> 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> LoopbackAdapter::try_create()
+LockRefPtr<LoopbackAdapter> 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<KString> 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<KString>);
public:
- static RefPtr<LoopbackAdapter> try_create();
+ static LockRefPtr<LoopbackAdapter> 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> NE2000NetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier)
+UNMAP_AFTER_INIT LockRefPtr<NE2000NetworkAdapter> 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> 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<KString> 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<NE2000NetworkAdapter> try_to_initialize(PCI::DeviceIdentifier const&);
+ static LockRefPtr<NE2000NetworkAdapter> 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<PacketWithTimestamp> NetworkAdapter::acquire_packet_buffer(size_t size)
+LockRefPtr<PacketWithTimestamp> NetworkAdapter::acquire_packet_buffer(size_t size)
{
- auto packet = m_unused_packets.with([size](auto& unused_packets) -> RefPtr<PacketWithTimestamp> {
+ auto packet = m_unused_packets.with([size](auto& unused_packets) -> LockRefPtr<PacketWithTimestamp> {
if (unused_packets.is_empty())
return nullptr;
@@ -135,7 +135,7 @@ RefPtr<PacketWithTimestamp> 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 <AK/IntrusiveList.h>
#include <AK/MACAddress.h>
#include <AK/Types.h>
-#include <AK/WeakPtr.h>
-#include <AK/Weakable.h>
#include <Kernel/Bus/PCI/Definitions.h>
#include <Kernel/KBuffer.h>
+#include <Kernel/Library/LockWeakPtr.h>
+#include <Kernel/Library/LockWeakable.h>
#include <Kernel/Net/ARP.h>
#include <Kernel/Net/EthernetFrameHeader.h>
#include <Kernel/Net/ICMP.h>
@@ -39,12 +39,12 @@ struct PacketWithTimestamp final : public AtomicRefCounted<PacketWithTimestamp>
NonnullOwnPtr<KBuffer> buffer;
Time timestamp;
- IntrusiveListNode<PacketWithTimestamp, RefPtr<PacketWithTimestamp>> packet_node;
+ IntrusiveListNode<PacketWithTimestamp, LockRefPtr<PacketWithTimestamp>> packet_node;
};
class NetworkAdapter
: public AtomicRefCounted<NetworkAdapter>
- , public Weakable<NetworkAdapter> {
+ , public LockWeakable<NetworkAdapter> {
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<PacketWithTimestamp> acquire_packet_buffer(size_t);
+ LockRefPtr<PacketWithTimestamp> 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<TCPSocket> socket);
-static void send_tcp_rst(IPv4Packet const& ipv4_packet, TCPPacket const& tcp_packet, RefPtr<NetworkAdapter> adapter);
+static void send_delayed_tcp_ack(LockRefPtr<TCPSocket> socket);
+static void send_tcp_rst(IPv4Packet const& ipv4_packet, TCPPacket const& tcp_packet, LockRefPtr<NetworkAdapter> adapter);
static void flush_delayed_tcp_acks();
static void retransmit_tcp_packets();
static Thread* network_task = nullptr;
-static HashTable<RefPtr<TCPSocket>>* delayed_ack_sockets;
+static HashTable<LockRefPtr<TCPSocket>>* delayed_ack_sockets;
[[noreturn]] static void NetworkTask_main(void*);
void NetworkTask::spawn()
{
- RefPtr<Thread> thread;
+ LockRefPtr<Thread> 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<RefPtr<TCPSocket>>;
+ delayed_ack_sockets = new HashTable<LockRefPtr<TCPSocket>>;
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<IPv4Socket> icmp_sockets;
+ NonnullLockRefPtrVector<IPv4Socket> 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<TCPSocket> socket)
+void send_delayed_tcp_ack(LockRefPtr<TCPSocket> socket)
{
VERIFY(socket->mutex().is_locked());
if (!socket->should_delay_next_ack()) {
@@ -315,7 +315,7 @@ void send_delayed_tcp_ack(RefPtr<TCPSocket> socket)
void flush_delayed_tcp_acks()
{
- Vector<RefPtr<TCPSocket>, 32> remaining_sockets;
+ Vector<LockRefPtr<TCPSocket>, 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<NetworkAdapter> adapter)
+void send_tcp_rst(IPv4Packet const& ipv4_packet, TCPPacket const& tcp_packet, LockRefPtr<NetworkAdapter> 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<TCPSocket, 16> sockets;
+ NonnullLockRefPtrVector<TCPSocket, 16> 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<NetworkAdapter> NetworkingManagement::loopback_adapter() const
+NonnullLockRefPtr<NetworkAdapter> NetworkingManagement::loopback_adapter() const
{
return *m_loopback_adapter;
}
@@ -59,13 +59,13 @@ ErrorOr<void> NetworkingManagement::try_for_each(Function<ErrorOr<void>(NetworkA
});
}
-RefPtr<NetworkAdapter> NetworkingManagement::from_ipv4_address(IPv4Address const& address) const
+LockRefPtr<NetworkAdapter> 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<NetworkAdapter> {
+ return m_adapters.with([&](auto& adapters) -> LockRefPtr<NetworkAdapter> {
for (auto& adapter : adapters) {
if (adapter.ipv4_address() == address || adapter.ipv4_broadcast() == address)
return adapter;
@@ -74,9 +74,9 @@ RefPtr<NetworkAdapter> NetworkingManagement::from_ipv4_address(IPv4Address const
});
}
-RefPtr<NetworkAdapter> NetworkingManagement::lookup_by_name(StringView name) const
+LockRefPtr<NetworkAdapter> NetworkingManagement::lookup_by_name(StringView name) const
{
- return m_adapters.with([&](auto& adapters) -> RefPtr<NetworkAdapter> {
+ return m_adapters.with([&](auto& adapters) -> LockRefPtr<NetworkAdapter> {
for (auto& adapter : adapters) {
if (adapter.name() == name)
return adapter;
@@ -94,7 +94,7 @@ ErrorOr<NonnullOwnPtr<KString>> NetworkingManagement::generate_interface_name_fr
return name;
}
-UNMAP_AFTER_INIT RefPtr<NetworkAdapter> NetworkingManagement::determine_network_device(PCI::DeviceIdentifier const& device_identifier) const
+UNMAP_AFTER_INIT LockRefPtr<NetworkAdapter> 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 <AK/Function.h>
#include <AK/NonnullOwnPtr.h>
-#include <AK/NonnullRefPtr.h>
-#include <AK/NonnullRefPtrVector.h>
#include <AK/Types.h>
#include <Kernel/Bus/PCI/Definitions.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Locking/SpinlockProtected.h>
#include <Kernel/Memory/Region.h>
#include <Kernel/Net/NetworkAdapter.h>
@@ -34,16 +34,16 @@ public:
void for_each(Function<void(NetworkAdapter&)>);
ErrorOr<void> try_for_each(Function<ErrorOr<void>(NetworkAdapter&)>);
- RefPtr<NetworkAdapter> from_ipv4_address(IPv4Address const&) const;
- RefPtr<NetworkAdapter> lookup_by_name(StringView) const;
+ LockRefPtr<NetworkAdapter> from_ipv4_address(IPv4Address const&) const;
+ LockRefPtr<NetworkAdapter> lookup_by_name(StringView) const;
- NonnullRefPtr<NetworkAdapter> loopback_adapter() const;
+ NonnullLockRefPtr<NetworkAdapter> loopback_adapter() const;
private:
- RefPtr<NetworkAdapter> determine_network_device(PCI::DeviceIdentifier const&) const;
+ LockRefPtr<NetworkAdapter> determine_network_device(PCI::DeviceIdentifier const&) const;
- SpinlockProtected<NonnullRefPtrVector<NetworkAdapter>> m_adapters { LockRank::None };
- RefPtr<NetworkAdapter> m_loopback_adapter;
+ SpinlockProtected<NonnullLockRefPtrVector<NetworkAdapter>> m_adapters { LockRank::None };
+ LockRefPtr<NetworkAdapter> 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> RTL8139NetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier)
+UNMAP_AFTER_INIT LockRefPtr<RTL8139NetworkAdapter> 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> 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<KString> 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<RTL8139NetworkAdapter> try_to_initialize(PCI::DeviceIdentifier const&);
+ static LockRefPtr<RTL8139NetworkAdapter> 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> RTL8168NetworkAdapter::try_to_initialize(PCI::DeviceIdentifier const& pci_device_identifier)
+UNMAP_AFTER_INIT LockRefPtr<RTL8168NetworkAdapter> 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> 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<RTL8168NetworkAdapter> try_to_initialize(PCI::DeviceIdentifier const&);
+ static LockRefPtr<RTL8168NetworkAdapter> 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<Route::RouteList>& routing_table()
return *s_routing_table;
}
-ErrorOr<void> update_routing_table(IPv4Address const& destination, IPv4Address const& gateway, IPv4Address const& netmask, u16 flags, RefPtr<NetworkAdapter> adapter, UpdateTable update)
+ErrorOr<void> update_routing_table(IPv4Address const& destination, IPv4Address const& gateway, IPv4Address const& netmask, u16 flags, LockRefPtr<NetworkAdapter> 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<NetworkAdapter> const through, AllowUsingGateway allow_using_gateway)
+RoutingDecision route_to(IPv4Address const& target, IPv4Address const& source, LockRefPtr<NetworkAdapter> 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<NetworkAdapter> local_adapter = nullptr;
- RefPtr<Route> chosen_route = nullptr;
+ LockRefPtr<NetworkAdapter> local_adapter = nullptr;
+ LockRefPtr<Route> 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<NetworkAdapter> adapter = nullptr;
+ LockRefPtr<NetworkAdapter> 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 <AK/IPv4Address.h>
-#include <AK/NonnullRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
#include <Kernel/Locking/MutexProtected.h>
#include <Kernel/Net/NetworkAdapter.h>
#include <Kernel/Thread.h>
@@ -15,7 +15,7 @@
namespace Kernel {
struct Route final : public AtomicRefCounted<Route> {
- Route(IPv4Address const& destination, IPv4Address const& gateway, IPv4Address const& netmask, u16 flags, NonnullRefPtr<NetworkAdapter> adapter)
+ Route(IPv4Address const& destination, IPv4Address const& gateway, IPv4Address const& netmask, u16 flags, NonnullLockRefPtr<NetworkAdapter> adapter)
: destination(destination)
, gateway(gateway)
, netmask(netmask)
@@ -38,14 +38,14 @@ struct Route final : public AtomicRefCounted<Route> {
const IPv4Address gateway;
const IPv4Address netmask;
const u16 flags;
- NonnullRefPtr<NetworkAdapter> adapter;
+ NonnullLockRefPtr<NetworkAdapter> adapter;
- IntrusiveListNode<Route, RefPtr<Route>> route_list_node {};
+ IntrusiveListNode<Route, LockRefPtr<Route>> route_list_node {};
using RouteList = IntrusiveList<&Route::route_list_node>;
};
struct RoutingDecision {
- RefPtr<NetworkAdapter> adapter;
+ LockRefPtr<NetworkAdapter> 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<void> update_routing_table(IPv4Address const& destination, IPv4Address const& gateway, IPv4Address const& netmask, u16 flags, RefPtr<NetworkAdapter> const adapter, UpdateTable update);
+ErrorOr<void> update_routing_table(IPv4Address const& destination, IPv4Address const& gateway, IPv4Address const& netmask, u16 flags, LockRefPtr<NetworkAdapter> const adapter, UpdateTable update);
enum class AllowUsingGateway {
Yes,
No,
};
-RoutingDecision route_to(IPv4Address const& target, IPv4Address const& source, RefPtr<NetworkAdapter> const through = nullptr, AllowUsingGateway = AllowUsingGateway::Yes);
+RoutingDecision route_to(IPv4Address const& target, IPv4Address const& source, LockRefPtr<NetworkAdapter> const through = nullptr, AllowUsingGateway = AllowUsingGateway::Yes);
SpinlockProtected<HashMap<IPv4Address, MACAddress>>& arp_table();
SpinlockProtected<Route::RouteList>& 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<NonnullRefPtr<Socket>> Socket::create(int domain, int type, int protocol)
+ErrorOr<NonnullLockRefPtr<Socket>> 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> Socket::accept()
+LockRefPtr<Socket> Socket::accept()
{
MutexLocker locker(mutex());
if (m_pending.is_empty())
@@ -63,7 +63,7 @@ RefPtr<Socket> Socket::accept()
return client;
}
-ErrorOr<void> Socket::queue_connection_from(NonnullRefPtr<Socket> peer)
+ErrorOr<void> Socket::queue_connection_from(NonnullLockRefPtr<Socket> 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 <AK/Error.h>
-#include <AK/NonnullRefPtrVector.h>
-#include <AK/RefPtr.h>
#include <AK/Time.h>
#include <Kernel/FileSystem/File.h>
+#include <Kernel/Library/LockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Locking/Mutex.h>
#include <Kernel/Net/NetworkAdapter.h>
#include <Kernel/UnixTypes.h>
@@ -21,7 +21,7 @@ class OpenFileDescription;
class Socket : public File {
public:
- static ErrorOr<NonnullRefPtr<Socket>> create(int domain, int type, int protocol);
+ static ErrorOr<NonnullLockRefPtr<Socket>> 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<Socket> accept();
+ LockRefPtr<Socket> accept();
ErrorOr<void> 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<NetworkAdapter> const bound_interface() const { return m_bound_interface; }
+ LockRefPtr<NetworkAdapter> 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<void> queue_connection_from(NonnullRefPtr<Socket>);
+ ErrorOr<void> queue_connection_from(NonnullLockRefPtr<Socket>);
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<NetworkAdapter> m_bound_interface { nullptr };
+ LockRefPtr<NetworkAdapter> m_bound_interface { nullptr };
Time m_receive_timeout {};
Time m_send_timeout {};
@@ -180,7 +180,7 @@ private:
ErrorOr<void> m_so_error;
- NonnullRefPtrVector<Socket> m_pending;
+ NonnullLockRefPtrVector<Socket> 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<MutexProtected<HashMap<IPv4SocketTuple, RefPtr<TCPSocket>>>> s_socket_closing;
+static Singleton<MutexProtected<HashMap<IPv4SocketTuple, LockRefPtr<TCPSocket>>>> s_socket_closing;
-MutexProtected<HashMap<IPv4SocketTuple, RefPtr<TCPSocket>>>& TCPSocket::closing_sockets()
+MutexProtected<HashMap<IPv4SocketTuple, LockRefPtr<TCPSocket>>>& TCPSocket::closing_sockets()
{
return *s_socket_closing;
}
@@ -102,9 +102,9 @@ MutexProtected<HashMap<IPv4SocketTuple, TCPSocket*>>& TCPSocket::sockets_by_tupl
return *s_socket_tuples;
}
-RefPtr<TCPSocket> TCPSocket::from_tuple(IPv4SocketTuple const& tuple)
+LockRefPtr<TCPSocket> TCPSocket::from_tuple(IPv4SocketTuple const& tuple)
{
- return sockets_by_tuple().with_shared([&](auto const& table) -> RefPtr<TCPSocket> {
+ return sockets_by_tuple().with_shared([&](auto const& table) -> LockRefPtr<TCPSocket> {
auto exact_match = table.get(tuple);
if (exact_match.has_value())
return { *exact_match.value() };
@@ -122,10 +122,10 @@ RefPtr<TCPSocket> TCPSocket::from_tuple(IPv4SocketTuple const& tuple)
return {};
});
}
-ErrorOr<NonnullRefPtr<TCPSocket>> TCPSocket::try_create_client(IPv4Address const& new_local_address, u16 new_local_port, IPv4Address const& new_peer_address, u16 new_peer_port)
+ErrorOr<NonnullLockRefPtr<TCPSocket>> 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<NonnullRefPtr<TCPSocket>> {
+ return sockets_by_tuple().with_exclusive([&](auto& table) -> ErrorOr<NonnullLockRefPtr<TCPSocket>> {
if (table.contains(tuple))
return EEXIST;
@@ -154,7 +154,7 @@ void TCPSocket::release_to_originator()
m_originator.clear();
}
-void TCPSocket::release_for_accept(NonnullRefPtr<TCPSocket> socket)
+void TCPSocket::release_for_accept(NonnullLockRefPtr<TCPSocket> 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<NonnullRefPtr<TCPSocket>> TCPSocket::try_create(int protocol, NonnullOwnPtr<DoubleBuffer> receive_buffer)
+ErrorOr<NonnullLockRefPtr<TCPSocket>> TCPSocket::try_create(int protocol, NonnullOwnPtr<DoubleBuffer> 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<size_t> 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 <AK/Function.h>
#include <AK/HashMap.h>
#include <AK/SinglyLinkedList.h>
-#include <AK/WeakPtr.h>
+#include <Kernel/Library/LockWeakPtr.h>
#include <Kernel/Locking/MutexProtected.h>
#include <Kernel/Net/IPv4Socket.h>
@@ -20,7 +20,7 @@ class TCPSocket final : public IPv4Socket {
public:
static void for_each(Function<void(TCPSocket const&)>);
static ErrorOr<void> try_for_each(Function<ErrorOr<void>(TCPSocket const&)>);
- static ErrorOr<NonnullRefPtr<TCPSocket>> try_create(int protocol, NonnullOwnPtr<DoubleBuffer> receive_buffer);
+ static ErrorOr<NonnullLockRefPtr<TCPSocket>> try_create(int protocol, NonnullOwnPtr<DoubleBuffer> receive_buffer);
virtual ~TCPSocket() override;
virtual bool unref() const override;
@@ -146,15 +146,15 @@ public:
bool should_delay_next_ack() const;
static MutexProtected<HashMap<IPv4SocketTuple, TCPSocket*>>& sockets_by_tuple();
- static RefPtr<TCPSocket> from_tuple(IPv4SocketTuple const& tuple);
+ static LockRefPtr<TCPSocket> from_tuple(IPv4SocketTuple const& tuple);
- static MutexProtected<HashMap<IPv4SocketTuple, RefPtr<TCPSocket>>>& closing_sockets();
+ static MutexProtected<HashMap<IPv4SocketTuple, LockRefPtr<TCPSocket>>>& closing_sockets();
- ErrorOr<NonnullRefPtr<TCPSocket>> try_create_client(IPv4Address const& local_address, u16 local_port, IPv4Address const& peer_address, u16 peer_port);
+ ErrorOr<NonnullLockRefPtr<TCPSocket>> 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<TCPSocket>);
+ void release_for_accept(NonnullLockRefPtr<TCPSocket>);
void retransmit_packets();
@@ -185,11 +185,11 @@ private:
void enqueue_for_retransmit();
void dequeue_for_retransmit();
- WeakPtr<TCPSocket> m_originator;
- HashMap<IPv4SocketTuple, NonnullRefPtr<TCPSocket>> m_pending_release_for_accept;
+ LockWeakPtr<TCPSocket> m_originator;
+ HashMap<IPv4SocketTuple, NonnullLockRefPtr<TCPSocket>> m_pending_release_for_accept;
Direction m_direction { Direction::Unspecified };
Error m_error { Error::None };
- RefPtr<NetworkAdapter> m_adapter;
+ LockRefPtr<NetworkAdapter> 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<PacketWithTimestamp> buffer;
+ LockRefPtr<PacketWithTimestamp> buffer;
size_t ipv4_payload_offset;
- WeakPtr<NetworkAdapter> adapter;
+ LockWeakPtr<NetworkAdapter> 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<HashMap<u16, UDPSocket*>>& UDPSocket::sockets_by_port()
return *s_map;
}
-RefPtr<UDPSocket> UDPSocket::from_port(u16 port)
+LockRefPtr<UDPSocket> UDPSocket::from_port(u16 port)
{
- return sockets_by_port().with_shared([&](auto const& table) -> RefPtr<UDPSocket> {
+ return sockets_by_port().with_shared([&](auto const& table) -> LockRefPtr<UDPSocket> {
auto it = table.find(port);
if (it == table.end())
return {};
@@ -60,9 +60,9 @@ UDPSocket::~UDPSocket()
});
}
-ErrorOr<NonnullRefPtr<UDPSocket>> UDPSocket::try_create(int protocol, NonnullOwnPtr<DoubleBuffer> receive_buffer)
+ErrorOr<NonnullLockRefPtr<UDPSocket>> UDPSocket::try_create(int protocol, NonnullOwnPtr<DoubleBuffer> 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<size_t> 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<NonnullRefPtr<UDPSocket>> try_create(int protocol, NonnullOwnPtr<DoubleBuffer> receive_buffer);
+ static ErrorOr<NonnullLockRefPtr<UDPSocket>> try_create(int protocol, NonnullOwnPtr<DoubleBuffer> receive_buffer);
virtual ~UDPSocket() override;
- static RefPtr<UDPSocket> from_port(u16);
+ static LockRefPtr<UDPSocket> from_port(u16);
static void for_each(Function<void(UDPSocket const&)>);
static ErrorOr<void> try_for_each(Function<ErrorOr<void>(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<Process> new_process = process;
+ LockRefPtr<Process> new_process = process;
all_instances().with([&](auto& list) {
list.prepend(process);
});
}
-ErrorOr<NonnullRefPtr<Process>> Process::try_create_user_process(RefPtr<Thread>& first_thread, StringView path, UserID uid, GroupID gid, NonnullOwnPtrVector<KString> arguments, NonnullOwnPtrVector<KString> environment, TTY* tty)
+ErrorOr<NonnullLockRefPtr<Process>> Process::try_create_user_process(LockRefPtr<Thread>& first_thread, StringView path, UserID uid, GroupID gid, NonnullOwnPtrVector<KString> arguments, NonnullOwnPtrVector<KString> environment, TTY* tty)
{
auto parts = path.split_view('/');
if (arguments.is_empty()) {
@@ -181,7 +181,7 @@ ErrorOr<NonnullRefPtr<Process>> Process::try_create_user_process(RefPtr<Thread>&
return process;
}
-RefPtr<Process> Process::create_kernel_process(RefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, void (*entry)(void*), void* entry_data, u32 affinity, RegisterProcess do_register)
+LockRefPtr<Process> Process::create_kernel_process(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> 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<NonnullRefPtr<Process>> Process::try_create(RefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, UserID uid, GroupID gid, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> current_directory, RefPtr<Custody> executable, TTY* tty, Process* fork_parent)
+ErrorOr<NonnullLockRefPtr<Process>> Process::try_create(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, UserID uid, GroupID gid, ProcessID ppid, bool is_kernel_process, LockRefPtr<Custody> current_directory, LockRefPtr<Custody> 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<KString> name, UserID uid, GroupID gid, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> current_directory, RefPtr<Custody> executable, TTY* tty, UnveilNode unveil_tree)
+Process::Process(NonnullOwnPtr<KString> name, UserID uid, GroupID gid, ProcessID ppid, bool is_kernel_process, LockRefPtr<Custody> current_directory, LockRefPtr<Custody> 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<KString> name, UserID uid, GroupID gid, ProcessID
dbgln_if(PROCESS_DEBUG, "Created new process {}({})", m_name, this->pid().value());
}
-ErrorOr<void> Process::attach_resources(NonnullOwnPtr<Memory::AddressSpace>&& preallocated_space, RefPtr<Thread>& first_thread, Process* fork_parent)
+ErrorOr<void> Process::attach_resources(NonnullOwnPtr<Memory::AddressSpace>&& preallocated_space, LockRefPtr<Thread>& 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> Process::from_pid(ProcessID pid)
+LockRefPtr<Process> Process::from_pid(ProcessID pid)
{
- return all_instances().with([&](auto const& list) -> RefPtr<Process> {
+ return all_instances().with([&](auto const& list) -> LockRefPtr<Process> {
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<NonnullRefPtr<OpenFileDescription>> Process::OpenFileDescriptions::open_file_description(int fd) const
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> Process::OpenFileDescriptions::open_file_description(int fd) const
{
if (fd < 0)
return EBADF;
if (static_cast<size_t>(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<Custody> Process::current_directory()
+NonnullLockRefPtr<Custody> Process::current_directory()
{
- return m_current_directory.with([&](auto& current_directory) -> NonnullRefPtr<Custody> {
+ return m_current_directory.with([&](auto& current_directory) -> NonnullLockRefPtr<Custody> {
if (!current_directory)
current_directory = VirtualFileSystem::the().root_custody();
return *current_directory;
@@ -582,7 +582,7 @@ ErrorOr<void> 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<OpenFileDescription> description;
+ LockRefPtr<OpenFileDescription> 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<Process> waiter_process;
+ LockRefPtr<Process> waiter_process;
if (auto* my_tracer = tracer())
waiter_process = Process::from_pid(my_tracer->tracer_pid());
else
@@ -772,7 +772,7 @@ ErrorOr<void> Process::send_signal(u8 signal, Process* sender)
return ESRCH;
}
-RefPtr<Thread> Process::create_kernel_thread(void (*entry)(void*), void* entry_data, u32 priority, NonnullOwnPtr<KString> name, u32 affinity, bool joinable)
+LockRefPtr<Thread> Process::create_kernel_thread(void (*entry)(void*), void* entry_data, u32 priority, NonnullOwnPtr<KString> 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<OpenFileDescription>&& description, u32 flags)
+void Process::OpenFileDescriptionAndFlags::set(NonnullLockRefPtr<OpenFileDescription>&& 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 <AK/HashMap.h>
#include <AK/IntrusiveList.h>
#include <AK/IntrusiveListRelaxedConst.h>
-#include <AK/NonnullRefPtrVector.h>
#include <AK/OwnPtr.h>
#include <AK/Userspace.h>
#include <AK/Variant.h>
-#include <AK/WeakPtr.h>
-#include <AK/Weakable.h>
#include <Kernel/API/POSIX/sys/resource.h>
#include <Kernel/API/Syscall.h>
#include <Kernel/Assertions.h>
@@ -25,6 +22,9 @@
#include <Kernel/FileSystem/UnveilNode.h>
#include <Kernel/Forward.h>
#include <Kernel/FutexQueue.h>
+#include <Kernel/Library/LockWeakPtr.h>
+#include <Kernel/Library/LockWeakable.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Locking/Mutex.h>
#include <Kernel/Locking/MutexProtected.h>
#include <Kernel/Memory/AddressSpace.h>
@@ -103,7 +103,7 @@ struct LoadResult;
class Process final
: public ListedRefCounted<Process, LockType::Spinlock>
- , public Weakable<Process> {
+ , public LockWeakable<Process> {
class ProtectedValues {
public:
@@ -188,19 +188,19 @@ public:
};
template<typename EntryFunction>
- static RefPtr<Process> create_kernel_process(RefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, EntryFunction entry, u32 affinity = THREAD_AFFINITY_DEFAULT, RegisterProcess do_register = RegisterProcess::Yes)
+ static LockRefPtr<Process> create_kernel_process(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> 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<EntryFunction>, entry_func, affinity, do_register);
}
- static RefPtr<Process> create_kernel_process(RefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, void (*entry)(void*), void* entry_data = nullptr, u32 affinity = THREAD_AFFINITY_DEFAULT, RegisterProcess do_register = RegisterProcess::Yes);
- static ErrorOr<NonnullRefPtr<Process>> try_create_user_process(RefPtr<Thread>& first_thread, StringView path, UserID, GroupID, NonnullOwnPtrVector<KString> arguments, NonnullOwnPtrVector<KString> environment, TTY*);
+ static LockRefPtr<Process> create_kernel_process(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, void (*entry)(void*), void* entry_data = nullptr, u32 affinity = THREAD_AFFINITY_DEFAULT, RegisterProcess do_register = RegisterProcess::Yes);
+ static ErrorOr<NonnullLockRefPtr<Process>> try_create_user_process(LockRefPtr<Thread>& first_thread, StringView path, UserID, GroupID, NonnullOwnPtrVector<KString> arguments, NonnullOwnPtrVector<KString> environment, TTY*);
static void register_new(Process&);
~Process();
- RefPtr<Thread> create_kernel_thread(void (*entry)(void*), void* entry_data, u32 priority, NonnullOwnPtr<KString> name, u32 affinity = THREAD_AFFINITY_DEFAULT, bool joinable = true);
+ LockRefPtr<Thread> create_kernel_thread(void (*entry)(void*), void* entry_data, u32 priority, NonnullOwnPtr<KString> 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<Process> from_pid(ProcessID);
+ static LockRefPtr<Process> 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<Custody> current_directory();
+ NonnullLockRefPtr<Custody> current_directory();
Custody* executable() { return m_executable.ptr(); }
Custody const* executable() const { return m_executable.ptr(); }
@@ -461,7 +461,7 @@ public:
ErrorOr<void> exec(NonnullOwnPtr<KString> path, NonnullOwnPtrVector<KString> arguments, NonnullOwnPtrVector<KString> environment, Thread*& new_main_thread, u32& prev_flags, int recursion_depth = 0);
- ErrorOr<LoadResult> load(NonnullRefPtr<OpenFileDescription> main_program_description, RefPtr<OpenFileDescription> interpreter_description, const ElfW(Ehdr) & main_program_header);
+ ErrorOr<LoadResult> load(NonnullLockRefPtr<OpenFileDescription> main_program_description, LockRefPtr<OpenFileDescription> interpreter_description, const ElfW(Ehdr) & main_program_header);
bool is_superuser() const { return euid() == 0; }
@@ -532,7 +532,7 @@ public:
ErrorOr<void> set_coredump_property(NonnullOwnPtr<KString> key, NonnullOwnPtr<KString> value);
ErrorOr<void> try_set_coredump_property(StringView key, StringView value);
- NonnullRefPtrVector<Thread> const& threads_for_coredump(Badge<Coredump>) const { return m_threads_for_coredump; }
+ NonnullLockRefPtrVector<Thread> const& threads_for_coredump(Badge<Coredump>) 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<KString> name, UserID, GroupID, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> current_directory, RefPtr<Custody> executable, TTY* tty, UnveilNode unveil_tree);
- static ErrorOr<NonnullRefPtr<Process>> try_create(RefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, UserID, GroupID, ProcessID ppid, bool is_kernel_process, RefPtr<Custody> current_directory = nullptr, RefPtr<Custody> executable = nullptr, TTY* = nullptr, Process* fork_parent = nullptr);
- ErrorOr<void> attach_resources(NonnullOwnPtr<Memory::AddressSpace>&&, RefPtr<Thread>& first_thread, Process* fork_parent);
+ Process(NonnullOwnPtr<KString> name, UserID, GroupID, ProcessID ppid, bool is_kernel_process, LockRefPtr<Custody> current_directory, LockRefPtr<Custody> executable, TTY* tty, UnveilNode unveil_tree);
+ static ErrorOr<NonnullLockRefPtr<Process>> try_create(LockRefPtr<Thread>& first_thread, NonnullOwnPtr<KString> name, UserID, GroupID, ProcessID ppid, bool is_kernel_process, LockRefPtr<Custody> current_directory = nullptr, LockRefPtr<Custody> executable = nullptr, TTY* = nullptr, Process* fork_parent = nullptr);
+ ErrorOr<void> attach_resources(NonnullOwnPtr<Memory::AddressSpace>&&, LockRefPtr<Thread>& 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<void> do_exec(NonnullRefPtr<OpenFileDescription> main_program_description, NonnullOwnPtrVector<KString> arguments, NonnullOwnPtrVector<KString> environment, RefPtr<OpenFileDescription> interpreter_description, Thread*& new_main_thread, u32& prev_flags, const ElfW(Ehdr) & main_program_header);
+ ErrorOr<void> do_exec(NonnullLockRefPtr<OpenFileDescription> main_program_description, NonnullOwnPtrVector<KString> arguments, NonnullOwnPtrVector<KString> environment, LockRefPtr<OpenFileDescription> interpreter_description, Thread*& new_main_thread, u32& prev_flags, const ElfW(Ehdr) & main_program_header);
ErrorOr<FlatPtr> do_write(OpenFileDescription&, UserOrKernelBuffer const&, size_t);
ErrorOr<FlatPtr> do_statvfs(FileSystem const& path, Custody const*, statvfs* buf);
- ErrorOr<RefPtr<OpenFileDescription>> find_elf_interpreter_for_executable(StringView path, ElfW(Ehdr) const& main_executable_header, size_t main_executable_header_size, size_t file_size);
+ ErrorOr<LockRefPtr<OpenFileDescription>> find_elf_interpreter_for_executable(StringView path, ElfW(Ehdr) const& main_executable_header, size_t main_executable_header_size, size_t file_size);
ErrorOr<void> do_kill(Process&, int signal);
ErrorOr<void> do_killpg(ProcessGroupID pgrp, int signal);
ErrorOr<void> do_killall(int signal);
ErrorOr<void> do_killself(int signal);
- ErrorOr<siginfo_t> do_waitid(Variant<Empty, NonnullRefPtr<Process>, NonnullRefPtr<ProcessGroup>> waitee, int options);
+ ErrorOr<siginfo_t> do_waitid(Variant<Empty, NonnullLockRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee, int options);
static ErrorOr<NonnullOwnPtr<KString>> get_syscall_path_argument(Userspace<char const*> user_path, size_t path_length);
static ErrorOr<NonnullOwnPtr<KString>> get_syscall_path_argument(Syscall::StringArgument const&);
@@ -598,7 +598,7 @@ private:
ErrorOr<FlatPtr> read_impl(int fd, Userspace<u8*> buffer, size_t size);
public:
- NonnullRefPtr<ProcessProcFSTraits> procfs_traits() const { return *m_procfs_traits; }
+ NonnullLockRefPtr<ProcessProcFSTraits> procfs_traits() const { return *m_procfs_traits; }
ErrorOr<void> procfs_get_fds_stats(KBufferBuilder& builder) const;
ErrorOr<void> procfs_get_perf_events(KBufferBuilder& builder) const;
ErrorOr<void> procfs_get_unveil_stats(KBufferBuilder& builder) const;
@@ -610,11 +610,11 @@ public:
mode_t binary_link_required_mode() const;
ErrorOr<void> procfs_get_thread_stack(ThreadID thread_id, KBufferBuilder& builder) const;
ErrorOr<void> traverse_stacks_directory(FileSystemID, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)> callback) const;
- ErrorOr<NonnullRefPtr<Inode>> lookup_stacks_directory(ProcFS const&, StringView name) const;
+ ErrorOr<NonnullLockRefPtr<Inode>> lookup_stacks_directory(ProcFS const&, StringView name) const;
ErrorOr<size_t> procfs_get_file_description_link(unsigned fd, KBufferBuilder& builder) const;
ErrorOr<void> traverse_file_descriptions_directory(FileSystemID, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)> callback) const;
- ErrorOr<NonnullRefPtr<Inode>> lookup_file_descriptions_directory(ProcFS const&, StringView name) const;
- ErrorOr<NonnullRefPtr<Inode>> lookup_children_directory(ProcFS const&, StringView name) const;
+ ErrorOr<NonnullLockRefPtr<Inode>> lookup_file_descriptions_directory(ProcFS const&, StringView name) const;
+ ErrorOr<NonnullLockRefPtr<Inode>> lookup_children_directory(ProcFS const&, StringView name) const;
ErrorOr<void> traverse_children_directory(FileSystemID, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)> callback) const;
ErrorOr<size_t> procfs_get_child_proccess_link(ProcessID child_pid, KBufferBuilder& builder) const;
@@ -634,7 +634,7 @@ private:
OwnPtr<Memory::AddressSpace> m_space;
- RefPtr<ProcessGroup> m_pg;
+ LockRefPtr<ProcessGroup> m_pg;
AtomicEdgeAction<u32> 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<OpenFileDescription>&&, u32 flags = 0);
+ void set(NonnullLockRefPtr<OpenFileDescription>&&, u32 flags = 0);
private:
- RefPtr<OpenFileDescription> m_description;
+ LockRefPtr<OpenFileDescription> m_description;
bool m_is_allocated { false };
u32 m_flags { 0 };
};
@@ -720,7 +720,7 @@ public:
m_fds_metadatas.clear();
}
- ErrorOr<NonnullRefPtr<OpenFileDescription>> open_file_description(int fd) const;
+ ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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<NonnullRefPtr<ProcessProcFSTraits>> try_create(Badge<Process>, WeakPtr<Process> process)
+ static ErrorOr<NonnullLockRefPtr<ProcessProcFSTraits>> try_create(Badge<Process>, LockWeakPtr<Process> 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<NonnullRefPtr<Inode>> to_inode(ProcFS const& procfs_instance) const override;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> to_inode(ProcFS const& procfs_instance) const override;
virtual ErrorOr<void> traverse_as_directory(FileSystemID, Function<ErrorOr<void>(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> process)
+ explicit ProcessProcFSTraits(LockWeakPtr<Process> 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<Process> m_process;
+ LockWeakPtr<Process> m_process;
};
MutexProtected<OpenFileDescriptions>& fds() { return m_fds; }
MutexProtected<OpenFileDescriptions> const& fds() const { return m_fds; }
- ErrorOr<NonnullRefPtr<OpenFileDescription>> open_file_description(int fd)
+ ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open_file_description(int fd)
{
return m_fds.with_shared([fd](auto& fds) { return fds.open_file_description(fd); });
}
- ErrorOr<NonnullRefPtr<OpenFileDescription>> open_file_description(int fd) const
+ ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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<bool, AK::MemoryOrder::memory_order_relaxed> m_is_stopped { false };
bool m_should_generate_coredump { false };
- RefPtr<Custody> m_executable;
+ LockRefPtr<Custody> m_executable;
- SpinlockProtected<RefPtr<Custody>> m_current_directory;
+ SpinlockProtected<LockRefPtr<Custody>> m_current_directory;
NonnullOwnPtrVector<KString> m_arguments;
NonnullOwnPtrVector<KString> m_environment;
- RefPtr<TTY> m_tty;
+ LockRefPtr<TTY> m_tty;
- WeakPtr<Memory::Region> m_master_tls_region;
+ LockWeakPtr<Memory::Region> 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<Timer> m_alarm_timer;
+ LockRefPtr<Timer> m_alarm_timer;
SpinlockProtected<UnveilData> m_unveil_data;
@@ -860,9 +860,9 @@ private:
};
SpinlockProtected<Array<CoredumpProperty, 4>> m_coredump_properties { LockRank::None };
- NonnullRefPtrVector<Thread> m_threads_for_coredump;
+ NonnullLockRefPtrVector<Thread> m_threads_for_coredump;
- mutable RefPtr<ProcessProcFSTraits> m_procfs_traits;
+ mutable LockRefPtr<ProcessProcFSTraits> 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<size_t> ProcFSExposedLink::read_bytes(off_t offset, size_t count, UserOr
return nread;
}
-ErrorOr<NonnullRefPtr<Inode>> ProcFSExposedLink::to_inode(ProcFS const& procfs_instance) const
+ErrorOr<NonnullLockRefPtr<Inode>> ProcFSExposedLink::to_inode(ProcFS const& procfs_instance) const
{
return TRY(ProcFSLinkInode::try_create(procfs_instance, *this));
}
-ErrorOr<NonnullRefPtr<Inode>> ProcFSExposedComponent::to_inode(ProcFS const& procfs_instance) const
+ErrorOr<NonnullLockRefPtr<Inode>> ProcFSExposedComponent::to_inode(ProcFS const& procfs_instance) const
{
return TRY(ProcFSGlobalInode::try_create(procfs_instance, *this));
}
-ErrorOr<NonnullRefPtr<Inode>> ProcFSExposedDirectory::to_inode(ProcFS const& procfs_instance) const
+ErrorOr<NonnullLockRefPtr<Inode>> 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<NonnullRefPtr<ProcFSExposedComponent>> ProcFSExposedDirectory::lookup(StringView name)
+ErrorOr<NonnullLockRefPtr<ProcFSExposedComponent>> 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 <AK/AtomicRefCounted.h>
#include <AK/Error.h>
#include <AK/Function.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/FileSystem/File.h>
#include <Kernel/FileSystem/FileSystem.h>
#include <Kernel/FileSystem/OpenFileDescription.h>
#include <Kernel/KBufferBuilder.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Time/TimeManagement.h>
#include <Kernel/UserOrKernelBuffer.h>
@@ -63,7 +63,7 @@ public:
private:
Mutex m_lock;
- NonnullRefPtr<ProcFSRootDirectory> m_root_directory;
+ NonnullLockRefPtr<ProcFSRootDirectory> m_root_directory;
};
class ProcFSExposedComponent : public AtomicRefCounted<ProcFSExposedComponent> {
@@ -71,7 +71,7 @@ public:
StringView name() const { return m_name->view(); }
virtual ErrorOr<size_t> read_bytes(off_t, size_t, UserOrKernelBuffer&, OpenFileDescription*) const { VERIFY_NOT_REACHED(); }
virtual ErrorOr<void> traverse_as_directory(FileSystemID, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const { VERIFY_NOT_REACHED(); }
- virtual ErrorOr<NonnullRefPtr<ProcFSExposedComponent>> lookup(StringView) { VERIFY_NOT_REACHED(); };
+ virtual ErrorOr<NonnullLockRefPtr<ProcFSExposedComponent>> lookup(StringView) { VERIFY_NOT_REACHED(); };
virtual ErrorOr<size_t> write_bytes(off_t, size_t, UserOrKernelBuffer const&, OpenFileDescription*) { return EROFS; }
virtual ErrorOr<void> truncate(u64) { return EPERM; }
virtual ErrorOr<void> set_mtime(time_t) { return ENOTIMPL; }
@@ -87,7 +87,7 @@ public:
return {};
}
- virtual ErrorOr<NonnullRefPtr<Inode>> to_inode(ProcFS const& procfs_instance) const;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> 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<ProcFSExposedDirectory> {
+ , public LockWeakable<ProcFSExposedDirectory> {
friend class ProcFSComponentRegistry;
public:
virtual ErrorOr<void> traverse_as_directory(FileSystemID, Function<ErrorOr<void>(FileSystem::DirectoryEntryView const&)>) const override;
- virtual ErrorOr<NonnullRefPtr<ProcFSExposedComponent>> lookup(StringView name) override;
+ virtual ErrorOr<NonnullLockRefPtr<ProcFSExposedComponent>> 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<NonnullRefPtr<Inode>> to_inode(ProcFS const& procfs_instance) const override final;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> to_inode(ProcFS const& procfs_instance) const override final;
protected:
explicit ProcFSExposedDirectory(StringView name);
ProcFSExposedDirectory(StringView name, ProcFSExposedDirectory const& parent_directory);
- NonnullRefPtrVector<ProcFSExposedComponent> m_components;
- WeakPtr<ProcFSExposedDirectory> m_parent_directory;
+ NonnullLockRefPtrVector<ProcFSExposedComponent> m_components;
+ LockWeakPtr<ProcFSExposedDirectory> m_parent_directory;
};
class ProcFSExposedLink : public ProcFSExposedComponent {
public:
- virtual ErrorOr<NonnullRefPtr<Inode>> to_inode(ProcFS const& procfs_instance) const override final;
+ virtual ErrorOr<NonnullLockRefPtr<Inode>> to_inode(ProcFS const& procfs_instance) const override final;
virtual ErrorOr<size_t> 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<NonnullRefPtr<ProcFSExposedComponent>> lookup(StringView name) override;
- static NonnullRefPtr<ProcFSRootDirectory> must_create();
+ virtual ErrorOr<NonnullLockRefPtr<ProcFSExposedComponent>> lookup(StringView name) override;
+ static NonnullLockRefPtr<ProcFSRootDirectory> 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<NonnullRefPtr<ProcessGroup>> ProcessGroup::try_create(ProcessGroupID pgid)
+ErrorOr<NonnullLockRefPtr<ProcessGroup>> 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<NonnullRefPtr<ProcessGroup>> ProcessGroup::try_find_or_create(ProcessGroupID pgid)
+ErrorOr<NonnullLockRefPtr<ProcessGroup>> ProcessGroup::try_find_or_create(ProcessGroupID pgid)
{
- return process_groups().with([&](auto& groups) -> ErrorOr<NonnullRefPtr<ProcessGroup>> {
+ return process_groups().with([&](auto& groups) -> ErrorOr<NonnullLockRefPtr<ProcessGroup>> {
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> ProcessGroup::from_pgid(ProcessGroupID pgid)
+LockRefPtr<ProcessGroup> ProcessGroup::from_pgid(ProcessGroupID pgid)
{
- return process_groups().with([&](auto& groups) -> RefPtr<ProcessGroup> {
+ return process_groups().with([&](auto& groups) -> LockRefPtr<ProcessGroup> {
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 <AK/AtomicRefCounted.h>
#include <AK/IntrusiveList.h>
-#include <AK/Weakable.h>
+#include <Kernel/Library/LockWeakable.h>
#include <Kernel/Locking/SpinlockProtected.h>
#include <Kernel/UnixTypes.h>
@@ -16,7 +16,7 @@ namespace Kernel {
class ProcessGroup
: public AtomicRefCounted<ProcessGroup>
- , public Weakable<ProcessGroup> {
+ , public LockWeakable<ProcessGroup> {
AK_MAKE_NONMOVABLE(ProcessGroup);
AK_MAKE_NONCOPYABLE(ProcessGroup);
@@ -24,9 +24,9 @@ class ProcessGroup
public:
~ProcessGroup();
- static ErrorOr<NonnullRefPtr<ProcessGroup>> try_create(ProcessGroupID);
- static ErrorOr<NonnullRefPtr<ProcessGroup>> try_find_or_create(ProcessGroupID);
- static RefPtr<ProcessGroup> from_pgid(ProcessGroupID);
+ static ErrorOr<NonnullLockRefPtr<ProcessGroup>> try_create(ProcessGroupID);
+ static ErrorOr<NonnullLockRefPtr<ProcessGroup>> try_find_or_create(ProcessGroupID);
+ static LockRefPtr<ProcessGroup> 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<NonnullRefPtr<Inode>> Process::ProcessProcFSTraits::to_inode(ProcFS const& procfs_instance) const
+ErrorOr<NonnullLockRefPtr<Inode>> 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<void> Process::traverse_stacks_directory(FileSystemID fsid, Function<Err
});
}
-ErrorOr<NonnullRefPtr<Inode>> Process::lookup_stacks_directory(ProcFS const& procfs, StringView name) const
+ErrorOr<NonnullLockRefPtr<Inode>> 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<NonnullRefPtr<ProcFSProcessPropertyInode>> thread_stack_inode { ENOENT };
+ ErrorOr<NonnullLockRefPtr<ProcFSProcessPropertyInode>> thread_stack_inode { ENOENT };
for_each_thread([&](Thread const& thread) {
int tid = thread.tid().value();
VERIFY(!(tid < 0));
@@ -96,7 +96,7 @@ ErrorOr<void> Process::traverse_children_directory(FileSystemID fsid, Function<E
});
}
-ErrorOr<NonnullRefPtr<Inode>> Process::lookup_children_directory(ProcFS const& procfs, StringView name) const
+ErrorOr<NonnullLockRefPtr<Inode>> 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<void> Process::traverse_file_descriptions_directory(FileSystemID fsid, F
return {};
}
-ErrorOr<NonnullRefPtr<Inode>> Process::lookup_file_descriptions_directory(ProcFS const& procfs, StringView name) const
+ErrorOr<NonnullLockRefPtr<Inode>> 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<void> Process::procfs_get_fds_stats(KBufferBuilder& builder) const
return {};
}
bool cloexec = file_description_metadata.flags() & FD_CLOEXEC;
- RefPtr<OpenFileDescription> description = file_description_metadata.description();
+ LockRefPtr<OpenFileDescription> 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<Thread> idle_thread;
+ LockRefPtr<Thread> 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 <AK/Atomic.h>
#include <AK/BuiltinWrappers.h>
#include <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Bus/PCI/API.h>
#include <Kernel/CommandLine.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Memory/MemoryManager.h>
#include <Kernel/Storage/ATA/AHCI/Controller.h>
#include <Kernel/Storage/ATA/AHCI/InterruptHandler.h>
namespace Kernel {
-UNMAP_AFTER_INIT NonnullRefPtr<AHCIController> AHCIController::initialize(PCI::DeviceIdentifier const& pci_device_identifier)
+UNMAP_AFTER_INIT NonnullLockRefPtr<AHCIController> 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<StorageDevice> AHCIController::device_by_port(u32 port_index) const
+LockRefPtr<StorageDevice> 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<StorageDevice> AHCIController::device_by_port(u32 port_index) const
return port->connected_device();
}
-RefPtr<StorageDevice> AHCIController::device(u32 index) const
+LockRefPtr<StorageDevice> AHCIController::device(u32 index) const
{
- NonnullRefPtrVector<StorageDevice> connected_devices;
+ NonnullLockRefPtrVector<StorageDevice> 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 <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Sections.h>
#include <Kernel/Storage/ATA/AHCI/Definitions.h>
#include <Kernel/Storage/ATA/ATAController.h>
@@ -24,10 +24,10 @@ class AHCIController final : public ATAController
friend class AHCIInterruptHandler;
public:
- static NonnullRefPtr<AHCIController> initialize(PCI::DeviceIdentifier const& pci_device_identifier);
+ static NonnullLockRefPtr<AHCIController> initialize(PCI::DeviceIdentifier const& pci_device_identifier);
virtual ~AHCIController() override;
- virtual RefPtr<StorageDevice> device(u32 index) const override;
+ virtual LockRefPtr<StorageDevice> 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<StorageDevice> device_by_port(u32 index) const;
+ LockRefPtr<StorageDevice> device_by_port(u32 index) const;
volatile AHCI::PortRegisters& port(size_t port_number) const;
NonnullOwnPtr<Memory::Region> default_hba_region() const;
volatile AHCI::HBA& hba() const;
- Array<RefPtr<AHCIPort>, 32> m_ports;
+ Array<LockRefPtr<AHCIPort>, 32> m_ports;
NonnullOwnPtr<Memory::Region> 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 <AK/RefPtr.h>
#include <Kernel/Arch/x86/IO.h>
#include <Kernel/Devices/Device.h>
#include <Kernel/Interrupts/IRQHandler.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Locking/Mutex.h>
#include <Kernel/Memory/PhysicalPage.h>
#include <Kernel/PhysicalAddress.h>
@@ -53,7 +53,7 @@ private:
AHCI::MaskedBitField create_pending_ports_interrupts_bitfield() const;
// Data members
- NonnullRefPtr<AHCIController> m_parent_controller;
+ NonnullLockRefPtr<AHCIController> 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<NonnullRefPtr<AHCIPort>> AHCIPort::create(AHCIController const& controller, AHCI::HBADefinedCapabilities hba_capabilities, volatile AHCI::PortRegisters& registers, u32 port_index)
+UNMAP_AFTER_INIT ErrorOr<NonnullLockRefPtr<AHCIPort>> 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<void> AHCIPort::allocate_resources_and_initialize_ports()
return {};
}
-UNMAP_AFTER_INIT AHCIPort::AHCIPort(AHCIController const& controller, NonnullRefPtr<Memory::PhysicalPage> identify_buffer_page, AHCI::HBADefinedCapabilities hba_capabilities, volatile AHCI::PortRegisters& registers, u32 port_index)
+UNMAP_AFTER_INIT AHCIPort::AHCIPort(AHCIController const& controller, NonnullLockRefPtr<Memory::PhysicalPage> 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<AHCIController> controller = m_parent_controller.strong_ref();
+ LockRefPtr<AHCIController> 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<AHCIController> controller = m_parent_controller.strong_ref();
+ LockRefPtr<AHCIController> 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<AsyncDeviceRequest::RequestResult> AHCIPort::prepare_and_set_scatter_li
VERIFY(m_lock.is_locked());
VERIFY(request.block_count() > 0);
- NonnullRefPtrVector<Memory::PhysicalPage> allocated_dma_regions;
+ NonnullLockRefPtrVector<Memory::PhysicalPage> 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<AHCIController> controller = m_parent_controller.strong_ref();
+ LockRefPtr<AHCIController> 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 <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
-#include <AK/WeakPtr.h>
-#include <AK/Weakable.h>
#include <Kernel/Devices/Device.h>
#include <Kernel/Interrupts/IRQHandler.h>
+#include <Kernel/Library/LockRefPtr.h>
+#include <Kernel/Library/LockWeakPtr.h>
+#include <Kernel/Library/LockWeakable.h>
#include <Kernel/Locking/Mutex.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Memory/AnonymousVMObject.h>
@@ -33,18 +33,18 @@ class AsyncBlockDeviceRequest;
class AHCIInterruptHandler;
class AHCIPort
: public AtomicRefCounted<AHCIPort>
- , public Weakable<AHCIPort> {
+ , public LockWeakable<AHCIPort> {
friend class AHCIController;
public:
- static ErrorOr<NonnullRefPtr<AHCIPort>> create(AHCIController const&, AHCI::HBADefinedCapabilities, volatile AHCI::PortRegisters&, u32 port_index);
+ static ErrorOr<NonnullLockRefPtr<AHCIPort>> 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<StorageDevice> connected_device() const { return m_connected_device; }
+ LockRefPtr<StorageDevice> 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<Memory::PhysicalPage> identify_buffer_page, AHCI::HBADefinedCapabilities, volatile AHCI::PortRegisters&, u32 port_index);
+ AHCIPort(AHCIController const&, NonnullLockRefPtr<Memory::PhysicalPage> 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<AsyncBlockDeviceRequest> m_current_request;
+ LockRefPtr<AsyncBlockDeviceRequest> m_current_request;
Spinlock m_hard_lock { LockRank::None };
Mutex m_lock { "AHCIPort"sv };
mutable bool m_wait_for_completion { false };
- NonnullRefPtrVector<Memory::PhysicalPage> m_dma_buffers;
- NonnullRefPtrVector<Memory::PhysicalPage> m_command_table_pages;
- RefPtr<Memory::PhysicalPage> m_command_list_page;
+ NonnullLockRefPtrVector<Memory::PhysicalPage> m_dma_buffers;
+ NonnullLockRefPtrVector<Memory::PhysicalPage> m_command_table_pages;
+ LockRefPtr<Memory::PhysicalPage> m_command_list_page;
OwnPtr<Memory::Region> m_command_list_region;
- RefPtr<Memory::PhysicalPage> m_fis_receive_page;
- RefPtr<ATADevice> m_connected_device;
+ LockRefPtr<Memory::PhysicalPage> m_fis_receive_page;
+ LockRefPtr<ATADevice> 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<Memory::PhysicalPage> m_identify_buffer_page;
+ NonnullLockRefPtr<Memory::PhysicalPage> m_identify_buffer_page;
volatile AHCI::PortRegisters& m_port_registers;
- WeakPtr<AHCIController> m_parent_controller;
+ LockWeakPtr<AHCIController> m_parent_controller;
AHCI::PortInterruptStatusBitField m_interrupt_status;
AHCI::PortInterruptEnableBitField m_interrupt_enable;
- RefPtr<Memory::ScatterGatherList> m_current_scatter_list;
+ LockRefPtr<Memory::ScatterGatherList> 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 <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Devices/BlockDevice.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Storage/StorageController.h>
namespace Kernel {
@@ -19,7 +19,7 @@ class AsyncBlockDeviceRequest;
class ATADevice;
class ATAController
: public StorageController
- , public Weakable<ATAController> {
+ , public LockWeakable<ATAController> {
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<KString>);
- WeakPtr<ATAController> m_controller;
+ LockWeakPtr<ATAController> 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> ATADiskDevice::create(ATAController const& controller, ATADevice::Address ata_address, u16 capabilities, u16 logical_sector_size, u64 max_addressable_block)
+NonnullLockRefPtr<ATADiskDevice> 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<ATADiskDevice> create(ATAController const&, ATADevice::Address, u16 capabilities, u16 logical_sector_size, u64 max_addressable_block);
+ static NonnullLockRefPtr<ATADiskDevice> 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<ATAPort> m_port;
+ LockRefPtr<ATAPort> m_port;
};
class ATAPortInterruptCleaner {
@@ -42,7 +42,7 @@ public:
};
private:
- RefPtr<ATAPort> m_port;
+ LockRefPtr<ATAPort> m_port;
};
void ATAPort::fix_name_string_in_identify_device_block()
@@ -99,7 +99,7 @@ ErrorOr<void> ATAPort::detect_connected_devices()
return {};
}
-RefPtr<StorageDevice> ATAPort::connected_device(size_t device_index) const
+LockRefPtr<StorageDevice> 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<ATAPort>
- , public Weakable<ATAPort> {
+ , public LockWeakable<ATAPort> {
friend class ATAPortInterruptDisabler;
friend class ATAPortInterruptCleaner;
@@ -50,7 +50,7 @@ public:
};
public:
- RefPtr<StorageDevice> connected_device(size_t device_index) const;
+ LockRefPtr<StorageDevice> connected_device(size_t device_index) const;
virtual ~ATAPort() = default;
@@ -139,18 +139,18 @@ protected:
EntropySource m_entropy_source;
- RefPtr<AsyncBlockDeviceRequest> m_current_request;
+ LockRefPtr<AsyncBlockDeviceRequest> m_current_request;
u64 m_current_request_block_index { 0 };
bool m_current_request_flushing_cache { false };
OwnPtr<Memory::Region> m_prdt_region;
OwnPtr<Memory::Region> m_dma_buffer_region;
- RefPtr<Memory::PhysicalPage> m_prdt_page;
- RefPtr<Memory::PhysicalPage> m_dma_buffer_page;
+ LockRefPtr<Memory::PhysicalPage> m_prdt_page;
+ LockRefPtr<Memory::PhysicalPage> m_dma_buffer_page;
const u8 m_port_index;
- NonnullRefPtrVector<ATADevice> m_ata_devices;
+ NonnullLockRefPtrVector<ATADevice> m_ata_devices;
NonnullOwnPtr<KBuffer> m_ata_identify_data_buffer;
- NonnullRefPtr<ATAController> m_parent_ata_controller;
+ NonnullLockRefPtr<ATAController> 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> IDEChannel::create(IDEController const& controller, IOAddressGroup io_group, ChannelType type)
+UNMAP_AFTER_INIT NonnullLockRefPtr<IDEChannel> 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> IDEChannel::create(IDEController const& controller, u8 irq, IOAddressGroup io_group, ChannelType type)
+UNMAP_AFTER_INIT NonnullLockRefPtr<IDEChannel> 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 <AK/Error.h>
-#include <AK/RefPtr.h>
#include <Kernel/Arch/x86/IO.h>
#include <Kernel/Devices/Device.h>
#include <Kernel/Interrupts/IRQHandler.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Locking/Mutex.h>
#include <Kernel/Memory/PhysicalPage.h>
#include <Kernel/PhysicalAddress.h>
@@ -103,8 +103,8 @@ public:
};
public:
- static NonnullRefPtr<IDEChannel> create(IDEController const&, IOAddressGroup, ChannelType type);
- static NonnullRefPtr<IDEChannel> create(IDEController const&, u8 irq, IOAddressGroup, ChannelType type);
+ static NonnullLockRefPtr<IDEChannel> create(IDEController const&, IOAddressGroup, ChannelType type);
+ static NonnullLockRefPtr<IDEChannel> 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 <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Bus/PCI/API.h>
#include <Kernel/FileSystem/ProcFS.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Sections.h>
#include <Kernel/Storage/ATA/ATADiskDevice.h>
#include <Kernel/Storage/ATA/GenericIDE/Channel.h>
@@ -16,9 +16,9 @@
namespace Kernel {
-UNMAP_AFTER_INIT NonnullRefPtr<IDEController> IDEController::initialize()
+UNMAP_AFTER_INIT NonnullLockRefPtr<IDEController> 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<StorageDevice> IDEController::device_by_channel_and_position(u32 index) const
+LockRefPtr<StorageDevice> IDEController::device_by_channel_and_position(u32 index) const
{
switch (index) {
case 0:
@@ -85,9 +85,9 @@ RefPtr<StorageDevice> IDEController::device_by_channel_and_position(u32 index) c
VERIFY_NOT_REACHED();
}
-RefPtr<StorageDevice> IDEController::device(u32 index) const
+LockRefPtr<StorageDevice> IDEController::device(u32 index) const
{
- NonnullRefPtrVector<StorageDevice> connected_devices;
+ NonnullLockRefPtrVector<StorageDevice> 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 <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Storage/ATA/ATAController.h>
#include <Kernel/Storage/StorageDevice.h>
@@ -18,10 +18,10 @@ class AsyncBlockDeviceRequest;
class IDEChannel;
class IDEController : public ATAController {
public:
- static NonnullRefPtr<IDEController> initialize();
+ static NonnullLockRefPtr<IDEController> initialize();
virtual ~IDEController() override;
- virtual RefPtr<StorageDevice> device(u32 index) const override final;
+ virtual LockRefPtr<StorageDevice> 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<StorageDevice> device_by_channel_and_position(u32 index) const;
- NonnullRefPtrVector<IDEChannel> m_channels;
+ LockRefPtr<StorageDevice> device_by_channel_and_position(u32 index) const;
+ NonnullLockRefPtrVector<IDEChannel> 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 <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Bus/PCI/API.h>
#include <Kernel/FileSystem/ProcFS.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Sections.h>
#include <Kernel/Storage/ATA/ATADiskDevice.h>
#include <Kernel/Storage/ATA/GenericIDE/Channel.h>
@@ -16,9 +16,9 @@
namespace Kernel {
-UNMAP_AFTER_INIT NonnullRefPtr<ISAIDEController> ISAIDEController::initialize()
+UNMAP_AFTER_INIT NonnullLockRefPtr<ISAIDEController> 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 <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Storage/ATA/GenericIDE/Controller.h>
#include <Kernel/Storage/StorageDevice.h>
@@ -18,12 +18,12 @@ class AsyncBlockDeviceRequest;
class ISAIDEController final : public IDEController {
public:
- static NonnullRefPtr<ISAIDEController> initialize();
+ static NonnullLockRefPtr<ISAIDEController> initialize();
private:
ISAIDEController();
- RefPtr<StorageDevice> device_by_channel_and_position(u32 index) const;
+ LockRefPtr<StorageDevice> 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 <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Bus/PCI/API.h>
#include <Kernel/FileSystem/ProcFS.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Sections.h>
#include <Kernel/Storage/ATA/ATADiskDevice.h>
#include <Kernel/Storage/ATA/GenericIDE/Channel.h>
@@ -16,9 +16,9 @@
namespace Kernel {
-UNMAP_AFTER_INIT NonnullRefPtr<PCIIDEController> PCIIDEController::initialize(PCI::DeviceIdentifier const& device_identifier, bool force_pio)
+UNMAP_AFTER_INIT NonnullLockRefPtr<PCIIDEController> 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 <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Storage/ATA/GenericIDE/Controller.h>
#include <Kernel/Storage/StorageDevice.h>
@@ -19,7 +19,7 @@ class AsyncBlockDeviceRequest;
class PCIIDEController final : public IDEController
, public PCI::Device {
public:
- static NonnullRefPtr<PCIIDEController> initialize(PCI::DeviceIdentifier const&, bool force_pio);
+ static NonnullLockRefPtr<PCIIDEController> 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<StorageDevice> device_by_channel_and_position(u32 index) const;
+ LockRefPtr<StorageDevice> 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> DiskPartition::create(BlockDevice& device, MinorNumber minor_number, Partition::DiskPartitionMetadata metadata)
+NonnullLockRefPtr<DiskPartition> DiskPartition::create(BlockDevice& device, MinorNumber minor_number, Partition::DiskPartitionMetadata metadata)
{
auto partition_or_error = DeviceManagement::try_create_device<DiskPartition>(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 <AK/RefPtr.h>
-#include <AK/WeakPtr.h>
#include <Kernel/Devices/BlockDevice.h>
+#include <Kernel/Library/LockRefPtr.h>
+#include <Kernel/Library/LockWeakPtr.h>
#include <LibPartition/DiskPartitionMetadata.h>
namespace Kernel {
@@ -17,7 +17,7 @@ class DiskPartition final : public BlockDevice {
friend class DeviceManagement;
public:
- static NonnullRefPtr<DiskPartition> create(BlockDevice&, MinorNumber, Partition::DiskPartitionMetadata);
+ static NonnullLockRefPtr<DiskPartition> 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<BlockDevice> m_device;
+ LockWeakPtr<BlockDevice> 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 <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Arch/SafeMem.h>
#include <Kernel/Arch/x86/IO.h>
@@ -16,14 +15,15 @@
#include <Kernel/CommandLine.h>
#include <Kernel/Devices/Device.h>
#include <Kernel/FileSystem/ProcFS.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Sections.h>
namespace Kernel {
Atomic<u8> NVMeController::s_controller_id {};
-UNMAP_AFTER_INIT ErrorOr<NonnullRefPtr<NVMeController>> NVMeController::try_initialize(Kernel::PCI::DeviceIdentifier const& device_identifier, bool is_queue_polled)
+UNMAP_AFTER_INIT ErrorOr<NonnullLockRefPtr<NVMeController>> 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<void> 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<volatile ControllerRegister>(PhysicalAddress(m_bar)));
+ m_controller_regs = TRY(Memory::map_typed_writable<ControllerRegister volatile>(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<void> NVMeController::identify_and_init_namespaces()
{
- RefPtr<Memory::PhysicalPage> prp_dma_buffer;
+ LockRefPtr<Memory::PhysicalPage> prp_dma_buffer;
OwnPtr<Memory::Region> 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<u64, u8> NVMeController::get_ns_features(IdentifyNamespac
return Tuple<u64, u8>(namespace_size, lba_size);
}
-RefPtr<StorageDevice> NVMeController::device(u32 index) const
+LockRefPtr<StorageDevice> NVMeController::device(u32 index) const
{
return m_namespaces.at(index);
}
@@ -259,9 +259,9 @@ UNMAP_AFTER_INIT ErrorOr<void> NVMeController::create_admin_queue(Optional<u8> i
{
auto qdepth = get_admin_q_dept();
OwnPtr<Memory::Region> cq_dma_region;
- NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_pages;
+ NonnullLockRefPtrVector<Memory::PhysicalPage> cq_dma_pages;
OwnPtr<Memory::Region> sq_dma_region;
- NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_pages;
+ NonnullLockRefPtrVector<Memory::PhysicalPage> 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<void> NVMeController::create_admin_queue(Optional<u8> 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<volatile DoorbellRegister>(PhysicalAddress(m_bar + REG_SQ0TDBL_START)));
+ auto doorbell_regs = TRY(Memory::map_typed_writable<DoorbellRegister volatile>(PhysicalAddress(m_bar + REG_SQ0TDBL_START)));
m_controller_regs->acq = reinterpret_cast<u64>(AK::convert_between_host_and_little_endian(cq_dma_pages.first().paddr().as_ptr()));
m_controller_regs->asq = reinterpret_cast<u64>(AK::convert_between_host_and_little_endian(sq_dma_pages.first().paddr().as_ptr()));
@@ -300,9 +300,9 @@ UNMAP_AFTER_INIT ErrorOr<void> NVMeController::create_admin_queue(Optional<u8> i
UNMAP_AFTER_INIT ErrorOr<void> NVMeController::create_io_queue(u8 qid, Optional<u8> irq)
{
OwnPtr<Memory::Region> cq_dma_region;
- NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_pages;
+ NonnullLockRefPtrVector<Memory::PhysicalPage> cq_dma_pages;
OwnPtr<Memory::Region> sq_dma_region;
- NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_pages;
+ NonnullLockRefPtrVector<Memory::PhysicalPage> 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<void> 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<volatile DoorbellRegister>(PhysicalAddress(m_bar + queue_doorbell_offset)));
+ auto doorbell_regs = TRY(Memory::map_typed_writable<DoorbellRegister volatile>(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 <AK/NonnullRefPtr.h>
-#include <AK/NonnullRefPtrVector.h>
#include <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Time.h>
#include <AK/Tuple.h>
#include <AK/Types.h>
#include <Kernel/Bus/PCI/Device.h>
+#include <Kernel/Library/LockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Memory/TypedMapping.h>
#include <Kernel/Storage/NVMe/NVMeDefinitions.h>
@@ -26,10 +26,10 @@ namespace Kernel {
class NVMeController : public PCI::Device
, public StorageController {
public:
- static ErrorOr<NonnullRefPtr<NVMeController>> try_initialize(PCI::DeviceIdentifier const&, bool is_queue_polled);
+ static ErrorOr<NonnullLockRefPtr<NVMeController>> try_initialize(PCI::DeviceIdentifier const&, bool is_queue_polled);
ErrorOr<void> initialize(bool is_queue_polled);
explicit NVMeController(PCI::DeviceIdentifier const&);
- RefPtr<StorageDevice> device(u32 index) const override;
+ LockRefPtr<StorageDevice> 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<NVMeQueue> m_admin_queue;
- NonnullRefPtrVector<NVMeQueue> m_queues;
- NonnullRefPtrVector<NVMeNameSpace> m_namespaces;
- Memory::TypedMapping<volatile ControllerRegister> m_controller_regs;
+ LockRefPtr<NVMeQueue> m_admin_queue;
+ NonnullLockRefPtrVector<NVMeQueue> m_queues;
+ NonnullLockRefPtrVector<NVMeNameSpace> m_namespaces;
+ Memory::TypedMapping<ControllerRegister volatile> 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<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u8 irq, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> db_regs)
+UNMAP_AFTER_INIT NVMeInterruptQueue::NVMeInterruptQueue(NonnullOwnPtr<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u8 irq, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> 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<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u8 irq, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> db_regs);
+ NVMeInterruptQueue(NonnullOwnPtr<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u8 irq, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> 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<NonnullRefPtr<NVMeNameSpace>> NVMeNameSpace::try_create(NVMeController const& controller, NonnullRefPtrVector<NVMeQueue> queues, u8 controller_id, u16 nsid, size_t storage_size, size_t lba_size)
+UNMAP_AFTER_INIT ErrorOr<NonnullLockRefPtr<NVMeNameSpace>> NVMeNameSpace::try_create(NVMeController const& controller, NonnullLockRefPtrVector<NVMeQueue> 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<NonnullRefPtr<NVMeNameSpace>> NVMeNameSpace::try_create
return device;
}
-UNMAP_AFTER_INIT NVMeNameSpace::NVMeNameSpace(LUNAddress logical_unit_number_address, NonnullRefPtrVector<NVMeQueue> queues, size_t max_addresable_block, size_t lba_size, size_t major_number, size_t minor_number, u16 nsid, NonnullOwnPtr<KString> dev_name)
+UNMAP_AFTER_INIT NVMeNameSpace::NVMeNameSpace(LUNAddress logical_unit_number_address, NonnullLockRefPtrVector<NVMeQueue> queues, size_t max_addresable_block, size_t lba_size, size_t major_number, size_t minor_number, u16 nsid, NonnullOwnPtr<KString> 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 <AK/NonnullRefPtr.h>
-#include <AK/NonnullRefPtrVector.h>
#include <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
+#include <Kernel/Library/LockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Storage/NVMe/NVMeDefinitions.h>
#include <Kernel/Storage/NVMe/NVMeQueue.h>
@@ -24,16 +24,16 @@ class NVMeNameSpace : public StorageDevice {
friend class DeviceManagement;
public:
- static ErrorOr<NonnullRefPtr<NVMeNameSpace>> try_create(NVMeController const&, NonnullRefPtrVector<NVMeQueue> queues, u8 controller_id, u16 nsid, size_t storage_size, size_t lba_size);
+ static ErrorOr<NonnullLockRefPtr<NVMeNameSpace>> try_create(NVMeController const&, NonnullLockRefPtrVector<NVMeQueue> 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<NVMeQueue> queues, size_t storage_size, size_t lba_size, size_t major_number, size_t minor_number, u16 nsid, NonnullOwnPtr<KString> early_device_name);
+ NVMeNameSpace(LUNAddress, NonnullLockRefPtrVector<NVMeQueue> queues, size_t storage_size, size_t lba_size, size_t major_number, size_t minor_number, u16 nsid, NonnullOwnPtr<KString> early_device_name);
u16 m_nsid;
- NonnullRefPtrVector<NVMeQueue> m_queues;
+ NonnullLockRefPtrVector<NVMeQueue> 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<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> db_regs)
+UNMAP_AFTER_INIT NVMePollQueue::NVMePollQueue(NonnullOwnPtr<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> 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<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> db_regs);
+ NVMePollQueue(NonnullOwnPtr<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> 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 <Kernel/Storage/NVMe/NVMePollQueue.h>
namespace Kernel {
-ErrorOr<NonnullRefPtr<NVMeQueue>> NVMeQueue::try_create(u16 qid, Optional<u8> irq, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> db_regs)
+ErrorOr<NonnullLockRefPtr<NVMeQueue>> NVMeQueue::try_create(u16 qid, Optional<u8> irq, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> 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<Memory::PhysicalPage> rw_dma_page;
+ LockRefPtr<Memory::PhysicalPage> 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<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> db_regs)
+UNMAP_AFTER_INIT NVMeQueue::NVMeQueue(NonnullOwnPtr<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<volatile DoorbellRegister> 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 <AK/AtomicRefCounted.h>
-#include <AK/NonnullRefPtr.h>
-#include <AK/NonnullRefPtrVector.h>
#include <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
#include <Kernel/Bus/PCI/Device.h>
#include <Kernel/Interrupts/IRQHandler.h>
+#include <Kernel/Library/LockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Memory/MemoryManager.h>
#include <Kernel/Memory/TypedMapping.h>
@@ -29,7 +29,7 @@ struct DoorbellRegister {
class AsyncBlockDeviceRequest;
class NVMeQueue : public AtomicRefCounted<NVMeQueue> {
public:
- static ErrorOr<NonnullRefPtr<NVMeQueue>> try_create(u16 qid, Optional<u8> irq, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<DoorbellRegister volatile> db_regs);
+ static ErrorOr<NonnullLockRefPtr<NVMeQueue>> try_create(u16 qid, Optional<u8> irq, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<DoorbellRegister volatile> db_regs);
bool is_admin_queue() { return m_admin_queue; };
u16 submit_sync_sqe(NVMeSubmission&);
void read(AsyncBlockDeviceRequest& request, u16 nsid, u64 index, u32 count);
@@ -43,7 +43,7 @@ protected:
{
m_db_regs->sq_tail = m_sq_tail;
}
- NVMeQueue(NonnullOwnPtr<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<DoorbellRegister volatile> db_regs);
+ NVMeQueue(NonnullOwnPtr<Memory::Region> rw_dma_region, Memory::PhysicalPage const& rw_dma_page, u16 qid, u32 q_depth, OwnPtr<Memory::Region> cq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> cq_dma_page, OwnPtr<Memory::Region> sq_dma_region, NonnullLockRefPtrVector<Memory::PhysicalPage> sq_dma_page, Memory::TypedMapping<DoorbellRegister volatile> db_regs);
private:
bool cqe_available();
@@ -56,7 +56,7 @@ private:
protected:
Spinlock m_cq_lock { LockRank::Interrupts };
- RefPtr<AsyncBlockDeviceRequest> m_current_request;
+ LockRefPtr<AsyncBlockDeviceRequest> m_current_request;
NonnullOwnPtr<Memory::Region> 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<Memory::Region> m_cq_dma_region;
- NonnullRefPtrVector<Memory::PhysicalPage> m_cq_dma_page;
+ NonnullLockRefPtrVector<Memory::PhysicalPage> m_cq_dma_page;
Span<NVMeSubmission> m_sqe_array;
OwnPtr<Memory::Region> m_sq_dma_region;
- NonnullRefPtrVector<Memory::PhysicalPage> m_sq_dma_page;
+ NonnullLockRefPtrVector<Memory::PhysicalPage> m_sq_dma_page;
Span<NVMeCompletion> m_cqe_array;
Memory::TypedMapping<DoorbellRegister volatile> m_db_regs;
- NonnullRefPtr<Memory::PhysicalPage> m_rw_dma_page;
+ NonnullLockRefPtr<Memory::PhysicalPage> 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 <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Storage/Ramdisk/Controller.h>
namespace Kernel {
-NonnullRefPtr<RamdiskController> RamdiskController::initialize()
+NonnullLockRefPtr<RamdiskController> 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<StorageDevice> RamdiskController::device(u32 index) const
+LockRefPtr<StorageDevice> 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 <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Types.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Storage/Ramdisk/Device.h>
#include <Kernel/Storage/StorageController.h>
#include <Kernel/Storage/StorageDevice.h>
@@ -19,10 +19,10 @@ class AsyncBlockDeviceRequest;
class RamdiskController final : public StorageController {
public:
- static NonnullRefPtr<RamdiskController> initialize();
+ static NonnullLockRefPtr<RamdiskController> initialize();
virtual ~RamdiskController() override;
- virtual RefPtr<StorageDevice> device(u32 index) const override;
+ virtual LockRefPtr<StorageDevice> 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<RamdiskDevice> m_devices;
+ NonnullLockRefPtrVector<RamdiskDevice> 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> RamdiskDevice::create(RamdiskController const& controller, NonnullOwnPtr<Memory::Region>&& region, int major, int minor)
+NonnullLockRefPtr<RamdiskDevice> RamdiskDevice::create(RamdiskController const& controller, NonnullOwnPtr<Memory::Region>&& 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<RamdiskDevice> create(RamdiskController const&, NonnullOwnPtr<Memory::Region>&& region, int major, int minor);
+ static NonnullLockRefPtr<RamdiskDevice> create(RamdiskController const&, NonnullOwnPtr<Memory::Region>&& 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 <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <Kernel/Bus/PCI/Access.h>
#include <Kernel/Bus/PCI/Device.h>
#include <Kernel/Devices/Device.h>
+#include <Kernel/Library/LockRefPtr.h>
#include <Kernel/Locking/Mutex.h>
#include <Kernel/Memory/PhysicalPage.h>
#include <Kernel/PhysicalAddress.h>
@@ -26,7 +26,7 @@ class StorageController : public AtomicRefCounted<StorageController> {
public:
virtual ~StorageController() = default;
- virtual RefPtr<StorageDevice> device(u32 index) const = 0;
+ virtual LockRefPtr<StorageDevice> 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<DiskPartition> const& partitions() const { return m_partitions; }
+ NonnullLockRefPtrVector<DiskPartition> const& partitions() const { return m_partitions; }
- void add_partition(NonnullRefPtr<DiskPartition> disk_partition) { MUST(m_partitions.try_append(disk_partition)); }
+ void add_partition(NonnullLockRefPtr<DiskPartition> 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<StorageDevice, RefPtr<StorageDevice>> m_list_node;
- NonnullRefPtrVector<DiskPartition> m_partitions;
+ mutable IntrusiveListNode<StorageDevice, LockRefPtr<StorageDevice>> m_list_node;
+ NonnullLockRefPtrVector<DiskPartition> m_partitions;
// FIXME: Remove this method after figuring out another scheme for naming.
NonnullOwnPtr<KString> 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<BlockDevice> StorageManagement::boot_block_device() const
+LockRefPtr<BlockDevice> 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<FileSystem> StorageManagement::root_filesystem() const
+NonnullLockRefPtr<FileSystem> 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 <AK/IntrusiveList.h>
-#include <AK/NonnullRefPtr.h>
-#include <AK/NonnullRefPtrVector.h>
#include <AK/Types.h>
#include <Kernel/FileSystem/FileSystem.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Storage/DiskPartition.h>
#include <Kernel/Storage/StorageController.h>
#include <Kernel/Storage/StorageDevice.h>
@@ -26,7 +26,7 @@ public:
void initialize(StringView boot_argument, bool force_pio, bool nvme_poll);
static StorageManagement& the();
- NonnullRefPtr<FileSystem> root_filesystem() const;
+ NonnullLockRefPtr<FileSystem> root_filesystem() const;
static MajorNumber storage_type_major_number();
static MinorNumber generate_storage_minor_number();
@@ -51,11 +51,11 @@ private:
ErrorOr<NonnullOwnPtr<Partition::PartitionTable>> try_to_initialize_partition_table(StorageDevice const&) const;
- RefPtr<BlockDevice> boot_block_device() const;
+ LockRefPtr<BlockDevice> boot_block_device() const;
StringView m_boot_argument;
- WeakPtr<BlockDevice> m_boot_block_device;
- NonnullRefPtrVector<StorageController> m_controllers;
+ LockWeakPtr<BlockDevice> m_boot_block_device;
+ NonnullLockRefPtrVector<StorageController> 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<FlatPtr> 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<FlatPtr> Process::sys$chdir(Userspace<char const*> 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<Custody> {
+ auto current_directory = m_current_directory.with([](auto& current_directory) -> NonnullLockRefPtr<Custody> {
return *current_directory;
});
- RefPtr<Custody> new_directory = TRY(VirtualFileSystem::the().open_directory(path->view(), *current_directory));
+ LockRefPtr<Custody> 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<FlatPtr> Process::sys$chmod(Userspace<Syscall::SC_chmod_params const*> u
auto params = TRY(copy_typed_from_user(user_params));
auto path = TRY(get_syscall_path_argument(params.path));
- RefPtr<Custody> base;
+ LockRefPtr<Custody> 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 <AK/NonnullRefPtrVector.h>
#include <Kernel/FileSystem/Custody.h>
#include <Kernel/FileSystem/OpenFileDescription.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Process.h>
namespace Kernel {
@@ -27,7 +27,7 @@ ErrorOr<FlatPtr> Process::sys$chown(Userspace<Syscall::SC_chown_params const*> u
auto params = TRY(copy_typed_from_user(user_params));
auto path = TRY(get_syscall_path_argument(params.path));
- RefPtr<Custody> base;
+ LockRefPtr<Custody> 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 <AK/ScopeGuard.h>
#include <AK/TemporaryChange.h>
-#include <AK/WeakPtr.h>
#include <Kernel/Debug.h>
#include <Kernel/FileSystem/Custody.h>
#include <Kernel/FileSystem/OpenFileDescription.h>
+#include <Kernel/Library/LockWeakPtr.h>
#include <Kernel/Memory/AllocationStrategy.h>
#include <Kernel/Memory/MemoryManager.h>
#include <Kernel/Memory/PageDirectory.h>
@@ -36,10 +36,10 @@ struct LoadResult {
FlatPtr load_base { 0 };
FlatPtr entry_eip { 0 };
size_t size { 0 };
- WeakPtr<Memory::Region> tls_region;
+ LockWeakPtr<Memory::Region> tls_region;
size_t tls_size { 0 };
size_t tls_alignment { 0 };
- WeakPtr<Memory::Region> stack_region;
+ LockWeakPtr<Memory::Region> stack_region;
};
static constexpr size_t auxiliary_vector_size = 15;
@@ -410,8 +410,8 @@ static ErrorOr<LoadResult> load_elf_object(NonnullOwnPtr<Memory::AddressSpace> n
}
ErrorOr<LoadResult>
-Process::load(NonnullRefPtr<OpenFileDescription> main_program_description,
- RefPtr<OpenFileDescription> interpreter_description, const ElfW(Ehdr) & main_program_header)
+Process::load(NonnullLockRefPtr<OpenFileDescription> main_program_description,
+ LockRefPtr<OpenFileDescription> 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<void> Process::do_exec(NonnullRefPtr<OpenFileDescription> main_program_description, NonnullOwnPtrVector<KString> arguments, NonnullOwnPtrVector<KString> environment,
- RefPtr<OpenFileDescription> interpreter_description, Thread*& new_main_thread, u32& prev_flags, const ElfW(Ehdr) & main_program_header)
+ErrorOr<void> Process::do_exec(NonnullLockRefPtr<OpenFileDescription> main_program_description, NonnullOwnPtrVector<KString> arguments, NonnullOwnPtrVector<KString> environment,
+ LockRefPtr<OpenFileDescription> 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<NonnullOwnPtrVector<KString>> find_shebang_interpreter_for_execut
return ENOEXEC;
}
-ErrorOr<RefPtr<OpenFileDescription>> 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<LockRefPtr<OpenFileDescription>> 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<FlatPtr> Process::sys$fork(RegisterState& regs)
{
VERIFY_PROCESS_BIG_LOCK_ACQUIRED(this);
TRY(require_promise(Pledge::proc));
- RefPtr<Thread> child_first_thread;
+ LockRefPtr<Thread> 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<SpinlockProtected<HashMap<GlobalFutexKey, NonnullRefPtr<FutexQueue>>>> s_global_futex_queues;
+static Singleton<SpinlockProtected<HashMap<GlobalFutexKey, NonnullLockRefPtr<FutexQueue>>>> s_global_futex_queues;
void Process::clear_futex_queues_on_exec()
{
@@ -122,16 +122,16 @@ ErrorOr<FlatPtr> Process::sys$futex(Userspace<Syscall::SC_futex_params const*> u
}
}
- auto find_futex_queue = [&](GlobalFutexKey futex_key, bool create_if_not_found, bool* did_create = nullptr) -> ErrorOr<RefPtr<FutexQueue>> {
+ auto find_futex_queue = [&](GlobalFutexKey futex_key, bool create_if_not_found, bool* did_create = nullptr) -> ErrorOr<LockRefPtr<FutexQueue>> {
VERIFY(!create_if_not_found || did_create != nullptr);
- return s_global_futex_queues->with([&](auto& queues) -> ErrorOr<RefPtr<FutexQueue>> {
+ return s_global_futex_queues->with([&](auto& queues) -> ErrorOr<LockRefPtr<FutexQueue>> {
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<FlatPtr> Process::sys$futex(Userspace<Syscall::SC_futex_params const*> u
auto do_wait = [&](u32 bitset) -> ErrorOr<FlatPtr> {
bool did_create;
- RefPtr<FutexQueue> futex_queue;
+ LockRefPtr<FutexQueue> 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<FlatPtr> Process::sys$futex(Userspace<Syscall::SC_futex_params const*> u
if (!futex_queue)
return 0;
- RefPtr<FutexQueue> target_futex_queue;
+ LockRefPtr<FutexQueue> 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<FlatPtr> Process::sys$mmap(Userspace<Syscall::SC_mmap_params const*> use
if (map_anonymous) {
auto strategy = map_noreserve ? AllocationStrategy::None : AllocationStrategy::Reserve;
- RefPtr<Memory::AnonymousVMObject> vmobject;
+ LockRefPtr<Memory::AnonymousVMObject> vmobject;
if (flags & MAP_PURGEABLE) {
vmobject = TRY(Memory::AnonymousVMObject::try_create_purgeable_with_size(rounded_size, strategy));
} else {
@@ -459,7 +459,7 @@ ErrorOr<FlatPtr> Process::sys$mremap(Userspace<Syscall::SC_mremap_params const*>
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<Memory::SharedInodeVMObject&>(old_region->vmobject()).inode();
+ NonnullLockRefPtr inode = static_cast<Memory::SharedInodeVMObject&>(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<NonnullRefPtr<FileSystem>> (*create_with_fd)(OpenFileDescription&) = nullptr;
- ErrorOr<NonnullRefPtr<FileSystem>> (*create)(void) = nullptr;
+ ErrorOr<NonnullLockRefPtr<FileSystem>> (*create_with_fd)(OpenFileDescription&) = nullptr;
+ ErrorOr<NonnullLockRefPtr<FileSystem>> (*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<NonnullRefPtr<FileSystem>> create_filesystem_instance(StringView fs_type, OpenFileDescription* possible_description)
+static ErrorOr<NonnullLockRefPtr<FileSystem>> 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<FileSystem> fs = TRY(initializer_entry.create());
+ NonnullLockRefPtr<FileSystem> fs = TRY(initializer_entry.create());
return fs;
}
VERIFY(initializer_entry.create_with_fd);
@@ -60,7 +60,7 @@ static ErrorOr<NonnullRefPtr<FileSystem>> create_filesystem_instance(StringView
dbgln("mount: this is not a seekable file");
return ENODEV;
}
- NonnullRefPtr<FileSystem> fs = TRY(initializer_entry.create_with_fd(description));
+ NonnullLockRefPtr<FileSystem> fs = TRY(initializer_entry.create_with_fd(description));
return fs;
}
return ENODEV;
@@ -107,7 +107,7 @@ ErrorOr<FlatPtr> Process::sys$mount(Userspace<Syscall::SC_mount_params const*> u
return 0;
}
- RefPtr<FileSystem> fs;
+ LockRefPtr<FileSystem> 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<FlatPtr> Process::sys$open(Userspace<Syscall::SC_open_params const*> use
dbgln_if(IO_DEBUG, "sys$open(dirfd={}, path='{}', options={}, mode={})", dirfd, path->view(), options, mode);
auto fd_allocation = TRY(allocate_fd());
- RefPtr<Custody> base;
+ LockRefPtr<Custody> 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<FlatPtr> Process::sys$poll(Userspace<Syscall::SC_poll_params const*> use
TRY(m_fds.with_shared([&](auto& fds) -> ErrorOr<void> {
for (size_t i = 0; i < params.nfds; i++) {
auto& pfd = fds_copy[i];
- RefPtr<OpenFileDescription> description;
+ LockRefPtr<OpenFileDescription> 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 <AK/NonnullRefPtrVector.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Memory/AnonymousVMObject.h>
#include <Kernel/Memory/InodeVMObject.h>
#include <Kernel/Memory/MemoryManager.h>
@@ -20,7 +20,7 @@ ErrorOr<FlatPtr> Process::sys$purge(int mode)
return EPERM;
size_t purged_page_count = 0;
if (mode & PURGE_ALL_VOLATILE) {
- NonnullRefPtrVector<Memory::AnonymousVMObject> vmobjects;
+ NonnullLockRefPtrVector<Memory::AnonymousVMObject> vmobjects;
{
ErrorOr<void> result;
Memory::MemoryManager::for_each_vmobject([&](auto& vmobject) {
@@ -43,7 +43,7 @@ ErrorOr<FlatPtr> Process::sys$purge(int mode)
}
}
if (mode & PURGE_ALL_CLEAN_INODE) {
- NonnullRefPtrVector<Memory::InodeVMObject> vmobjects;
+ NonnullLockRefPtrVector<Memory::InodeVMObject> vmobjects;
{
ErrorOr<void> 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<NonnullRefPtr<OpenFileDescription>> open_readable_file_description(auto& fds, int fd)
+static ErrorOr<NonnullLockRefPtr<OpenFileDescription>> 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<OpenFileDescription> description, int type)
+static void setup_socket_fd(Process::OpenFileDescriptions& fds, int fd, NonnullLockRefPtr<OpenFileDescription> description, int type)
{
description->set_readable(true);
description->set_writable(true);
@@ -92,7 +92,7 @@ ErrorOr<FlatPtr> Process::sys$accept4(Userspace<Syscall::SC_accept4_params const
TRY(copy_from_user(&address_size, static_ptr_cast<socklen_t const*>(user_address_size)));
ScopedDescriptionAllocation fd_allocation;
- RefPtr<OpenFileDescription> accepting_socket_description;
+ LockRefPtr<OpenFileDescription> accepting_socket_description;
TRY(m_fds.with_exclusive([&](auto& fds) -> ErrorOr<void> {
fd_allocation = TRY(fds.allocate());
@@ -103,7 +103,7 @@ ErrorOr<FlatPtr> Process::sys$accept4(Userspace<Syscall::SC_accept4_params const
return ENOTSOCK;
auto& socket = *accepting_socket_description->socket();
- RefPtr<Socket> accepted_socket;
+ LockRefPtr<Socket> 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 <AK/NonnullRefPtrVector.h>
#include <Kernel/FileSystem/Custody.h>
#include <Kernel/FileSystem/VirtualFileSystem.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Process.h>
namespace Kernel {
@@ -29,7 +29,7 @@ ErrorOr<FlatPtr> Process::sys$stat(Userspace<Syscall::SC_stat_params const*> use
auto path = TRY(get_syscall_path_argument(params.path));
- RefPtr<Custody> base;
+ LockRefPtr<Custody> 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<FlatPtr> Process::sys$unlink(int dirfd, Userspace<char const*> user_path
if (flags & ~AT_REMOVEDIR)
return Error::from_errno(EINVAL);
- RefPtr<Custody> base;
+ LockRefPtr<Custody> 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<FlatPtr> Process::sys$unveil(Userspace<Syscall::SC_unveil_params const*>
// 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<Custody> parent_custody; // Parent inode in case of ENOENT
+ LockRefPtr<Custody> parent_custody; // Parent inode in case of ENOENT
OwnPtr<KString> 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<FlatPtr> Process::sys$utimensat(Userspace<Syscall::SC_utimensat_params c
}
OwnPtr<KString> path;
- RefPtr<OpenFileDescription> description;
- RefPtr<Custody> base;
+ LockRefPtr<OpenFileDescription> description;
+ LockRefPtr<Custody> 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<siginfo_t> Process::do_waitid(Variant<Empty, NonnullRefPtr<Process>, NonnullRefPtr<ProcessGroup>> waitee, int options)
+ErrorOr<siginfo_t> Process::do_waitid(Variant<Empty, NonnullLockRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee, int options)
{
ErrorOr<siginfo_t> result = siginfo_t {};
if (Thread::current()->block<Thread::WaitBlocker>({}, options, move(waitee), result).was_interrupted())
@@ -25,7 +25,7 @@ ErrorOr<FlatPtr> Process::sys$waitid(Userspace<Syscall::SC_waitid_params const*>
TRY(require_promise(Pledge::proc));
auto params = TRY(copy_typed_from_user(user_params));
- Variant<Empty, NonnullRefPtr<Process>, NonnullRefPtr<ProcessGroup>> waitee;
+ Variant<Empty, NonnullLockRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> 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 <AK/NonnullRefPtr.h>
-#include <AK/NonnullRefPtrVector.h>
#include <AK/Types.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/TTY/VirtualConsole.h>
namespace Kernel {
@@ -31,13 +31,13 @@ public:
void switch_to_debug() { switch_to(1); }
- NonnullRefPtr<VirtualConsole> first_tty() const { return m_consoles[0]; }
- NonnullRefPtr<VirtualConsole> debug_tty() const { return m_consoles[1]; }
+ NonnullLockRefPtr<VirtualConsole> first_tty() const { return m_consoles[0]; }
+ NonnullLockRefPtr<VirtualConsole> debug_tty() const { return m_consoles[1]; }
RecursiveSpinlock& tty_write_lock() { return m_tty_write_lock; }
private:
- NonnullRefPtrVector<VirtualConsole, s_max_virtual_consoles> m_consoles;
+ NonnullLockRefPtrVector<VirtualConsole, s_max_virtual_consoles> 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<NonnullRefPtr<MasterPTY>> MasterPTY::try_create(unsigned int index)
+ErrorOr<NonnullLockRefPtr<MasterPTY>> 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<NonnullRefPtr<MasterPTY>> try_create(unsigned index);
+ static ErrorOr<NonnullLockRefPtr<MasterPTY>> try_create(unsigned index);
virtual ~MasterPTY() override;
unsigned index() const { return m_index; }
@@ -39,7 +39,7 @@ private:
virtual ErrorOr<void> ioctl(OpenFileDescription&, unsigned request, Userspace<void*> arg) override;
virtual StringView class_name() const override { return "MasterPTY"sv; }
- RefPtr<SlavePTY> m_slave;
+ LockRefPtr<SlavePTY> m_slave;
unsigned m_index;
bool m_closed { false };
NonnullOwnPtr<DoubleBuffer> 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<NonnullRefPtr<OpenFileDescription>> PTYMultiplexer::open(int options)
+ErrorOr<NonnullLockRefPtr<OpenFileDescription>> PTYMultiplexer::open(int options)
{
- return m_freelist.with([&](auto& freelist) -> ErrorOr<NonnullRefPtr<OpenFileDescription>> {
+ return m_freelist.with([&](auto& freelist) -> ErrorOr<NonnullLockRefPtr<OpenFileDescription>> {
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<NonnullRefPtr<OpenFileDescription>> open(int options) override;
+ virtual ErrorOr<NonnullLockRefPtr<OpenFileDescription>> open(int options) override;
virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override { return 0; }
virtual ErrorOr<size_t> 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<MasterPTY> m_master;
+ LockRefPtr<MasterPTY> 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 <AK/CircularDeque.h>
-#include <AK/WeakPtr.h>
#include <Kernel/Devices/CharacterDevice.h>
#include <Kernel/DoubleBuffer.h>
+#include <Kernel/Library/LockWeakPtr.h>
#include <Kernel/ProcessGroup.h>
#include <Kernel/UnixTypes.h>
@@ -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<Process> m_original_process_parent;
- WeakPtr<ProcessGroup> m_pg;
+ LockWeakPtr<Process> m_original_process_parent;
+ LockWeakPtr<ProcessGroup> 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<NonnullOwnPtr<KString>> VirtualConsole::pseudo_name() const
return KString::formatted("tty:{}", m_index);
}
-UNMAP_AFTER_INIT NonnullRefPtr<VirtualConsole> VirtualConsole::create(size_t index)
+UNMAP_AFTER_INIT NonnullLockRefPtr<VirtualConsole> VirtualConsole::create(size_t index)
{
auto virtual_console_or_error = DeviceManagement::try_create_device<VirtualConsole>(index);
// FIXME: Find a way to propagate errors
@@ -115,7 +115,7 @@ UNMAP_AFTER_INIT NonnullRefPtr<VirtualConsole> VirtualConsole::create(size_t ind
return virtual_console_or_error.release_value();
}
-UNMAP_AFTER_INIT NonnullRefPtr<VirtualConsole> VirtualConsole::create_with_preset_log(size_t index, CircularQueue<char, 16384> const& log)
+UNMAP_AFTER_INIT NonnullLockRefPtr<VirtualConsole> VirtualConsole::create_with_preset_log(size_t index, CircularQueue<char, 16384> 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<VirtualConsole> create(size_t index);
- static NonnullRefPtr<VirtualConsole> create_with_preset_log(size_t index, CircularQueue<char, 16384> const&);
+ static NonnullLockRefPtr<VirtualConsole> create(size_t index);
+ static NonnullLockRefPtr<VirtualConsole> create_with_preset_log(size_t index, CircularQueue<char, 16384> 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<Thread> finalizer_thread;
+ LockRefPtr<Thread> 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<Thread> syncd_thread;
+ LockRefPtr<Thread> 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::GlobalList>& Thread::all_instances()
return *s_list;
}
-ErrorOr<NonnullRefPtr<Thread>> Thread::try_create(NonnullRefPtr<Process> process)
+ErrorOr<NonnullLockRefPtr<Thread>> Thread::try_create(NonnullLockRefPtr<Process> 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<Timer>());
+ auto block_timer = TRY(try_make_lock_ref_counted<Timer>());
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> process, NonnullOwnPtr<Memory::Region> kernel_stack_region, NonnullRefPtr<Timer> block_timer, NonnullOwnPtr<KString> name)
+Thread::Thread(NonnullLockRefPtr<Process> process, NonnullOwnPtr<Memory::Region> kernel_stack_region, NonnullLockRefPtr<Timer> block_timer, NonnullOwnPtr<KString> 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> process = thread->process();
+ LockRefPtr<Process> 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<NonnullRefPtr<Thread>> Thread::try_clone(Process& process)
+ErrorOr<NonnullLockRefPtr<Thread>> 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<void> Thread::make_thread_specific_region(Badge<Process>)
return {};
}
-RefPtr<Thread> Thread::from_tid(ThreadID tid)
+LockRefPtr<Thread> Thread::from_tid(ThreadID tid)
{
- return Thread::all_instances().with([&](auto& list) -> RefPtr<Thread> {
+ return Thread::all_instances().with([&](auto& list) -> LockRefPtr<Thread> {
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 <AK/Time.h>
#include <AK/Variant.h>
#include <AK/Vector.h>
-#include <AK/WeakPtr.h>
-#include <AK/Weakable.h>
#include <Kernel/Arch/RegisterState.h>
#include <Kernel/Debug.h>
#include <Kernel/Forward.h>
#include <Kernel/KString.h>
#include <Kernel/Library/ListedRefCounted.h>
+#include <Kernel/Library/LockWeakPtr.h>
+#include <Kernel/Library/LockWeakable.h>
#include <Kernel/Locking/LockLocation.h>
#include <Kernel/Locking/LockMode.h>
#include <Kernel/Locking/LockRank.h>
@@ -137,7 +137,7 @@ struct ThreadRegisters {
class Thread
: public ListedRefCounted<Thread, LockType::Spinlock>
- , public Weakable<Thread> {
+ , public LockWeakable<Thread> {
AK_MAKE_NONCOPYABLE(Thread);
AK_MAKE_NONMOVABLE(Thread);
@@ -152,10 +152,10 @@ public:
return Processor::current_thread();
}
- static ErrorOr<NonnullRefPtr<Thread>> try_create(NonnullRefPtr<Process>);
+ static ErrorOr<NonnullLockRefPtr<Thread>> try_create(NonnullLockRefPtr<Process>);
~Thread();
- static RefPtr<Thread> from_tid(ThreadID);
+ static LockRefPtr<Thread> 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<Thread> m_thread;
+ NonnullLockRefPtr<Thread> 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<Thread> m_joinee;
+ NonnullLockRefPtr<Thread> m_joinee;
void*& m_joinee_exit_value;
ErrorOr<void>& m_try_join_result;
bool m_did_unblock { false };
@@ -612,7 +612,7 @@ public:
explicit OpenFileDescriptionBlocker(OpenFileDescription&, BlockFlags, BlockFlags&);
private:
- NonnullRefPtr<OpenFileDescription> m_blocked_description;
+ NonnullLockRefPtr<OpenFileDescription> 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<OpenFileDescription> description;
+ LockRefPtr<OpenFileDescription> description;
BlockFlags block_flags { BlockFlags::None };
BlockFlags unblocked_flags { BlockFlags::None };
};
@@ -737,7 +737,7 @@ public:
Disowned
};
- WaitBlocker(int wait_options, Variant<Empty, NonnullRefPtr<Process>, NonnullRefPtr<ProcessGroup>> waitee, ErrorOr<siginfo_t>& result);
+ WaitBlocker(int wait_options, Variant<Empty, NonnullLockRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee, ErrorOr<siginfo_t>& 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<siginfo_t>& m_result;
- Variant<Empty, NonnullRefPtr<Process>, NonnullRefPtr<ProcessGroup>> m_waitee;
+ Variant<Empty, NonnullLockRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> m_waitee;
bool m_did_unblock { false };
bool m_got_sigchild { false };
};
@@ -777,12 +777,12 @@ public:
private:
struct ProcessBlockInfo {
- NonnullRefPtr<Process> process;
+ NonnullLockRefPtr<Process> process;
WaitBlocker::UnblockFlags flags;
u8 signal;
bool was_waited { false };
- explicit ProcessBlockInfo(NonnullRefPtr<Process>&&, WaitBlocker::UnblockFlags, u8);
+ explicit ProcessBlockInfo(NonnullLockRefPtr<Process>&&, WaitBlocker::UnblockFlags, u8);
~ProcessBlockInfo();
};
@@ -793,7 +793,7 @@ public:
class FlockBlocker final : public Blocker {
public:
- FlockBlocker(NonnullRefPtr<Inode>, flock const&);
+ FlockBlocker(NonnullLockRefPtr<Inode>, 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<Inode> m_inode;
+ NonnullLockRefPtr<Inode> m_inode;
flock const& m_flock;
bool m_did_unblock { false };
};
@@ -1049,7 +1049,7 @@ public:
return !m_is_joinable;
}
- ErrorOr<NonnullRefPtr<Thread>> try_clone(Process&);
+ ErrorOr<NonnullLockRefPtr<Thread>> try_clone(Process&);
template<IteratorFunction<Thread&> Callback>
static IterationDecision for_each_in_state(State, Callback);
@@ -1159,7 +1159,7 @@ public:
ErrorOr<NonnullOwnPtr<KString>> backtrace();
private:
- Thread(NonnullRefPtr<Process>, NonnullOwnPtr<Memory::Region>, NonnullRefPtr<Timer>, NonnullOwnPtr<KString>);
+ Thread(NonnullLockRefPtr<Process>, NonnullOwnPtr<Memory::Region>, NonnullLockRefPtr<Timer>, NonnullOwnPtr<KString>);
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<Process> m_process;
+ NonnullLockRefPtr<Process> m_process;
ThreadID m_tid { -1 };
ThreadRegisters m_regs {};
DebugRegisterState m_debug_register_state {};
@@ -1316,7 +1316,7 @@ private:
Atomic<bool> m_have_any_unmasked_pending_signals { false };
Atomic<u32> m_nested_profiler_calls { 0 };
- NonnullRefPtr<Timer> m_block_timer;
+ NonnullLockRefPtr<Timer> 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>&& process, WaitBlocker::UnblockFlags flags, u8 signal)
+Thread::WaitBlockerSet::ProcessBlockInfo::ProcessBlockInfo(NonnullLockRefPtr<Process>&& 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<Empty, NonnullRefPtr<Process>, NonnullRefPtr<ProcessGroup>> waitee, ErrorOr<siginfo_t>& result)
+Thread::WaitBlocker::WaitBlocker(int wait_options, Variant<Empty, NonnullLockRefPtr<Process>, NonnullLockRefPtr<ProcessGroup>> waitee, ErrorOr<siginfo_t>& 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<Process> const& waitee_process) {
+ [&](NonnullLockRefPtr<Process> const& waitee_process) {
return &process != waitee_process;
},
- [&](NonnullRefPtr<ProcessGroup> const& waitee_process_group) {
+ [&](NonnullLockRefPtr<ProcessGroup> 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> inode, flock const& flock)
+Thread::FlockBlocker::FlockBlocker(NonnullLockRefPtr<Inode> 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 <AK/NonnullRefPtrVector.h>
#include <AK/OwnPtr.h>
#include <AK/Types.h>
#include <AK/Vector.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/Memory/Region.h>
#include <Kernel/PhysicalAddress.h>
@@ -29,7 +29,7 @@ public:
u64 raw_counter_ticks_to_ns(u64) const;
u64 ns_to_raw_counter_ticks(u64) const;
- NonnullRefPtrVector<HPETComparator> const& comparators() const { return m_comparators; }
+ NonnullLockRefPtrVector<HPETComparator> 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<HPETComparator> m_comparators;
+ NonnullLockRefPtrVector<HPETComparator> 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> HPETComparator::create(u8 number, u8 irq, bool periodic_capable, bool is_64bit_capable)
+UNMAP_AFTER_INIT NonnullLockRefPtr<HPETComparator> 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<IRQHandler> {
friend class HPET;
public:
- static NonnullRefPtr<HPETComparator> create(u8 number, u8 irq, bool periodic_capable, bool is_64bit_capable);
+ static NonnullLockRefPtr<HPETComparator> 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> PIT::initialize(Function<void(RegisterState const&)> callback)
+UNMAP_AFTER_INIT NonnullLockRefPtr<PIT> PIT::initialize(Function<void(RegisterState const&)> 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 <AK/NonnullRefPtr.h>
#include <AK/Types.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
#include <Kernel/Time/HardwareTimer.h>
namespace Kernel {
@@ -34,7 +34,7 @@ namespace Kernel {
class PIT final : public HardwareTimer<IRQHandler> {
public:
- static NonnullRefPtr<PIT> initialize(Function<void(RegisterState const&)>);
+ static NonnullLockRefPtr<PIT> initialize(Function<void(RegisterState const&)>);
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> RealTimeClock::create(Function<void(RegisterState const&)> callback)
+NonnullLockRefPtr<RealTimeClock> RealTimeClock::create(Function<void(RegisterState const&)> callback)
{
- return adopt_ref(*new RealTimeClock(move(callback)));
+ return adopt_lock_ref(*new RealTimeClock(move(callback)));
}
RealTimeClock::RealTimeClock(Function<void(RegisterState const&)> 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 <AK/NonnullRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
#include <Kernel/RTC.h>
#include <Kernel/Time/HardwareTimer.h>
namespace Kernel {
class RealTimeClock final : public HardwareTimer<IRQHandler> {
public:
- static NonnullRefPtr<RealTimeClock> create(Function<void(RegisterState const&)> callback);
+ static NonnullLockRefPtr<RealTimeClock> create(Function<void(RegisterState const&)> 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 <AK/Error.h>
-#include <AK/NonnullRefPtrVector.h>
#include <AK/OwnPtr.h>
-#include <AK/RefPtr.h>
#include <AK/Time.h>
#include <AK/Types.h>
#include <Kernel/API/TimePage.h>
#include <Kernel/Arch/RegisterState.h>
+#include <Kernel/Library/LockRefPtr.h>
+#include <Kernel/Library/NonnullLockRefPtrVector.h>
#include <Kernel/UnixTypes.h>
namespace Kernel {
@@ -83,7 +83,7 @@ private:
bool probe_and_set_non_legacy_hardware_timers();
Vector<HardwareTimerBase*> scan_and_initialize_periodic_timers();
Vector<HardwareTimerBase*> scan_for_non_periodic_timers();
- NonnullRefPtrVector<HardwareTimerBase> m_hardware_timers;
+ NonnullLockRefPtrVector<HardwareTimerBase> 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<HardwareTimerBase> m_system_timer;
- RefPtr<HardwareTimerBase> m_time_keeper_timer;
+ LockRefPtr<HardwareTimerBase> m_system_timer;
+ LockRefPtr<HardwareTimerBase> m_time_keeper_timer;
Atomic<u32> m_profile_enable_count { 0 };
- RefPtr<HardwareTimerBase> m_profile_timer;
+ LockRefPtr<HardwareTimerBase> m_profile_timer;
NonnullOwnPtr<Memory::Region> 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> timer, clockid_t clock_id, Time const& deadline, Function<void()>&& callback)
+bool TimerQueue::add_timer_without_id(NonnullLockRefPtr<Timer> timer, clockid_t clock_id, Time const& deadline, Function<void()>&& 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<Timer>. Otherwise, calling cancel_timer() could
+ // *must* be a LockRefPtr<Timer>. 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> timer, clockid_t cloc
return true;
}
-TimerId TimerQueue::add_timer(NonnullRefPtr<Timer>&& timer)
+TimerId TimerQueue::add_timer(NonnullLockRefPtr<Timer>&& timer)
{
SpinlockLocker lock(g_timerqueue_lock);
@@ -84,7 +84,7 @@ TimerId TimerQueue::add_timer(NonnullRefPtr<Timer>&& timer)
return id;
}
-void TimerQueue::add_timer_locked(NonnullRefPtr<Timer> timer)
+void TimerQueue::add_timer_locked(NonnullLockRefPtr<Timer> 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 <AK/AtomicRefCounted.h>
#include <AK/Function.h>
#include <AK/IntrusiveList.h>
-#include <AK/NonnullRefPtr.h>
#include <AK/OwnPtr.h>
#include <AK/Time.h>
+#include <Kernel/Library/NonnullLockRefPtr.h>
#include <Kernel/Time/TimeManagement.h>
namespace Kernel {
@@ -87,8 +87,8 @@ public:
TimerQueue();
static TimerQueue& the();
- TimerId add_timer(NonnullRefPtr<Timer>&&);
- bool add_timer_without_id(NonnullRefPtr<Timer>, clockid_t, Time const&, Function<void()>&&);
+ TimerId add_timer(NonnullLockRefPtr<Timer>&&);
+ bool add_timer_without_id(NonnullLockRefPtr<Timer>, clockid_t, Time const&, Function<void()>&&);
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<Timer>);
+ void add_timer_locked(NonnullLockRefPtr<Timer>);
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> thread;
+ LockRefPtr<Thread> 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<Thread> m_thread;
+ LockRefPtr<Thread> m_thread;
WaitQueue m_wait_queue;
SpinlockProtected<IntrusiveList<&WorkItem::m_node>> 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<Graphics::BootFramebufferConsole>(multiboot_framebuffer_addr, multiboot_framebuffer_width, multiboot_framebuffer_height, multiboot_framebuffer_pitch).value().leak_ref();
+ g_boot_console = &try_make_lock_ref_counted<Graphics::BootFramebufferConsole>(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<Thread> init_stage2_thread;
+ LockRefPtr<Thread> 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> thread;
+ LockRefPtr<Thread> thread;
auto userspace_init = kernel_command_line().userspace_init();
auto init_args = kernel_command_line().userspace_init_args();