From 57bc041d4ba862056d2ca19c2fc2119ca1e00927 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Wed, 11 Sep 2024 13:54:39 -0400 Subject: [PATCH] packagefs: Add CountReferences method to InlineReferenceable. --- .../file_systems/packagefs/nodes/Node.cpp | 2 +- .../file_systems/packagefs/nodes/Node.h | 1 + .../packagefs/package/PackageNode.cpp | 2 +- .../packagefs/package/PackageNode.h | 1 + .../packagefs/util/InlineReferenceable.h | 19 +++++++++++++------ 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/add-ons/kernel/file_systems/packagefs/nodes/Node.cpp b/src/add-ons/kernel/file_systems/packagefs/nodes/Node.cpp index 79109c86b9..9bcf73af38 100644 --- a/src/add-ons/kernel/file_systems/packagefs/nodes/Node.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/nodes/Node.cpp @@ -13,7 +13,7 @@ #include "EmptyAttributeDirectoryCookie.h" -DEFINE_REFERENCEABLE_ACQUIRE_RELEASE(Node, fReferenceable); +DEFINE_INLINE_REFERENCEABLE_METHODS(Node, fReferenceable); Node::Node(ino_t id) diff --git a/src/add-ons/kernel/file_systems/packagefs/nodes/Node.h b/src/add-ons/kernel/file_systems/packagefs/nodes/Node.h index e8dc768914..7715a6700b 100644 --- a/src/add-ons/kernel/file_systems/packagefs/nodes/Node.h +++ b/src/add-ons/kernel/file_systems/packagefs/nodes/Node.h @@ -41,6 +41,7 @@ public: void AcquireReference(); void ReleaseReference(); + int32 CountReferences(); inline bool ReadLock(); inline void ReadUnlock(); diff --git a/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.cpp b/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.cpp index 4b5bfb9524..24a1a3e693 100644 --- a/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.cpp @@ -16,7 +16,7 @@ #include "Utils.h" -DEFINE_REFERENCEABLE_ACQUIRE_RELEASE(PackageNode, fReferenceable); +DEFINE_INLINE_REFERENCEABLE_METHODS(PackageNode, fReferenceable); PackageNode::PackageNode(Package* package, mode_t mode) diff --git a/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.h b/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.h index 182da2b747..8dd4b13d9c 100644 --- a/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.h +++ b/src/add-ons/kernel/file_systems/packagefs/package/PackageNode.h @@ -31,6 +31,7 @@ public: void AcquireReference(); void ReleaseReference(); + int32 CountReferences(); BReference GetPackage() const; // Since PackageNode does only hold a diff --git a/src/add-ons/kernel/file_systems/packagefs/util/InlineReferenceable.h b/src/add-ons/kernel/file_systems/packagefs/util/InlineReferenceable.h index 3a0c3dbbf3..3bf3e0de52 100644 --- a/src/add-ons/kernel/file_systems/packagefs/util/InlineReferenceable.h +++ b/src/add-ons/kernel/file_systems/packagefs/util/InlineReferenceable.h @@ -15,18 +15,18 @@ * is only sizeof(int32) == 4. */ class InlineReferenceable { public: - InlineReferenceable() + inline InlineReferenceable() : fReferenceCount(1) { } - ~InlineReferenceable() + inline ~InlineReferenceable() { ASSERT(fReferenceCount == 0 || fReferenceCount == 1); } - int32 + inline int32 AcquireReference() { const int32 previousCount = atomic_add(&fReferenceCount, 1); @@ -34,7 +34,7 @@ public: return previousCount; } - int32 + inline int32 ReleaseReference() { const int32 previousCount = atomic_add(&fReferenceCount, -1); @@ -42,14 +42,21 @@ public: return previousCount; } + inline int32 + CountReferences() + { + return atomic_get(&fReferenceCount); + } + private: int32 fReferenceCount; }; -#define DEFINE_REFERENCEABLE_ACQUIRE_RELEASE(CLASS, InlineReferenceable) \ +#define DEFINE_INLINE_REFERENCEABLE_METHODS(CLASS, InlineReferenceable) \ void CLASS::AcquireReference() { InlineReferenceable.AcquireReference(); } \ - void CLASS::ReleaseReference() { if (InlineReferenceable.ReleaseReference() == 1) delete this; } + void CLASS::ReleaseReference() { if (InlineReferenceable.ReleaseReference() == 1) delete this; } \ + int32 CLASS::CountReferences() { return InlineReferenceable.CountReferences(); } #endif // INLINE_REFERENCEABLE_H