From 55fd3336b6bb6e3407377196f70991a01d081eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 29 Dec 2005 17:40:18 +0000 Subject: [PATCH] * Fixed a bug in ServerApp: when a ServerWindow would take too long to quit, it could crashed the server. * ViewLayer now deletes the view bitmap on destruction, if any. * BitmapManager::Delete() now also accepts NULL bitmaps. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15723 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/BitmapManager.cpp | 2 +- src/servers/app/ServerApp.cpp | 9 ++++++++- src/servers/app/ViewLayer.cpp | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/servers/app/BitmapManager.cpp b/src/servers/app/BitmapManager.cpp index aeff27b93e..b853dcc032 100644 --- a/src/servers/app/BitmapManager.cpp +++ b/src/servers/app/BitmapManager.cpp @@ -113,7 +113,7 @@ BitmapManager::CreateBitmap(BRect bounds, color_space space, int32 flags, void BitmapManager::DeleteBitmap(ServerBitmap *bitmap) { - if (!bitmap->_Release()) { + if (bitmap == NULL || !bitmap->_Release()) { // there are other references to this bitmap, we don't have to delete it yet return; } diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index 0dbae5b16a..8877fff855 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -154,7 +154,14 @@ ServerApp::~ServerApp() fWindowListLock.Lock(); for (int32 i = fWindowList.CountItems(); i-- > 0;) { - sem_id deathSemaphore = fWindowList.ItemAt(i)->DeathSemaphore(); + ServerWindow* window = fWindowList.ItemAt(i); + + // a window could have been remove in the mean time (if those 20 millisecs + // from above weren't enough) + if (window == NULL) + continue; + + sem_id deathSemaphore = window->DeathSemaphore(); fWindowListLock.Unlock(); // wait 3 seconds for our window to quit - that's quite a long diff --git a/src/servers/app/ViewLayer.cpp b/src/servers/app/ViewLayer.cpp index f5bfc76e56..4fcda5f23c 100644 --- a/src/servers/app/ViewLayer.cpp +++ b/src/servers/app/ViewLayer.cpp @@ -76,6 +76,9 @@ ViewLayer::ViewLayer(BRect frame, const char* name, // destructor ViewLayer::~ViewLayer() { + if (fViewBitmap != NULL) + gBitmapManager->DeleteBitmap(fViewBitmap); + delete fDrawState; // iterate over children and delete each one