From 1ea104aeebf1c8161bb0f0b961d99b925b79afab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 5 Feb 2008 08:36:01 +0000 Subject: [PATCH] UpdateIfNeeded() no longer keeps the looper's BMessageQueue locked when calling DispatchMessage(). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23870 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/Window.cpp | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/kits/interface/Window.cpp b/src/kits/interface/Window.cpp index 0fb17bb116..e7379edab8 100644 --- a/src/kits/interface/Window.cpp +++ b/src/kits/interface/Window.cpp @@ -1698,27 +1698,25 @@ BWindow::UpdateIfNeeded() _DequeueAll(); BMessageQueue *queue = MessageQueue(); - queue->Lock(); // First process and remove any _UPDATE_ message in the queue // With the current design, there can only be one at a time - BMessage *msg; - for (int32 i = 0; (msg = queue->FindMessage(i)) != NULL; i++) { - if (msg->what == _UPDATE_) { - BWindow::DispatchMessage(msg, this); - // we need to make sure that no overridden method is called - // here; for BWindow::DispatchMessage() we now exactly what - // will happen - queue->RemoveMessage(msg); - delete msg; + while (true) { + queue->Lock(); + + BMessage *message = queue->FindMessage(_UPDATE_, 0); + queue->RemoveMessage(message); + + queue->Unlock(); + + if (message == NULL) break; - // NOTE: "i" would have to be decreased if there were - // multiple _UPDATE_ messages and we would not break! - } + + BWindow::DispatchMessage(message, this); + delete message; } - queue->Unlock(); Unlock(); }