From 7212229343784d9b2e4bad3c1e55ddde89eb9852 Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Sat, 15 Jul 2006 13:12:01 +0000 Subject: [PATCH] The BWindow destructor is called with the window locked, but we need to unlock to acquire the menu semaphore. Updated BBitmap to lock he window on quit too. This fixes last problem mentioned in bug 406 git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18156 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/Bitmap.cpp | 5 ++++- src/kits/interface/Window.cpp | 9 +++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/kits/interface/Bitmap.cpp b/src/kits/interface/Bitmap.cpp index 2f9a7d20c4..d5e8b14424 100644 --- a/src/kits/interface/Bitmap.cpp +++ b/src/kits/interface/Bitmap.cpp @@ -217,7 +217,10 @@ BBitmap::BBitmap(const BBitmap *source, bool acceptsViews, */ BBitmap::~BBitmap() { - delete fWindow; + if (fWindow != NULL) { + fWindow->Lock(); + delete fWindow; + } _CleanUp(); } diff --git a/src/kits/interface/Window.cpp b/src/kits/interface/Window.cpp index e0fef3431c..e67ea205a6 100644 --- a/src/kits/interface/Window.cpp +++ b/src/kits/interface/Window.cpp @@ -350,18 +350,23 @@ BWindow::BWindow(BRect frame, int32 bitmapToken) BWindow::~BWindow() { - Lock(); - if (BMenu *menu = dynamic_cast(fFocus)) { menu->QuitTracking(); } + // The BWindow is locked when the destructor is called, + // we need to unlock because the menubar thread tries + // to post a message, which will deadlock otherwise. + Unlock(); + // Wait if a menu is still tracking if (fMenuSem > 0) { while (acquire_sem(fMenuSem) == B_INTERRUPTED) ; } + Lock(); + fTopView->RemoveSelf(); delete fTopView;