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

Side by Side Diff: sky/viewer/platform/webthread_impl.cc

Issue 673033002: Remove WebThread (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 6 years, 1 month 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
« no previous file with comments | « sky/viewer/platform/webthread_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 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 // An implementation of WebThread in terms of base::MessageLoop and
6 // base::Thread
7
8 #include "sky/viewer/platform/webthread_impl.h"
9
10 #include "base/bind.h"
11 #include "base/bind_helpers.h"
12 #include "base/message_loop/message_loop.h"
13 #include "base/pending_task.h"
14 #include "base/threading/platform_thread.h"
15 #include "mojo/common/message_pump_mojo.h"
16
17 namespace sky {
18
19 using mojo::common::MessagePumpMojo;
20
21 WebThreadBase::WebThreadBase() {}
22 WebThreadBase::~WebThreadBase() {}
23
24 class WebThreadBase::TaskObserverAdapter
25 : public base::MessageLoop::TaskObserver {
26 public:
27 TaskObserverAdapter(WebThread::TaskObserver* observer)
28 : observer_(observer) {}
29
30 virtual void WillProcessTask(const base::PendingTask& pending_task) override {
31 observer_->willProcessTask();
32 }
33
34 virtual void DidProcessTask(const base::PendingTask& pending_task) override {
35 observer_->didProcessTask();
36 }
37
38 private:
39 WebThread::TaskObserver* observer_;
40 };
41
42 class WebThreadBase::SignalObserverAdapter
43 : public MessagePumpMojo::Observer {
44 public:
45 SignalObserverAdapter(WebThread::TaskObserver* observer)
46 : observer_(observer) {}
47
48 virtual void WillSignalHandler() override {
49 observer_->willProcessTask();
50 }
51
52 virtual void DidSignalHandler() override {
53 observer_->didProcessTask();
54 }
55
56 private:
57 WebThread::TaskObserver* observer_;
58 };
59
60 void WebThreadBase::addTaskObserver(TaskObserver* observer) {
61 CHECK(isCurrentThread());
62 std::pair<ObserverMap::iterator, bool> result = observer_map_.insert(
63 std::make_pair(observer, Adaptors()));
64 if (result.second) {
65 result.first->second.task_adaptor = new TaskObserverAdapter(observer);
66 result.first->second.signal_adaptor = new SignalObserverAdapter(observer);
67 }
68 base::MessageLoop::current()->AddTaskObserver(
69 result.first->second.task_adaptor);
70 MessagePumpMojo::current()->AddObserver(result.first->second.signal_adaptor);
71 }
72
73 void WebThreadBase::removeTaskObserver(TaskObserver* observer) {
74 CHECK(isCurrentThread());
75 ObserverMap::iterator iter = observer_map_.find(observer);
76 if (iter == observer_map_.end())
77 return;
78 base::MessageLoop::current()->RemoveTaskObserver(iter->second.task_adaptor);
79 MessagePumpMojo::current()->RemoveObserver(iter->second.signal_adaptor);
80 delete iter->second.task_adaptor;
81 delete iter->second.signal_adaptor;
82 observer_map_.erase(iter);
83 }
84
85 WebThreadImpl::WebThreadImpl(const char* name)
86 : thread_(new base::Thread(name)) {
87 thread_->Start();
88 }
89
90 void WebThreadImpl::postTask(Task* task) {
91 thread_->message_loop()->PostTask(
92 FROM_HERE, base::Bind(&blink::WebThread::Task::run, base::Owned(task)));
93 }
94
95 void WebThreadImpl::postDelayedTask(Task* task, long long delay_ms) {
96 thread_->message_loop()->PostDelayedTask(
97 FROM_HERE,
98 base::Bind(&blink::WebThread::Task::run, base::Owned(task)),
99 base::TimeDelta::FromMilliseconds(delay_ms));
100 }
101
102 void WebThreadImpl::enterRunLoop() {
103 CHECK(isCurrentThread());
104 CHECK(!thread_->message_loop()->is_running()); // We don't support nesting.
105 thread_->message_loop()->Run();
106 }
107
108 void WebThreadImpl::exitRunLoop() {
109 CHECK(isCurrentThread());
110 CHECK(thread_->message_loop()->is_running());
111 thread_->message_loop()->Quit();
112 }
113
114 bool WebThreadImpl::isCurrentThread() const {
115 return thread_->thread_id() == base::PlatformThread::CurrentId();
116 }
117
118 blink::PlatformThreadId WebThreadImpl::threadId() const {
119 return thread_->thread_id();
120 }
121
122 WebThreadImpl::~WebThreadImpl() {
123 thread_->Stop();
124 }
125
126 WebThreadImplForMessageLoop::WebThreadImplForMessageLoop(
127 base::MessageLoopProxy* message_loop)
128 : message_loop_(message_loop) {}
129
130 void WebThreadImplForMessageLoop::postTask(Task* task) {
131 message_loop_->PostTask(
132 FROM_HERE, base::Bind(&blink::WebThread::Task::run, base::Owned(task)));
133 }
134
135 void WebThreadImplForMessageLoop::postDelayedTask(Task* task,
136 long long delay_ms) {
137 message_loop_->PostDelayedTask(
138 FROM_HERE,
139 base::Bind(&blink::WebThread::Task::run, base::Owned(task)),
140 base::TimeDelta::FromMilliseconds(delay_ms));
141 }
142
143 void WebThreadImplForMessageLoop::enterRunLoop() {
144 CHECK(isCurrentThread());
145 // We don't support nesting.
146 CHECK(!base::MessageLoop::current()->is_running());
147 base::MessageLoop::current()->Run();
148 }
149
150 void WebThreadImplForMessageLoop::exitRunLoop() {
151 CHECK(isCurrentThread());
152 CHECK(base::MessageLoop::current()->is_running());
153 base::MessageLoop::current()->Quit();
154 }
155
156 bool WebThreadImplForMessageLoop::isCurrentThread() const {
157 return message_loop_->BelongsToCurrentThread();
158 }
159
160 blink::PlatformThreadId WebThreadImplForMessageLoop::threadId() const {
161 return thread_id_;
162 }
163
164 WebThreadImplForMessageLoop::~WebThreadImplForMessageLoop() {}
165
166 } // namespace sky
OLDNEW
« no previous file with comments | « sky/viewer/platform/webthread_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698