From 6331a6bd91b83ec4855335a0da830fd6638c824d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Sat, 9 Mar 2013 12:54:02 +0100 Subject: [PATCH] app_server: The client memory allocator is now reference counted. * Not sure if cursors could also have triggered this, but the memory allocator can now outlive its ServerApp. * However, this may also reveal cases of memory that is not freed correctly. --- src/servers/app/ClientMemoryAllocator.cpp | 5 +++++ src/servers/app/ClientMemoryAllocator.h | 3 ++- src/servers/app/ServerApp.cpp | 9 +++++---- src/servers/app/ServerApp.h | 6 ++++-- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/servers/app/ClientMemoryAllocator.cpp b/src/servers/app/ClientMemoryAllocator.cpp index f9ec018f31..0693ce8f85 100644 --- a/src/servers/app/ClientMemoryAllocator.cpp +++ b/src/servers/app/ClientMemoryAllocator.cpp @@ -316,6 +316,7 @@ ClientMemoryAllocator::_AllocateChunk(size_t size, bool& newArea) ClientMemory::ClientMemory() : + fAllocator(NULL), fBlock(NULL) { } @@ -325,6 +326,8 @@ ClientMemory::~ClientMemory() { if (fBlock != NULL) fAllocator->Free(fBlock); + if (fAllocator != NULL) + fAllocator->ReleaseReference(); } @@ -333,6 +336,8 @@ ClientMemory::Allocate(ClientMemoryAllocator* allocator, size_t size, bool& newArea) { fAllocator = allocator; + fAllocator->AcquireReference(); + return fAllocator->Allocate(size, &fBlock, newArea); } diff --git a/src/servers/app/ClientMemoryAllocator.h b/src/servers/app/ClientMemoryAllocator.h index 05ab8df533..283ab8da5b 100644 --- a/src/servers/app/ClientMemoryAllocator.h +++ b/src/servers/app/ClientMemoryAllocator.h @@ -10,6 +10,7 @@ #include +#include #include @@ -34,7 +35,7 @@ typedef DoublyLinkedList block_list; typedef DoublyLinkedList chunk_list; -class ClientMemoryAllocator { +class ClientMemoryAllocator : public BReferenceable { public: ClientMemoryAllocator(ServerApp* application); ~ClientMemoryAllocator(); diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index ec6432ab6a..af929c928e 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -105,7 +105,7 @@ ServerApp::ServerApp(Desktop* desktop, port_id clientReplyPort, fViewCursor(NULL), fCursorHideLevel(0), fIsActive(false), - fMemoryAllocator(this) + fMemoryAllocator(new ClientMemoryAllocator(this)) { if (fSignature == "") fSignature = "application/no-signature"; @@ -194,7 +194,7 @@ ServerApp::~ServerApp() fWindowListLock.Lock(); } - fMemoryAllocator.Detach(); + fMemoryAllocator->Detach(); fMapLocker.Lock(); while (!fBitmapMap.empty()) @@ -204,6 +204,7 @@ ServerApp::~ServerApp() fPictureMap.begin()->second->SetOwner(NULL); fDesktop->GetCursorManager().DeleteCursors(fClientTeam); + fMemoryAllocator->ReleaseReference(); STRACE(("ServerApp %s::~ServerApp(): Exiting\n", Signature())); } @@ -565,7 +566,7 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) break; case AS_DUMP_ALLOCATOR: - fMemoryAllocator.Dump(); + fMemoryAllocator->Dump(); break; case AS_DUMP_BITMAPS: { @@ -727,7 +728,7 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link) if (link.Read(&screenID) == B_OK) { // TODO: choose the right HWInterface with regards to the // screenID - bitmap = gBitmapManager->CreateBitmap(&fMemoryAllocator, + bitmap = gBitmapManager->CreateBitmap(fMemoryAllocator, *fDesktop->HWInterface(), frame, colorSpace, flags, bytesPerRow, screenID, &allocationFlags); } diff --git a/src/servers/app/ServerApp.h b/src/servers/app/ServerApp.h index 84c88afd83..433ea472f6 100644 --- a/src/servers/app/ServerApp.h +++ b/src/servers/app/ServerApp.h @@ -1,5 +1,5 @@ /* - * Copyright 2001-2012, Haiku. + * Copyright 2001-2013, Haiku. * Distributed under the terms of the MIT License. * * Authors: @@ -38,6 +38,7 @@ namespace BPrivate { class PortLink; }; + class ServerApp : public MessageLooper { public: ServerApp(Desktop* desktop, @@ -156,7 +157,8 @@ private: bool fIsActive; - ClientMemoryAllocator fMemoryAllocator; + ClientMemoryAllocator* fMemoryAllocator; }; + #endif // SERVER_APP_H