From fe8f88cff41e731db2bd6958331c6585a5feaa5a Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Tue, 18 Nov 2025 19:39:08 -0500 Subject: [PATCH] app_server: Rework ClonedAreaMemory to use ServerMemoryAllocator. This takes advantage of the new reference (use)-counting logic inside ServerMemoryAllocator to not re-clone areas needlessly. Fixes #8501. --- src/servers/app/ClientMemoryAllocator.cpp | 15 +++++++++++---- src/servers/app/ClientMemoryAllocator.h | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/servers/app/ClientMemoryAllocator.cpp b/src/servers/app/ClientMemoryAllocator.cpp index 922c1fb..d91fee3 100644 --- a/src/servers/app/ClientMemoryAllocator.cpp +++ b/src/servers/app/ClientMemoryAllocator.cpp @@ -26,6 +26,7 @@ #include #include "ServerApp.h" +#include "ServerMemoryAllocator.h" typedef block_list::Iterator block_iterator; @@ -364,6 +365,10 @@ // #pragma mark - +static BLocker sLocker("ClonedAreaMemory allocator"); +static BPrivate::ServerMemoryAllocator sClonedAreaMemoryAllocator; + + ClonedAreaMemory::ClonedAreaMemory() : fClonedArea(-1), @@ -375,18 +380,18 @@ ClonedAreaMemory::~ClonedAreaMemory() { - if (fClonedArea >= 0) - delete_area(fClonedArea); + BAutolock locker(sLocker); + sClonedAreaMemoryAllocator.RemoveArea(fClonedArea); } void* ClonedAreaMemory::Clone(area_id area, uint32 offset) { - fClonedArea = clone_area("server_memory", (void**)&fBase, B_ANY_ADDRESS, - B_READ_AREA | B_WRITE_AREA, area); - if (fBase == NULL) + BAutolock locker(sLocker); + if (sClonedAreaMemoryAllocator.AddArea(area, fClonedArea, fBase, 0, false) != B_OK) return NULL; + fOffset = offset; return Address(); } diff --git a/src/servers/app/ClientMemoryAllocator.h b/src/servers/app/ClientMemoryAllocator.h index 40ffbf7..7541fc0 100644 --- a/src/servers/app/ClientMemoryAllocator.h +++ b/src/servers/app/ClientMemoryAllocator.h @@ -89,7 +89,7 @@ /*! Just clones an existing area. */ -class ClonedAreaMemory : public AreaMemory{ +class ClonedAreaMemory : public AreaMemory { public: ClonedAreaMemory(); virtual ~ClonedAreaMemory(); -- gitore 0.2.2