2 * Copyright (C) 2011 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
27 #include "LayerFlushScheduler.h"
29 #include <wtf/AutodrainedPool.h>
32 #include "RuntimeApplicationChecksIOS.h"
33 #include <CoreFoundation/CFBundle.h>
34 #include <WebCore/WebCoreThread.h>
39 static const CFIndex layerFlushRunLoopOrder = (CFIndex)RunLoopObserver::WellKnownRunLoopOrders::CoreAnimationCommit - 1;
41 static CFRunLoopRef currentRunLoop()
44 // A race condition during WebView deallocation can lead to a crash if the layer sync run loop
45 // observer is added to the main run loop <rdar://problem/9798550>. However, for responsiveness,
46 // we still allow this, see <rdar://problem/7403328>. Since the race condition and subsequent
47 // crash are especially troublesome for iBooks, we never allow the observer to be added to the
48 // main run loop in iBooks.
49 if (applicationIsIBooksOnIOS())
50 return WebThreadRunLoop();
52 return CFRunLoopGetCurrent();
55 LayerFlushScheduler::LayerFlushScheduler(LayerFlushSchedulerClient* client)
56 : m_isSuspended(false)
59 ASSERT_ARG(client, client);
61 m_runLoopObserver = std::make_unique<RunLoopObserver>(layerFlushRunLoopOrder, [this]() {
62 if (this->isSuspended())
64 this->layerFlushCallback();
68 LayerFlushScheduler::~LayerFlushScheduler()
72 void LayerFlushScheduler::layerFlushCallback()
74 ASSERT(!m_isSuspended);
77 if (m_client->flushLayers())
81 void LayerFlushScheduler::schedule()
86 m_runLoopObserver->schedule(currentRunLoop());
89 void LayerFlushScheduler::invalidate()
91 m_runLoopObserver->invalidate();
94 } // namespace WebCore