106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
  ==============================================================================
 | 
						|
 | 
						|
   This file is part of the JUCE library.
 | 
						|
   Copyright (c) 2017 - ROLI Ltd.
 | 
						|
 | 
						|
   JUCE is an open source library subject to commercial or open-source
 | 
						|
   licensing.
 | 
						|
 | 
						|
   The code included in this file is provided under the terms of the ISC license
 | 
						|
   http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 | 
						|
   To use, copy, modify, and/or distribute this software for any purpose with or
 | 
						|
   without fee is hereby granted provided that the above copyright notice and
 | 
						|
   this permission notice appear in all copies.
 | 
						|
 | 
						|
   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 | 
						|
   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 | 
						|
   DISCLAIMED.
 | 
						|
 | 
						|
  ==============================================================================
 | 
						|
*/
 | 
						|
 | 
						|
namespace juce
 | 
						|
{
 | 
						|
 | 
						|
//==============================================================================
 | 
						|
/* An internal message pump class used in OSX and iOS. */
 | 
						|
class MessageQueue
 | 
						|
{
 | 
						|
public:
 | 
						|
    MessageQueue()
 | 
						|
    {
 | 
						|
       #if JUCE_IOS
 | 
						|
        runLoop = CFRunLoopGetCurrent();
 | 
						|
       #else
 | 
						|
        runLoop = CFRunLoopGetMain();
 | 
						|
       #endif
 | 
						|
 | 
						|
        CFRunLoopSourceContext sourceContext;
 | 
						|
        zerostruct (sourceContext); // (can't use "= { 0 }" on this object because it's typedef'ed as a C struct)
 | 
						|
        sourceContext.info = this;
 | 
						|
        sourceContext.perform = runLoopSourceCallback;
 | 
						|
        runLoopSource = CFRunLoopSourceCreate (kCFAllocatorDefault, 1, &sourceContext);
 | 
						|
        CFRunLoopAddSource (runLoop, runLoopSource, kCFRunLoopCommonModes);
 | 
						|
    }
 | 
						|
 | 
						|
    ~MessageQueue() noexcept
 | 
						|
    {
 | 
						|
        CFRunLoopRemoveSource (runLoop, runLoopSource, kCFRunLoopCommonModes);
 | 
						|
        CFRunLoopSourceInvalidate (runLoopSource);
 | 
						|
        CFRelease (runLoopSource);
 | 
						|
    }
 | 
						|
 | 
						|
    void post (MessageManager::MessageBase* const message)
 | 
						|
    {
 | 
						|
        messages.add (message);
 | 
						|
        wakeUp();
 | 
						|
    }
 | 
						|
 | 
						|
private:
 | 
						|
    ReferenceCountedArray<MessageManager::MessageBase, CriticalSection> messages;
 | 
						|
    CFRunLoopRef runLoop;
 | 
						|
    CFRunLoopSourceRef runLoopSource;
 | 
						|
 | 
						|
    void wakeUp() noexcept
 | 
						|
    {
 | 
						|
        CFRunLoopSourceSignal (runLoopSource);
 | 
						|
        CFRunLoopWakeUp (runLoop);
 | 
						|
    }
 | 
						|
 | 
						|
    bool deliverNextMessage()
 | 
						|
    {
 | 
						|
        const MessageManager::MessageBase::Ptr nextMessage (messages.removeAndReturn (0));
 | 
						|
 | 
						|
        if (nextMessage == nullptr)
 | 
						|
            return false;
 | 
						|
 | 
						|
        JUCE_AUTORELEASEPOOL
 | 
						|
        {
 | 
						|
            JUCE_TRY
 | 
						|
            {
 | 
						|
                nextMessage->messageCallback();
 | 
						|
            }
 | 
						|
            JUCE_CATCH_EXCEPTION
 | 
						|
        }
 | 
						|
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    void runLoopCallback() noexcept
 | 
						|
    {
 | 
						|
        for (int i = 4; --i >= 0;)
 | 
						|
            if (! deliverNextMessage())
 | 
						|
                return;
 | 
						|
 | 
						|
        wakeUp();
 | 
						|
    }
 | 
						|
 | 
						|
    static void runLoopSourceCallback (void* info) noexcept
 | 
						|
    {
 | 
						|
        static_cast<MessageQueue*> (info)->runLoopCallback();
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
} // namespace juce
 |