diff options
author | Andreas Kling <kling@serenityos.org> | 2022-08-19 20:53:40 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-08-20 17:20:43 +0200 |
commit | 11eee67b8510767d76fb4793e3b62ac1793dd723 (patch) | |
tree | 8ce47a3813ce74bba56c60f62b29bdd6cdf287da | |
parent | e475263113387404e63cdc3666391934604eb6e7 (diff) | |
download | serenity-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.
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(); |