1/* 2 * Copyright (C) 2011, 2014 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "RunLoopObserver.h" 28 29namespace WebCore { 30 31std::unique_ptr<RunLoopObserver> RunLoopObserver::create(CFIndex order, RunLoopObserver::RunLoopObserverCallback callback) 32{ 33 return std::unique_ptr<RunLoopObserver>(new RunLoopObserver(order, callback)); 34} 35 36RunLoopObserver::~RunLoopObserver() 37{ 38 invalidate(); 39} 40 41void RunLoopObserver::runLoopObserverFired(CFRunLoopObserverRef, CFRunLoopActivity, void* context) 42{ 43 static_cast<RunLoopObserver*>(context)->runLoopObserverFired(); 44} 45 46void RunLoopObserver::runLoopObserverFired() 47{ 48 ASSERT(m_runLoopObserver); 49 m_callback(); 50} 51 52void RunLoopObserver::schedule(CFRunLoopRef runLoop) 53{ 54 if (!runLoop) 55 runLoop = CFRunLoopGetCurrent(); 56 57 // Make sure we wake up the loop or the observer could be delayed until some other source fires. 58 CFRunLoopWakeUp(runLoop); 59 60 if (m_runLoopObserver) 61 return; 62 63 CFRunLoopObserverContext context = { 0, this, 0, 0, 0 }; 64 m_runLoopObserver = adoptCF(CFRunLoopObserverCreate(0, kCFRunLoopBeforeWaiting | kCFRunLoopExit, true, m_order, runLoopObserverFired, &context)); 65 66 CFRunLoopAddObserver(runLoop, m_runLoopObserver.get(), kCFRunLoopCommonModes); 67} 68 69void RunLoopObserver::invalidate() 70{ 71 if (m_runLoopObserver) { 72 CFRunLoopObserverInvalidate(m_runLoopObserver.get()); 73 m_runLoopObserver = nullptr; 74 } 75} 76 77} // namespace WebCore 78