Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/dom/ScriptedIdleTaskController.h" | 5 #include "core/dom/ScriptedIdleTaskController.h" |
| 6 | 6 |
| 7 #include "core/dom/ExecutionContext.h" | 7 #include "core/dom/ExecutionContext.h" |
| 8 #include "core/dom/IdleRequestCallback.h" | 8 #include "core/dom/IdleRequestCallback.h" |
| 9 #include "core/dom/IdleRequestOptions.h" | 9 #include "core/dom/IdleRequestOptions.h" |
| 10 #include "core/frame/PerformanceMonitor.h" | 10 #include "core/frame/PerformanceMonitor.h" |
| 11 #include "core/inspector/InspectorTraceEvents.h" | 11 #include "core/inspector/InspectorTraceEvents.h" |
| 12 #include "platform/Histogram.h" | 12 #include "platform/Histogram.h" |
| 13 #include "platform/instrumentation/tracing/TraceEvent.h" | 13 #include "platform/instrumentation/tracing/TraceEvent.h" |
| 14 #include "public/platform/Platform.h" | 14 #include "public/platform/Platform.h" |
| 15 #include "public/platform/WebScheduler.h" | 15 #include "public/platform/WebScheduler.h" |
| 16 #include "public/platform/WebTraceLocation.h" | 16 #include "public/platform/WebTraceLocation.h" |
| 17 #include "wtf/CurrentTime.h" | 17 #include "wtf/CurrentTime.h" |
| 18 #include "wtf/Functional.h" | 18 #include "wtf/Functional.h" |
| 19 #include "wtf/RefCounted.h" | 19 #include "wtf/RefCounted.h" |
| 20 | 20 |
| 21 namespace blink { | 21 namespace blink { |
| 22 | 22 |
| 23 namespace internal { | 23 namespace internal { |
| 24 | 24 |
| 25 class IdleRequestCallbackWrapper | 25 class IdleRequestCallbackWrapper |
| 26 : public RefCounted<IdleRequestCallbackWrapper> { | 26 : public RefCounted<IdleRequestCallbackWrapper> { |
| 27 public: | 27 public: |
| 28 static PassRefPtr<IdleRequestCallbackWrapper> create( | 28 static PassRefPtr<IdleRequestCallbackWrapper> create( |
| 29 ScriptedIdleTaskController::CallbackId id, | 29 ScriptedIdleTaskController::CallbackId id, |
| 30 ScriptedIdleTaskController* controller) { | 30 WTF::WeakPtr<ScriptedIdleTaskController> controller) { |
| 31 return adoptRef(new IdleRequestCallbackWrapper(id, controller)); | 31 return adoptRef(new IdleRequestCallbackWrapper(id, controller)); |
| 32 } | 32 } |
| 33 virtual ~IdleRequestCallbackWrapper() {} | 33 virtual ~IdleRequestCallbackWrapper() {} |
| 34 | 34 |
| 35 static void idleTaskFired( | 35 static void idleTaskFired( |
| 36 PassRefPtr<IdleRequestCallbackWrapper> callbackWrapper, | 36 PassRefPtr<IdleRequestCallbackWrapper> callbackWrapper, |
| 37 double deadlineSeconds) { | 37 double deadlineSeconds) { |
| 38 // TODO(rmcilroy): Implement clamping of deadline in some form. | 38 // TODO(rmcilroy): Implement clamping of deadline in some form. |
| 39 if (ScriptedIdleTaskController* controller = callbackWrapper->controller()) | 39 if (ScriptedIdleTaskController* controller = callbackWrapper->controller()) |
| 40 controller->callbackFired(callbackWrapper->id(), deadlineSeconds, | 40 controller->callbackFired(callbackWrapper->id(), deadlineSeconds, |
| 41 IdleDeadline::CallbackType::CalledWhenIdle); | 41 IdleDeadline::CallbackType::CalledWhenIdle); |
| 42 callbackWrapper->cancel(); | 42 callbackWrapper->cancel(); |
| 43 } | 43 } |
| 44 | 44 |
| 45 static void timeoutFired( | 45 static void timeoutFired( |
| 46 PassRefPtr<IdleRequestCallbackWrapper> callbackWrapper) { | 46 PassRefPtr<IdleRequestCallbackWrapper> callbackWrapper) { |
| 47 if (ScriptedIdleTaskController* controller = callbackWrapper->controller()) | 47 if (ScriptedIdleTaskController* controller = callbackWrapper->controller()) |
| 48 controller->callbackFired(callbackWrapper->id(), | 48 controller->callbackFired(callbackWrapper->id(), |
| 49 monotonicallyIncreasingTime(), | 49 monotonicallyIncreasingTime(), |
| 50 IdleDeadline::CallbackType::CalledByTimeout); | 50 IdleDeadline::CallbackType::CalledByTimeout); |
| 51 callbackWrapper->cancel(); | 51 callbackWrapper->cancel(); |
| 52 } | 52 } |
| 53 | 53 |
| 54 void cancel() { m_controller = nullptr; } | 54 void cancel() { m_controller = nullptr; } |
| 55 | 55 |
| 56 ScriptedIdleTaskController::CallbackId id() const { return m_id; } | 56 ScriptedIdleTaskController::CallbackId id() const { return m_id; } |
| 57 ScriptedIdleTaskController* controller() const { return m_controller; } | 57 ScriptedIdleTaskController* controller() const { return m_controller.get(); } |
| 58 | 58 |
| 59 private: | 59 private: |
| 60 IdleRequestCallbackWrapper(ScriptedIdleTaskController::CallbackId id, | 60 IdleRequestCallbackWrapper( |
| 61 ScriptedIdleTaskController* controller) | 61 ScriptedIdleTaskController::CallbackId id, |
| 62 WTF::WeakPtr<ScriptedIdleTaskController> controller) | |
| 62 : m_id(id), m_controller(controller) {} | 63 : m_id(id), m_controller(controller) {} |
| 63 | 64 |
| 64 ScriptedIdleTaskController::CallbackId m_id; | 65 ScriptedIdleTaskController::CallbackId m_id; |
| 65 Persistent<ScriptedIdleTaskController> m_controller; | 66 WTF::WeakPtr<ScriptedIdleTaskController> m_controller; |
|
sof
2017/01/06 09:31:04
WeakPersistent<> is used to hold onto GC-managed o
Xiaocheng
2017/01/06 09:56:28
Done.
Thanks!
| |
| 66 }; | 67 }; |
| 67 | 68 |
| 68 } // namespace internal | 69 } // namespace internal |
| 69 | 70 |
| 70 ScriptedIdleTaskController::ScriptedIdleTaskController( | 71 ScriptedIdleTaskController::ScriptedIdleTaskController( |
| 71 ExecutionContext* context) | 72 ExecutionContext* context) |
| 72 : SuspendableObject(context), | 73 : SuspendableObject(context), |
| 73 m_scheduler(Platform::current()->currentThread()->scheduler()), | 74 m_scheduler(Platform::current()->currentThread()->scheduler()), |
| 74 m_nextCallbackId(0), | 75 m_nextCallbackId(0), |
| 76 m_weakPtrFactory(this), | |
| 75 m_suspended(false) { | 77 m_suspended(false) { |
| 76 suspendIfNeeded(); | 78 suspendIfNeeded(); |
| 77 } | 79 } |
| 78 | 80 |
| 79 ScriptedIdleTaskController::~ScriptedIdleTaskController() {} | 81 ScriptedIdleTaskController::~ScriptedIdleTaskController() {} |
| 80 | 82 |
| 81 DEFINE_TRACE(ScriptedIdleTaskController) { | 83 DEFINE_TRACE(ScriptedIdleTaskController) { |
| 82 visitor->trace(m_callbacks); | 84 visitor->trace(m_callbacks); |
| 83 SuspendableObject::trace(visitor); | 85 SuspendableObject::trace(visitor); |
| 84 } | 86 } |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 97 | 99 |
| 98 ScriptedIdleTaskController::CallbackId | 100 ScriptedIdleTaskController::CallbackId |
| 99 ScriptedIdleTaskController::registerCallback( | 101 ScriptedIdleTaskController::registerCallback( |
| 100 IdleRequestCallback* callback, | 102 IdleRequestCallback* callback, |
| 101 const IdleRequestOptions& options) { | 103 const IdleRequestOptions& options) { |
| 102 CallbackId id = nextCallbackId(); | 104 CallbackId id = nextCallbackId(); |
| 103 m_callbacks.set(id, callback); | 105 m_callbacks.set(id, callback); |
| 104 long long timeoutMillis = options.timeout(); | 106 long long timeoutMillis = options.timeout(); |
| 105 | 107 |
| 106 RefPtr<internal::IdleRequestCallbackWrapper> callbackWrapper = | 108 RefPtr<internal::IdleRequestCallbackWrapper> callbackWrapper = |
| 107 internal::IdleRequestCallbackWrapper::create(id, this); | 109 internal::IdleRequestCallbackWrapper::create( |
| 110 id, m_weakPtrFactory.createWeakPtr()); | |
| 108 m_scheduler->postIdleTask( | 111 m_scheduler->postIdleTask( |
| 109 BLINK_FROM_HERE, | 112 BLINK_FROM_HERE, |
| 110 WTF::bind(&internal::IdleRequestCallbackWrapper::idleTaskFired, | 113 WTF::bind(&internal::IdleRequestCallbackWrapper::idleTaskFired, |
| 111 callbackWrapper)); | 114 callbackWrapper)); |
| 112 if (timeoutMillis > 0) | 115 if (timeoutMillis > 0) |
| 113 m_scheduler->timerTaskRunner()->postDelayedTask( | 116 m_scheduler->timerTaskRunner()->postDelayedTask( |
| 114 BLINK_FROM_HERE, | 117 BLINK_FROM_HERE, |
| 115 WTF::bind(&internal::IdleRequestCallbackWrapper::timeoutFired, | 118 WTF::bind(&internal::IdleRequestCallbackWrapper::timeoutFired, |
| 116 callbackWrapper), | 119 callbackWrapper), |
| 117 timeoutMillis); | 120 timeoutMillis); |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 183 std::max((monotonicallyIncreasingTime() - deadlineSeconds) * 1000, 0.0); | 186 std::max((monotonicallyIncreasingTime() - deadlineSeconds) * 1000, 0.0); |
| 184 | 187 |
| 185 DEFINE_STATIC_LOCAL( | 188 DEFINE_STATIC_LOCAL( |
| 186 CustomCountHistogram, idleCallbackOverrunHistogram, | 189 CustomCountHistogram, idleCallbackOverrunHistogram, |
| 187 ("WebCore.ScriptedIdleTaskController.IdleCallbackOverrun", 0, 10000, 50)); | 190 ("WebCore.ScriptedIdleTaskController.IdleCallbackOverrun", 0, 10000, 50)); |
| 188 idleCallbackOverrunHistogram.count(overrunMillis); | 191 idleCallbackOverrunHistogram.count(overrunMillis); |
| 189 } | 192 } |
| 190 | 193 |
| 191 void ScriptedIdleTaskController::contextDestroyed() { | 194 void ScriptedIdleTaskController::contextDestroyed() { |
| 192 m_callbacks.clear(); | 195 m_callbacks.clear(); |
| 196 m_weakPtrFactory.revokeAll(); | |
| 193 } | 197 } |
| 194 | 198 |
| 195 void ScriptedIdleTaskController::suspend() { | 199 void ScriptedIdleTaskController::suspend() { |
| 196 m_suspended = true; | 200 m_suspended = true; |
| 197 } | 201 } |
| 198 | 202 |
| 199 void ScriptedIdleTaskController::resume() { | 203 void ScriptedIdleTaskController::resume() { |
| 200 DCHECK(m_suspended); | 204 DCHECK(m_suspended); |
| 201 m_suspended = false; | 205 m_suspended = false; |
| 202 | 206 |
| 203 // Run any pending timeouts. | 207 // Run any pending timeouts. |
| 204 Vector<CallbackId> pendingTimeouts; | 208 Vector<CallbackId> pendingTimeouts; |
| 205 m_pendingTimeouts.swap(pendingTimeouts); | 209 m_pendingTimeouts.swap(pendingTimeouts); |
| 206 for (auto& id : pendingTimeouts) | 210 for (auto& id : pendingTimeouts) |
| 207 runCallback(id, monotonicallyIncreasingTime(), | 211 runCallback(id, monotonicallyIncreasingTime(), |
| 208 IdleDeadline::CallbackType::CalledByTimeout); | 212 IdleDeadline::CallbackType::CalledByTimeout); |
| 209 | 213 |
| 210 // Repost idle tasks for any remaining callbacks. | 214 // Repost idle tasks for any remaining callbacks. |
| 211 for (auto& callback : m_callbacks) { | 215 for (auto& callback : m_callbacks) { |
| 212 RefPtr<internal::IdleRequestCallbackWrapper> callbackWrapper = | 216 RefPtr<internal::IdleRequestCallbackWrapper> callbackWrapper = |
| 213 internal::IdleRequestCallbackWrapper::create(callback.key, this); | 217 internal::IdleRequestCallbackWrapper::create( |
| 218 callback.key, m_weakPtrFactory.createWeakPtr()); | |
| 214 m_scheduler->postIdleTask( | 219 m_scheduler->postIdleTask( |
| 215 BLINK_FROM_HERE, | 220 BLINK_FROM_HERE, |
| 216 WTF::bind(&internal::IdleRequestCallbackWrapper::idleTaskFired, | 221 WTF::bind(&internal::IdleRequestCallbackWrapper::idleTaskFired, |
| 217 callbackWrapper)); | 222 callbackWrapper)); |
| 218 } | 223 } |
| 219 } | 224 } |
| 220 | 225 |
| 221 } // namespace blink | 226 } // namespace blink |
| OLD | NEW |