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