From f33610f874950e36978c238c83f1004592070481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 21 Apr 2006 22:43:23 +0000 Subject: [PATCH] Fixed number 1 (or the only one? ;-)) crashing bug #306 in the app_server: Since ServerWindow removed itself from its ServerApp in _PrepareQuit(), it could happen quite easily that the ServerApp was deleted before the ServerWindow - and since deleting WindowLayer as part of that referenced the ServerApp, it crashed. Now, adding/removing is both done by the ServerWindow in Init() respectively the destructor. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17198 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/ServerApp.cpp | 22 +++++++++++----------- src/servers/app/ServerApp.h | 1 + src/servers/app/ServerWindow.cpp | 10 ++++++++-- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/servers/app/ServerApp.cpp b/src/servers/app/ServerApp.cpp index e7adbf98a3..d68479e001 100644 --- a/src/servers/app/ServerApp.cpp +++ b/src/servers/app/ServerApp.cpp @@ -2468,27 +2468,27 @@ ServerApp::_CreateWindow(int32 code, BPrivate::LinkReceiver& link, status = window->Init(frame, (window_look)look, (window_feel)feel, flags, workspaces); if (status == B_OK && !window->Run()) { -fprintf(stderr, "ServerApp::_CreateWindow() - failed to run the window thread\n"); + fprintf(stderr, "ServerApp::_CreateWindow() - failed to run the window thread\n"); status = B_ERROR; } - // add the window to the list - if (status == B_OK && fWindowListLock.Lock()) { - status = fWindowList.AddItem(window) ? B_OK : B_NO_MEMORY; -if (status < B_OK) -fprintf(stderr, "ServerApp::_CreateWindow() - no memory to add window to list\n"); - fWindowListLock.Unlock(); - } - - if (status < B_OK) { + if (status < B_OK) delete window; - } } return status; } +bool +ServerApp::AddWindow(ServerWindow* window) +{ + BAutolock locker(fWindowListLock); + + return fWindowList.AddItem(window); +} + + void ServerApp::RemoveWindow(ServerWindow* window) { diff --git a/src/servers/app/ServerApp.h b/src/servers/app/ServerApp.h index 811f1ae1c0..ec86f8fd08 100644 --- a/src/servers/app/ServerApp.h +++ b/src/servers/app/ServerApp.h @@ -69,6 +69,7 @@ class ServerApp : public MessageLooper { const char* Signature() const { return fSignature.String(); } const char* SignatureLeaf() const { return fSignature.String() + 12; } + bool AddWindow(ServerWindow* window); void RemoveWindow(ServerWindow* window); bool InWorkspace(int32 index) const; uint32 Workspaces() const; diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index 0bea437456..b778814029 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -194,6 +194,9 @@ ServerWindow::~ServerWindow() delete fWindowLayer; + if (App() != NULL) + App()->RemoveWindow(this); + free(fTitle); delete_port(fMessagePort); @@ -220,6 +223,11 @@ status_t ServerWindow::Init(BRect frame, window_look look, window_feel feel, uint32 flags, uint32 workspace) { + if (!App()->AddWindow(this)) { + fServerApp = NULL; + return B_NO_MEMORY; + } + if (fTitle == NULL) return B_NO_MEMORY; @@ -278,8 +286,6 @@ ServerWindow::_PrepareQuit() fDesktop->LockSingleWindow(); _Hide(); fDesktop->UnlockSingleWindow(); - - App()->RemoveWindow(this); } else if (fThread >= B_OK) PostMessage(AS_HIDE_WINDOW); }