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;