summaryrefslogtreecommitdiff
path: root/AK
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-05-07 11:59:46 +0200
committerAndreas Kling <kling@serenityos.org>2022-06-15 17:15:04 +0200
commit9e994da2acdec9807a82b3e3356876a2e1dd59b0 (patch)
tree5e190d14583508b7310e07526de78be5ffd3e0d5 /AK
parentb47fbea9ad699b055861368f6712daf30c4970f9 (diff)
downloadserenity-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.h36
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