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

Side by Side Diff: components/scheduler/child/webthread_impl_for_worker_scheduler.cc

Issue 2118903002: scheduler: Move the Blink scheduler into Blink (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 4 years, 4 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 "components/scheduler/child/webthread_impl_for_worker_scheduler.h"
6
7 #include "base/bind.h"
8 #include "base/location.h"
9 #include "base/memory/ptr_util.h"
10 #include "base/single_thread_task_runner.h"
11 #include "base/synchronization/waitable_event.h"
12 #include "base/time/default_tick_clock.h"
13 #include "components/scheduler/base/task_queue.h"
14 #include "components/scheduler/child/scheduler_tqm_delegate_impl.h"
15 #include "components/scheduler/child/web_scheduler_impl.h"
16 #include "components/scheduler/child/web_task_runner_impl.h"
17 #include "components/scheduler/child/worker_scheduler_impl.h"
18 #include "third_party/WebKit/public/platform/WebTraceLocation.h"
19
20 namespace scheduler {
21
22 WebThreadImplForWorkerScheduler::WebThreadImplForWorkerScheduler(
23 const char* name)
24 : WebThreadImplForWorkerScheduler(name, base::Thread::Options()) {}
25
26 WebThreadImplForWorkerScheduler::WebThreadImplForWorkerScheduler(
27 const char* name,
28 base::Thread::Options options)
29 : thread_(new base::Thread(name ? name : std::string())) {
30 bool started = thread_->StartWithOptions(options);
31 CHECK(started);
32 thread_task_runner_ = thread_->task_runner();
33 }
34
35 void WebThreadImplForWorkerScheduler::Init() {
36 base::WaitableEvent completion(
37 base::WaitableEvent::ResetPolicy::AUTOMATIC,
38 base::WaitableEvent::InitialState::NOT_SIGNALED);
39 thread_task_runner_->PostTask(
40 FROM_HERE, base::Bind(&WebThreadImplForWorkerScheduler::InitOnThread,
41 base::Unretained(this), &completion));
42 completion.Wait();
43 }
44
45 WebThreadImplForWorkerScheduler::~WebThreadImplForWorkerScheduler() {
46 if (task_runner_delegate_) {
47 base::WaitableEvent completion(
48 base::WaitableEvent::ResetPolicy::AUTOMATIC,
49 base::WaitableEvent::InitialState::NOT_SIGNALED);
50 // Restore the original task runner so that the thread can tear itself down.
51 thread_task_runner_->PostTask(
52 FROM_HERE,
53 base::Bind(&WebThreadImplForWorkerScheduler::RestoreTaskRunnerOnThread,
54 base::Unretained(this), &completion));
55 completion.Wait();
56 }
57 thread_->Stop();
58 }
59
60 void WebThreadImplForWorkerScheduler::InitOnThread(
61 base::WaitableEvent* completion) {
62 // TODO(alexclarke): Do we need to unify virtual time for workers and the
63 // main thread?
64 worker_scheduler_ = CreateWorkerScheduler();
65 worker_scheduler_->Init();
66 task_runner_ = worker_scheduler_->DefaultTaskRunner();
67 idle_task_runner_ = worker_scheduler_->IdleTaskRunner();
68 web_scheduler_.reset(new WebSchedulerImpl(
69 worker_scheduler_.get(), worker_scheduler_->IdleTaskRunner(),
70 worker_scheduler_->DefaultTaskRunner(),
71 worker_scheduler_->DefaultTaskRunner()));
72 base::MessageLoop::current()->AddDestructionObserver(this);
73 web_task_runner_ = base::WrapUnique(new WebTaskRunnerImpl(task_runner_));
74 completion->Signal();
75 }
76
77 void WebThreadImplForWorkerScheduler::RestoreTaskRunnerOnThread(
78 base::WaitableEvent* completion) {
79 task_runner_delegate_->RestoreDefaultTaskRunner();
80 completion->Signal();
81 }
82
83 void WebThreadImplForWorkerScheduler::WillDestroyCurrentMessageLoop() {
84 task_runner_ = nullptr;
85 idle_task_runner_ = nullptr;
86 web_scheduler_.reset();
87 worker_scheduler_.reset();
88 }
89
90 std::unique_ptr<scheduler::WorkerScheduler>
91 WebThreadImplForWorkerScheduler::CreateWorkerScheduler() {
92 task_runner_delegate_ = SchedulerTqmDelegateImpl::Create(
93 thread_->message_loop(), base::WrapUnique(new base::DefaultTickClock()));
94 return WorkerScheduler::Create(task_runner_delegate_);
95 }
96
97 blink::PlatformThreadId WebThreadImplForWorkerScheduler::threadId() const {
98 return thread_->GetThreadId();
99 }
100
101 blink::WebScheduler* WebThreadImplForWorkerScheduler::scheduler() const {
102 return web_scheduler_.get();
103 }
104
105 base::SingleThreadTaskRunner* WebThreadImplForWorkerScheduler::GetTaskRunner()
106 const {
107 return task_runner_.get();
108 }
109
110 SingleThreadIdleTaskRunner* WebThreadImplForWorkerScheduler::GetIdleTaskRunner()
111 const {
112 return idle_task_runner_.get();
113 }
114
115 blink::WebTaskRunner* WebThreadImplForWorkerScheduler::getWebTaskRunner() {
116 return web_task_runner_.get();
117 }
118
119 void WebThreadImplForWorkerScheduler::AddTaskObserverInternal(
120 base::MessageLoop::TaskObserver* observer) {
121 worker_scheduler_->AddTaskObserver(observer);
122 }
123
124 void WebThreadImplForWorkerScheduler::RemoveTaskObserverInternal(
125 base::MessageLoop::TaskObserver* observer) {
126 worker_scheduler_->RemoveTaskObserver(observer);
127 }
128
129 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698