26MessageManager::MessageManager() noexcept
27 : messageThreadId (Thread::getCurrentThreadId())
33MessageManager::~MessageManager() noexcept
37 doPlatformSpecificShutdown();
39 jassert (instance ==
this);
43MessageManager* MessageManager::instance =
nullptr;
47 if (instance ==
nullptr)
50 doPlatformSpecificInitialisation();
63 deleteAndZero (instance);
67bool MessageManager::MessageBase::post()
69 auto*
mm = MessageManager::instance;
71 if (
mm ==
nullptr ||
mm->quitMessagePosted.get() != 0 || ! postMessageToSystemQueue (
this))
81#if JUCE_MODAL_LOOPS_PERMITTED && ! (JUCE_MAC || JUCE_IOS)
82bool MessageManager::runDispatchLoopUntil (
int millisecondsToRunFor)
88 while (quitMessageReceived.
get() == 0)
92 if (! dispatchNextMessageOnSystemQueue (millisecondsToRunFor >= 0))
101 return quitMessageReceived.
get() == 0;
105#if ! (JUCE_MAC || JUCE_IOS || JUCE_ANDROID)
106class MessageManager::QuitMessage :
public MessageManager::MessageBase
111 void messageCallback()
override
113 if (
auto* mm = MessageManager::instance)
114 mm->quitMessageReceived =
true;
117 JUCE_DECLARE_NON_COPYABLE (QuitMessage)
124 while (quitMessageReceived.
get() == 0)
128 if (! dispatchNextMessageOnSystemQueue (
false))
137 (
new QuitMessage())->post();
138 quitMessagePosted =
true;
148 : func (f), parameter (
param)
151 void messageCallback()
override
153 result = (*func) (parameter);
157 WaitableEvent finished;
158 std::atomic<void*> result {
nullptr };
161 MessageCallbackFunction*
const func;
162 void*
const parameter;
164 JUCE_DECLARE_NON_COPYABLE (AsyncFunctionCallback)
170 return func (parameter);
179 message->finished.wait();
180 return message->result.load();
192 void messageCallback()
override { callback(); }
193 std::function<
void()> callback;
200void MessageManager::deliverBroadcastMessage (
const String& value)
202 if (broadcaster !=
nullptr)
203 broadcaster->sendActionMessage (value);
208 if (broadcaster ==
nullptr)
211 broadcaster->addActionListener (listener);
216 if (broadcaster !=
nullptr)
217 broadcaster->removeActionListener (listener);
235 doPlatformSpecificShutdown();
236 doPlatformSpecificInitialisation();
249 return i->currentThreadHasLockedMessageManager();
257 return i->isThisTheMessageThread();
279 void messageCallback()
override
282 ScopedLock lock (ownerCriticalSection);
284 if (
auto* o = owner.get())
285 o->messageCallback();
291 CriticalSection ownerCriticalSection;
292 Atomic<const MessageManager::Lock*> owner;
293 WaitableEvent releaseEvent;
295 JUCE_DECLARE_NON_COPYABLE (BlockingMessage)
304bool MessageManager::Lock::tryAcquire (
bool lockIsMandatory)
const noexcept
306 auto*
mm = MessageManager::instance;
320 if (mm->currentThreadHasLockedMessageManager())
325 blockingMessage = *
new BlockingMessage (
this);
329 jassert (! lockIsMandatory);
333 if (! blockingMessage->post())
336 jassert (! lockIsMandatory);
337 blockingMessage =
nullptr;
343 while (abortWait.get() == 0)
344 lockedEvent.wait (-1);
348 if (lockGained.get() != 0)
354 }
while (lockIsMandatory);
357 blockingMessage->releaseEvent.signal();
360 ScopedLock lock (blockingMessage->ownerCriticalSection);
363 blockingMessage->owner.set (
nullptr);
366 blockingMessage =
nullptr;
372 if (lockGained.compareAndSetBool (
false,
true))
374 auto*
mm = MessageManager::instance;
376 jassert (
mm ==
nullptr ||
mm->currentThreadHasLockedMessageManager());
380 mm->threadWithLock = {};
382 if (blockingMessage !=
nullptr)
384 blockingMessage->releaseEvent.signal();
385 blockingMessage =
nullptr;
390void MessageManager::Lock::messageCallback()
const
399 lockedEvent.signal();
429 if (threadToCheck !=
nullptr)
437 if (jobToCheck !=
nullptr)
450void MessageManagerLock::exitSignalSent()
456JUCE_API
void JUCE_CALLTYPE initialiseJuce_GUI();
457JUCE_API
void JUCE_CALLTYPE initialiseJuce_GUI()
465JUCE_API
void JUCE_CALLTYPE shutdownJuce_GUI();
466JUCE_API
void JUCE_CALLTYPE shutdownJuce_GUI()
475static int numScopedInitInstances = 0;
void set(int indexToChange, ParameterType newValue)
static bool isStandaloneApp() noexcept
~MessageManagerLock() override
MessageManagerLock(Thread *threadToCheckForExitSignal=nullptr)
void enter() const noexcept
void abort() const noexcept
bool tryEnter() const noexcept
void exit() const noexcept
static bool callAsync(std::function< void()> functionToCall)
bool isThisTheMessageThread() const noexcept
static bool existsAndIsCurrentThread() noexcept
bool currentThreadHasLockedMessageManager() const noexcept
void * callFunctionOnMessageThread(MessageCallbackFunction *callback, void *userData)
void deregisterBroadcastListener(ActionListener *listener)
void setCurrentThreadAsMessageThread()
static bool existsAndIsLockedByCurrentThread() noexcept
void registerBroadcastListener(ActionListener *listener)
static void deleteInstance()
static MessageManager * getInstanceWithoutCreating() noexcept
static MessageManager * getInstance()
~ScopedJuceInitialiser_GUI()
ScopedJuceInitialiser_GUI()
bool shouldExit() const noexcept
void removeListener(Thread::Listener *)
static void JUCE_CALLTYPE sleep(int milliseconds)
static void JUCE_CALLTYPE setCurrentThreadName(const String &newThreadName)
bool threadShouldExit() const
static ThreadID JUCE_CALLTYPE getCurrentThreadId()
void removeListener(Listener *)
static int64 currentTimeMillis() noexcept
Type get() const noexcept