Chromium Code Reviews| Index: content/renderer/scheduler/webthread_impl_for_scheduler.cc |
| diff --git a/content/renderer/scheduler/webthread_impl_for_scheduler.cc b/content/renderer/scheduler/webthread_impl_for_scheduler.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c841a26eb16b56ed3cdc408572781ce2e3672b26 |
| --- /dev/null |
| +++ b/content/renderer/scheduler/webthread_impl_for_scheduler.cc |
| @@ -0,0 +1,130 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/renderer/scheduler/webthread_impl_for_scheduler.h" |
| + |
| +#include "content/renderer/scheduler/renderer_scheduler.h" |
| +#include "third_party/WebKit/public/platform/WebTraceLocation.h" |
| + |
| +namespace content { |
| +namespace internal { |
| +// Observes tasks both from a MessageLoop and a RendererScheduler which is |
| +// driven by that MessageLoop and filters out redundant task observer |
| +// notifications. |
| +class NestedTaskObserver { |
| + public: |
| + NestedTaskObserver(base::MessageLoop* message_loop, |
| + RendererScheduler* scheduler, |
| + blink::WebThread::TaskObserver* client_observer) |
| + : message_loop_(message_loop), |
| + scheduler_(scheduler), |
| + client_observer_(client_observer), |
| + message_loop_observer_(this), |
| + scheduler_observer_(this), |
| + inside_task_(false) { |
| + message_loop_->AddTaskObserver(&message_loop_observer_); |
| + scheduler_->AddTaskObserver(&scheduler_observer_); |
| + } |
| + |
| + ~NestedTaskObserver() { |
| + message_loop_->RemoveTaskObserver(&message_loop_observer_); |
| + scheduler_->RemoveTaskObserver(&scheduler_observer_); |
| + } |
| + |
| + private: |
| + class MessageLoopTaskObserver : public base::MessageLoop::TaskObserver { |
| + public: |
| + MessageLoopTaskObserver(NestedTaskObserver* self) : self_(self) {} |
| + |
| + void WillProcessTask(const base::PendingTask& pending_task) override { |
| + self_->WillProcessTask(); |
| + } |
| + |
| + void DidProcessTask(const base::PendingTask& pending_task) override { |
| + self_->DidProcessTask(); |
| + } |
| + |
| + private: |
| + NestedTaskObserver* self_; |
|
alex clarke (OOO till 29th)
2015/02/19 10:35:35
nit: it can't be 'self' since c++ inner classes ar
Sami
2015/02/19 11:28:40
Right, parent_ sgtm.
|
| + }; |
| + |
| + class SchedulerTaskObserver : public base::MessageLoop::TaskObserver { |
| + public: |
| + SchedulerTaskObserver(NestedTaskObserver* self) : self_(self) {} |
| + |
| + void WillProcessTask(const base::PendingTask& pending_task) override { |
| + self_->WillProcessTask(); |
| + } |
| + |
| + void DidProcessTask(const base::PendingTask& pending_task) override { |
| + self_->DidProcessTask(); |
| + } |
| + |
| + private: |
| + NestedTaskObserver* self_; |
| + }; |
| + |
| + void WillProcessTask() { |
| + if (!inside_task_) { |
| + inside_task_ = true; |
| + client_observer_->willProcessTask(); |
| + } |
| + } |
| + |
| + void DidProcessTask() { |
| + if (inside_task_) { |
| + inside_task_ = false; |
| + client_observer_->didProcessTask(); |
| + } |
| + } |
| + |
| + base::MessageLoop* message_loop_; // Not owned. |
| + RendererScheduler* scheduler_; // Not owned. |
| + blink::WebThread::TaskObserver* client_observer_; // Not owned. |
| + MessageLoopTaskObserver message_loop_observer_; |
| + SchedulerTaskObserver scheduler_observer_; |
| + |
| + bool inside_task_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(NestedTaskObserver); |
| +}; |
| +} // namespace internal |
| + |
| +WebThreadImplForScheduler::WebThreadImplForScheduler( |
| + RendererScheduler* scheduler) |
| + : task_runner_(scheduler->DefaultTaskRunner()), |
| + scheduler_(scheduler), |
| + thread_id_(base::PlatformThread::CurrentId()) { |
| +} |
| + |
| +WebThreadImplForScheduler::~WebThreadImplForScheduler() { |
| +} |
| + |
| +blink::PlatformThreadId WebThreadImplForScheduler::threadId() const { |
| + return thread_id_; |
| +} |
| + |
| +base::MessageLoop* WebThreadImplForScheduler::MessageLoop() const { |
| + DCHECK(isCurrentThread()); |
| + return base::MessageLoop::current(); |
| +} |
| + |
| +base::SingleThreadTaskRunner* WebThreadImplForScheduler::TaskRunner() const { |
| + return task_runner_.get(); |
| +} |
| + |
| +void WebThreadImplForScheduler::addTaskObserver(TaskObserver* observer) { |
| + CHECK(isCurrentThread()); |
| + if (nested_task_observer_map_.contains(observer)) |
| + return; |
| + nested_task_observer_map_.add( |
| + observer, make_scoped_ptr(new internal::NestedTaskObserver( |
| + MessageLoop(), scheduler_, observer))); |
| +} |
| + |
| +void WebThreadImplForScheduler::removeTaskObserver(TaskObserver* observer) { |
| + nested_task_observer_map_.erase(observer); |
| +} |
| + |
| +} // namespace content |