OLD | NEW |
---|---|
(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 | |
OLD | NEW |