From d246cc280df7b5098bf87f0c627e95465d9b18d1 Mon Sep 17 00:00:00 2001 From: attila Date: Tue, 28 Jun 2022 16:48:08 +0200 Subject: [PATCH] MessageManager: Add mutex to isThisTheMessageThread() and setCurrentThreadAsMessageThread() --- modules/juce_events/messages/juce_MessageManager.cpp | 8 +++++--- modules/juce_events/messages/juce_MessageManager.h | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/juce_events/messages/juce_MessageManager.cpp b/modules/juce_events/messages/juce_MessageManager.cpp index 153ac62470..cca2d4925a 100644 --- a/modules/juce_events/messages/juce_MessageManager.cpp +++ b/modules/juce_events/messages/juce_MessageManager.cpp @@ -225,6 +225,8 @@ void MessageManager::deregisterBroadcastListener (ActionListener* const listener //============================================================================== bool MessageManager::isThisTheMessageThread() const noexcept { + const std::lock_guard lock { messageThreadIdMutex }; + return Thread::getCurrentThreadId() == messageThreadId; } @@ -232,10 +234,10 @@ void MessageManager::setCurrentThreadAsMessageThread() { auto thisThread = Thread::getCurrentThreadId(); - if (messageThreadId != thisThread) - { - messageThreadId = thisThread; + const std::lock_guard lock { messageThreadIdMutex }; + if (std::exchange (messageThreadId, thisThread) != thisThread) + { #if JUCE_WINDOWS // This is needed on windows to make sure the message window is created by this thread doPlatformSpecificShutdown(); diff --git a/modules/juce_events/messages/juce_MessageManager.h b/modules/juce_events/messages/juce_MessageManager.h index 9a5c26e697..8687a057cf 100644 --- a/modules/juce_events/messages/juce_MessageManager.h +++ b/modules/juce_events/messages/juce_MessageManager.h @@ -328,6 +328,7 @@ private: Atomic quitMessagePosted { 0 }, quitMessageReceived { 0 }; Thread::ThreadID messageThreadId; Atomic threadWithLock; + mutable std::mutex messageThreadIdMutex; static bool postMessageToSystemQueue (MessageBase*); static void* exitModalLoopCallback (void*);