summaryrefslogtreecommitdiff
path: root/Kernel/FileSystem
diff options
context:
space:
mode:
authorIdan Horowitz <idan.horowitz@gmail.com>2021-12-29 00:23:25 +0200
committerAndreas Kling <kling@serenityos.org>2021-12-29 12:04:15 +0100
commit81e23617d6525663c11619a9c330a62654671155 (patch)
treecc63059e99b4c5d329df5c922325857ad0fce5c8 /Kernel/FileSystem
parentbe91b4fe3e3f1fd57f83538e57714e3f50a9ece8 (diff)
downloadserenity-81e23617d6525663c11619a9c330a62654671155.zip
Kernel: Port Custody to ListedRefCounted
Custody's unref is one of many implementions of ListedRefCounted's behaviour in the Kernel, which results in avoidable bugs caused by the fragmentation of the implementations. This commit starts the work of replacing all custom implementations with ListedRefCounted by porting Custody to it.
Diffstat (limited to 'Kernel/FileSystem')
-rw-r--r--Kernel/FileSystem/Custody.cpp23
-rw-r--r--Kernel/FileSystem/Custody.h8
2 files changed, 8 insertions, 23 deletions
diff --git a/Kernel/FileSystem/Custody.cpp b/Kernel/FileSystem/Custody.cpp
index 84b7479c33..81532d731f 100644
--- a/Kernel/FileSystem/Custody.cpp
+++ b/Kernel/FileSystem/Custody.cpp
@@ -10,20 +10,19 @@
#include <AK/Vector.h>
#include <Kernel/FileSystem/Custody.h>
#include <Kernel/FileSystem/Inode.h>
-#include <Kernel/Locking/MutexProtected.h>
namespace Kernel {
-static Singleton<MutexProtected<Custody::AllCustodiesList>> s_all_custodies;
+static Singleton<MutexProtected<Custody::AllCustodiesList>> s_all_instances;
-static MutexProtected<Custody::AllCustodiesList>& all_custodies()
+MutexProtected<Custody::AllCustodiesList>& Custody::all_instances()
{
- return s_all_custodies;
+ return s_all_instances;
}
ErrorOr<NonnullRefPtr<Custody>> Custody::try_create(Custody* parent, StringView name, Inode& inode, int mount_flags)
{
- return all_custodies().with_exclusive([&](auto& all_custodies) -> ErrorOr<NonnullRefPtr<Custody>> {
+ return all_instances().with_exclusive([&](auto& all_custodies) -> ErrorOr<NonnullRefPtr<Custody>> {
for (Custody& custody : all_custodies) {
if (custody.parent() == parent
&& custody.name() == name
@@ -40,20 +39,6 @@ ErrorOr<NonnullRefPtr<Custody>> Custody::try_create(Custody* parent, StringView
});
}
-bool Custody::unref() const
-{
- bool should_destroy = all_custodies().with_exclusive([&](auto&) {
- if (deref_base())
- return false;
- m_all_custodies_list_node.remove();
- return true;
- });
-
- if (should_destroy)
- delete this;
- return should_destroy;
-}
-
Custody::Custody(Custody* parent, NonnullOwnPtr<KString> name, Inode& inode, int mount_flags)
: m_parent(parent)
, m_name(move(name))
diff --git a/Kernel/FileSystem/Custody.h b/Kernel/FileSystem/Custody.h
index 64a4c4dae1..b688ae660c 100644
--- a/Kernel/FileSystem/Custody.h
+++ b/Kernel/FileSystem/Custody.h
@@ -8,20 +8,19 @@
#include <AK/Error.h>
#include <AK/IntrusiveList.h>
-#include <AK/RefCounted.h>
#include <AK/RefPtr.h>
#include <AK/String.h>
#include <Kernel/Forward.h>
#include <Kernel/KString.h>
+#include <Kernel/Library/ListedRefCounted.h>
+#include <Kernel/Locking/MutexProtected.h>
namespace Kernel {
// FIXME: Custody needs some locking.
-class Custody : public RefCountedBase {
+class Custody : public ListedRefCounted<Custody, LockType::Mutex> {
public:
- bool unref() const;
-
static ErrorOr<NonnullRefPtr<Custody>> try_create(Custody* parent, StringView name, Inode&, int mount_flags);
~Custody();
@@ -49,6 +48,7 @@ private:
public:
using AllCustodiesList = IntrusiveList<&Custody::m_all_custodies_list_node>;
+ static MutexProtected<Custody::AllCustodiesList>& all_instances();
};
}