diff options
author | Andreas Kling <kling@serenityos.org> | 2022-05-07 11:59:46 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-06-15 17:15:04 +0200 |
commit | 9e994da2acdec9807a82b3e3356876a2e1dd59b0 (patch) | |
tree | 5e190d14583508b7310e07526de78be5ffd3e0d5 /AK | |
parent | b47fbea9ad699b055861368f6712daf30c4970f9 (diff) | |
download | serenity-9e994da2acdec9807a82b3e3356876a2e1dd59b0.zip |
Kernel+AK: Split Weakable.h into userspace and kernel variants
Only the kernel expects AK::Weakable to lock its refcount manipulation,
so let's not force userspace to pay for that as well.
Diffstat (limited to 'AK')
-rw-r--r-- | AK/Weakable.h | 36 |
1 files changed, 10 insertions, 26 deletions
diff --git a/AK/Weakable.h b/AK/Weakable.h index 122fb6ddfa..ee784aa090 100644 --- a/AK/Weakable.h +++ b/AK/Weakable.h @@ -1,22 +1,20 @@ /* - * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> + * Copyright (c) 2018-2022, Andreas Kling <kling@serenityos.org> * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once -#include "Assertions.h" -#include "Atomic.h" -#include "RefCounted.h" -#include "RefPtr.h" -#include "StdLibExtras.h" #ifdef KERNEL -# include <Kernel/Arch/Processor.h> -# include <Kernel/Arch/ScopedCritical.h> +# 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> -#endif namespace AK { @@ -39,11 +37,6 @@ public: RefPtr<T, PtrTraits> ref; { -#ifdef KERNEL - // We don't want to be pre-empted while we are trying to obtain - // a strong reference - Kernel::ScopedCritical critical; -#endif 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()) @@ -79,11 +72,7 @@ public: // We flagged revocation, now wait until everyone trying to obtain // a strong reference is done while (current_consumers > 0) { -#ifdef KERNEL - Kernel::Processor::wait_check(); -#else sched_yield(); -#endif current_consumers = m_consumers.load(AK::MemoryOrder::memory_order_acquire) & ~1u; } // No one is trying to use it (anymore) @@ -106,13 +95,12 @@ private: class Link; public: -#ifndef KERNEL template<typename U = T> WeakPtr<U> make_weak_ptr() const { return MUST(try_make_weak_ptr<U>()); } -#endif + template<typename U = T> ErrorOr<WeakPtr<U>> try_make_weak_ptr() const; @@ -121,9 +109,6 @@ protected: ~Weakable() { -#ifdef KERNEL - m_being_destroyed.store(true, AK::MemoryOrder::memory_order_release); -#endif revoke_weak_ptrs(); } @@ -135,11 +120,10 @@ protected: private: mutable RefPtr<WeakLink> m_link; -#ifdef KERNEL - Atomic<bool> m_being_destroyed { false }; -#endif }; } using AK::Weakable; + +#endif |