浏览代码

Kernel: Add ListedRefCounted<T> template class

This class implements the emerging "ref-counted object that participates
in a lock-protected list that requires safe removal on unref()" pattern
as a base class that can be inherited in place of RefCounted<T>.
Andreas Kling 4 年之前
父节点
当前提交
c410f08c2b
共有 1 个文件被更改,包括 30 次插入0 次删除
  1. 30 0
      Kernel/Library/ListedRefCounted.h

+ 30 - 0
Kernel/Library/ListedRefCounted.h

@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/RefCounted.h>
+
+namespace Kernel {
+
+template<typename T>
+class ListedRefCounted : public RefCountedBase {
+public:
+    bool unref() const
+    {
+        bool did_hit_zero = T::all_instances().with([&](auto& list) {
+            if (deref_base())
+                return false;
+            list.remove(const_cast<T&>(static_cast<T const&>(*this)));
+            return true;
+        });
+        if (did_hit_zero)
+            delete const_cast<T*>(static_cast<T const*>(this));
+        return did_hit_zero;
+    }
+};
+
+}