Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(490)

Side by Side Diff: content/renderer/scheduler/webthread_impl_for_scheduler.cc

Issue 922733002: scheduler: Implement task observers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add a nested task observer. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "content/renderer/scheduler/webthread_impl_for_scheduler.h"
6
7 #include "content/renderer/scheduler/renderer_scheduler.h"
8 #include "third_party/WebKit/public/platform/WebTraceLocation.h"
9
10 namespace content {
11 namespace internal {
12 // Observes tasks both from a MessageLoop and a RendererScheduler which is
13 // driven by that MessageLoop and filters out redundant task observer
14 // notifications.
15 class NestedTaskObserver {
16 public:
17 NestedTaskObserver(base::MessageLoop* message_loop,
18 RendererScheduler* scheduler,
19 blink::WebThread::TaskObserver* client_observer)
20 : message_loop_(message_loop),
21 scheduler_(scheduler),
22 client_observer_(client_observer),
23 message_loop_observer_(this),
24 scheduler_observer_(this),
25 inside_task_(false) {
26 message_loop_->AddTaskObserver(&message_loop_observer_);
27 scheduler_->AddTaskObserver(&scheduler_observer_);
28 }
29
30 ~NestedTaskObserver() {
31 message_loop_->RemoveTaskObserver(&message_loop_observer_);
32 scheduler_->RemoveTaskObserver(&scheduler_observer_);
33 }
34
35 private:
36 class MessageLoopTaskObserver : public base::MessageLoop::TaskObserver {
37 public:
38 MessageLoopTaskObserver(NestedTaskObserver* self) : self_(self) {}
39
40 void WillProcessTask(const base::PendingTask& pending_task) override {
41 self_->WillProcessTask();
42 }
43
44 void DidProcessTask(const base::PendingTask& pending_task) override {
45 self_->DidProcessTask();
46 }
47
48 private:
49 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.
50 };
51
52 class SchedulerTaskObserver : public base::MessageLoop::TaskObserver {
53 public:
54 SchedulerTaskObserver(NestedTaskObserver* self) : self_(self) {}
55
56 void WillProcessTask(const base::PendingTask& pending_task) override {
57 self_->WillProcessTask();
58 }
59
60 void DidProcessTask(const base::PendingTask& pending_task) override {
61 self_->DidProcessTask();
62 }
63
64 private:
65 NestedTaskObserver* self_;
66 };
67
68 void WillProcessTask() {
69 if (!inside_task_) {
70 inside_task_ = true;
71 client_observer_->willProcessTask();
72 }
73 }
74
75 void DidProcessTask() {
76 if (inside_task_) {
77 inside_task_ = false;
78 client_observer_->didProcessTask();
79 }
80 }
81
82 base::MessageLoop* message_loop_; // Not owned.
83 RendererScheduler* scheduler_; // Not owned.
84 blink::WebThread::TaskObserver* client_observer_; // Not owned.
85 MessageLoopTaskObserver message_loop_observer_;
86 SchedulerTaskObserver scheduler_observer_;
87
88 bool inside_task_;
89
90 DISALLOW_COPY_AND_ASSIGN(NestedTaskObserver);
91 };
92 } // namespace internal
93
94 WebThreadImplForScheduler::WebThreadImplForScheduler(
95 RendererScheduler* scheduler)
96 : task_runner_(scheduler->DefaultTaskRunner()),
97 scheduler_(scheduler),
98 thread_id_(base::PlatformThread::CurrentId()) {
99 }
100
101 WebThreadImplForScheduler::~WebThreadImplForScheduler() {
102 }
103
104 blink::PlatformThreadId WebThreadImplForScheduler::threadId() const {
105 return thread_id_;
106 }
107
108 base::MessageLoop* WebThreadImplForScheduler::MessageLoop() const {
109 DCHECK(isCurrentThread());
110 return base::MessageLoop::current();
111 }
112
113 base::SingleThreadTaskRunner* WebThreadImplForScheduler::TaskRunner() const {
114 return task_runner_.get();
115 }
116
117 void WebThreadImplForScheduler::addTaskObserver(TaskObserver* observer) {
118 CHECK(isCurrentThread());
119 if (nested_task_observer_map_.contains(observer))
120 return;
121 nested_task_observer_map_.add(
122 observer, make_scoped_ptr(new internal::NestedTaskObserver(
123 MessageLoop(), scheduler_, observer)));
124 }
125
126 void WebThreadImplForScheduler::removeTaskObserver(TaskObserver* observer) {
127 nested_task_observer_map_.erase(observer);
128 }
129
130 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698