From 7b8ab7b503111b624ac1b0389af33bc55f754aa8 Mon Sep 17 00:00:00 2001 From: jules Date: Wed, 16 Jul 2014 21:33:11 +0100 Subject: [PATCH] Changed MessageBase::post() to return a bool to detect failure in the OS message queue (which can happen under stress on win32), and used this to avoid some messaging classes getting stuck. --- .../broadcasters/juce_AsyncUpdater.cpp | 4 +++- .../messages/juce_MessageManager.cpp | 23 +++++++++++++++---- .../messages/juce_MessageManager.h | 2 +- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp b/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp index de12202664..980eb41461 100644 --- a/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp +++ b/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp @@ -61,7 +61,9 @@ AsyncUpdater::~AsyncUpdater() void AsyncUpdater::triggerAsyncUpdate() { if (activeMessage->shouldDeliver.compareAndSetBool (1, 0)) - activeMessage->post(); + if (! activeMessage->post()) + cancelPendingUpdate(); // if the message queue fails, this avoids getting + // trapped waiting for the message to arrive } void AsyncUpdater::cancelPendingUpdate() noexcept diff --git a/modules/juce_events/messages/juce_MessageManager.cpp b/modules/juce_events/messages/juce_MessageManager.cpp index 9383d50b49..31e2710fc0 100644 --- a/modules/juce_events/messages/juce_MessageManager.cpp +++ b/modules/juce_events/messages/juce_MessageManager.cpp @@ -66,12 +66,17 @@ void MessageManager::deleteInstance() } //============================================================================== -void MessageManager::MessageBase::post() +bool MessageManager::MessageBase::post() { MessageManager* const mm = MessageManager::instance; if (mm == nullptr || mm->quitMessagePosted || ! postMessageToSystemQueue (this)) + { Ptr deleter (this); // (this will delete messages that were just created with a 0 ref count) + return false; + } + + return true; } //============================================================================== @@ -158,9 +163,15 @@ void* MessageManager::callFunctionOnMessageThread (MessageCallbackFunction* cons jassert (! currentThreadHasLockedMessageManager()); const ReferenceCountedObjectPtr message (new AsyncFunctionCallback (func, parameter)); - message->post(); - message->finished.wait(); - return message->result; + + if (message->post()) + { + message->finished.wait(); + return message->result; + } + + jassertfalse; // the OS message queue failed to send the message! + return nullptr; } //============================================================================== @@ -275,7 +286,9 @@ bool MessageManagerLock::attemptLock (Thread* const threadToCheck, ThreadPoolJob } blockingMessage = new BlockingMessage(); - blockingMessage->post(); + + if (! blockingMessage->post()) + return false; while (! blockingMessage->lockedEvent.wait (20)) { diff --git a/modules/juce_events/messages/juce_MessageManager.h b/modules/juce_events/messages/juce_MessageManager.h index d50c35c58a..9266d05034 100644 --- a/modules/juce_events/messages/juce_MessageManager.h +++ b/modules/juce_events/messages/juce_MessageManager.h @@ -170,7 +170,7 @@ public: virtual ~MessageBase() {} virtual void messageCallback() = 0; - void post(); + bool post(); typedef ReferenceCountedObjectPtr Ptr;