⛏️ index : haiku.git

author Augustin Cavalier <waddlesplash@gmail.com> 2025-11-18 19:39:08.0 -05:00:00
committer Augustin Cavalier <waddlesplash@gmail.com> 2025-11-18 20:10:05.0 -05:00:00
commit
fe8f88cff41e731db2bd6958331c6585a5feaa5a [patch]
tree
f239dc07e7617c2bef613ac0cce5938fdb489d7f
parent
2661f371fb31307a29b96701a47939dbf5ff6727
download
fe8f88cff41e731db2bd6958331c6585a5feaa5a.tar.gz

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.

Diff

 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 <Autolock.h>

#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();