From 4e88440d3f3837b85da9653c16c33767f7acf914 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Sat, 31 Aug 2024 13:16:46 -0400 Subject: [PATCH] packagefs: Use ClassCache for UnpackingDirectory and UnpackingLeafNode. This shifts another big chunk of packagefs memory usage into dedicated object caches. It saves a small amount of memory since now we use caches sized exactly to the object size plus alignment rather than rounding up to the block allocator size, and also makes clearer in memory usage statistics how much memory packagefs is using. --- .../packagefs/nodes/UnpackingDirectory.cpp | 18 ++++++++++++++++++ .../packagefs/nodes/UnpackingDirectory.h | 6 ++++++ .../packagefs/nodes/UnpackingLeafNode.cpp | 6 +++++- .../packagefs/nodes/UnpackingLeafNode.h | 5 ++++- .../file_systems/packagefs/volume/Volume.cpp | 6 +++--- 5 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingDirectory.cpp b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingDirectory.cpp index 7c7e35bd93..4528169299 100644 --- a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingDirectory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingDirectory.cpp @@ -6,6 +6,7 @@ #include "UnpackingDirectory.h" +#include "ClassCache.h" #include "DebugSupport.h" #include "EmptyAttributeDirectoryCookie.h" #include "UnpackingAttributeCookie.h" @@ -16,6 +17,9 @@ // #pragma mark - UnpackingDirectory +CLASS_CACHE(UnpackingDirectory); + + UnpackingDirectory::UnpackingDirectory(ino_t id) : Directory(id) @@ -225,6 +229,20 @@ UnpackingDirectory::IndexCookieForAttribute(const StringKey& name) const // #pragma mark - RootDirectory +void* +RootDirectory::operator new(size_t size) +{ + return malloc(size); +} + + +void +RootDirectory::operator delete(void* object) +{ + free(object); +} + + RootDirectory::RootDirectory(ino_t id, const timespec& modifiedTime) : UnpackingDirectory(id), diff --git a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingDirectory.h b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingDirectory.h index 2e93764c36..dfc836807a 100644 --- a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingDirectory.h +++ b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingDirectory.h @@ -13,6 +13,9 @@ class UnpackingDirectory : public Directory, public UnpackingNode { public: + static void* operator new(size_t size); + static void operator delete(void* block); + UnpackingDirectory(ino_t id); virtual ~UnpackingDirectory(); @@ -55,6 +58,9 @@ private: class RootDirectory : public UnpackingDirectory { public: + static void* operator new(size_t size); + static void operator delete(void* block); + RootDirectory(ino_t id, const timespec& modifiedTime); diff --git a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.cpp b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.cpp index ab70944fb4..d017a67907 100644 --- a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.cpp @@ -11,11 +11,15 @@ #include #include +#include "ClassCache.h" #include "UnpackingAttributeCookie.h" #include "UnpackingAttributeDirectoryCookie.h" #include "Utils.h" +CLASS_CACHE(UnpackingLeafNode); + + UnpackingLeafNode::UnpackingLeafNode(ino_t id) : Node(id), @@ -212,7 +216,7 @@ UnpackingLeafNode::CloneTransferPackageNodes(ino_t id, UnpackingNode*& _newNode) { ASSERT(fFinalPackageNode == NULL); - UnpackingLeafNode* clone = new(std::nothrow) UnpackingLeafNode(id); + UnpackingLeafNode* clone = new UnpackingLeafNode(id); if (clone == NULL) return B_NO_MEMORY; diff --git a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.h b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.h index e70ad2a371..1b3a2cd77c 100644 --- a/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.h +++ b/src/add-ons/kernel/file_systems/packagefs/nodes/UnpackingLeafNode.h @@ -11,8 +11,11 @@ #include "UnpackingNode.h" -class UnpackingLeafNode : public Node, public UnpackingNode { +class UnpackingLeafNode final : public Node, public UnpackingNode { public: + static void* operator new(size_t size); + static void operator delete(void* block); + UnpackingLeafNode(ino_t id); virtual ~UnpackingLeafNode(); diff --git a/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp b/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp index d0c614f81e..73cce04030 100644 --- a/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp @@ -399,7 +399,7 @@ Volume::Mount(const char* parameterString) // create the root node fRootDirectory - = new(std::nothrow) ::RootDirectory(kRootDirectoryID, st.st_mtim); + = new ::RootDirectory(kRootDirectoryID, st.st_mtim); if (fRootDirectory == NULL) RETURN_ERROR(B_NO_MEMORY); fRootDirectory->Init(NULL, volumeNameString); @@ -1394,9 +1394,9 @@ Volume::_CreateUnpackingNode(mode_t mode, Directory* parent, const String& name, { UnpackingNode* unpackingNode; if (S_ISREG(mode) || S_ISLNK(mode)) - unpackingNode = new(std::nothrow) UnpackingLeafNode(fNextNodeID++); + unpackingNode = new UnpackingLeafNode(fNextNodeID++); else if (S_ISDIR(mode)) - unpackingNode = new(std::nothrow) UnpackingDirectory(fNextNodeID++); + unpackingNode = new UnpackingDirectory(fNextNodeID++); else RETURN_ERROR(B_UNSUPPORTED);