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

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

Issue 1589463002: compositor worker: Use a WebThread for the compositor thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix-mandoline-tests Created 4 years, 11 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
1 // Copyright 2015 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/scheduler/child/webthread_impl_for_worker_scheduler.h" 5 #include "components/scheduler/child/webthread_impl_for_worker_scheduler.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/single_thread_task_runner.h" 9 #include "base/single_thread_task_runner.h"
10 #include "base/synchronization/waitable_event.h" 10 #include "base/synchronization/waitable_event.h"
(...skipping 22 matching lines...) Expand all
33 33
34 void WebThreadImplForWorkerScheduler::Init() { 34 void WebThreadImplForWorkerScheduler::Init() {
35 base::WaitableEvent completion(false, false); 35 base::WaitableEvent completion(false, false);
36 thread_task_runner_->PostTask( 36 thread_task_runner_->PostTask(
37 FROM_HERE, base::Bind(&WebThreadImplForWorkerScheduler::InitOnThread, 37 FROM_HERE, base::Bind(&WebThreadImplForWorkerScheduler::InitOnThread,
38 base::Unretained(this), &completion)); 38 base::Unretained(this), &completion));
39 completion.Wait(); 39 completion.Wait();
40 } 40 }
41 41
42 WebThreadImplForWorkerScheduler::~WebThreadImplForWorkerScheduler() { 42 WebThreadImplForWorkerScheduler::~WebThreadImplForWorkerScheduler() {
43 base::WaitableEvent completion(false, false); 43 if (task_runner_delegate_) {
44 // Restore the original task runner so that the thread can tear itself down. 44 base::WaitableEvent completion(false, false);
45 thread_task_runner_->PostTask( 45 // Restore the original task runner so that the thread can tear itself down.
46 FROM_HERE, 46 thread_task_runner_->PostTask(
47 base::Bind(&WebThreadImplForWorkerScheduler::RestoreTaskRunnerOnThread, 47 FROM_HERE,
48 base::Unretained(this), &completion)); 48 base::Bind(&WebThreadImplForWorkerScheduler::RestoreTaskRunnerOnThread,
49 completion.Wait(); 49 base::Unretained(this), &completion));
50 completion.Wait();
51 }
50 thread_->Stop(); 52 thread_->Stop();
51 } 53 }
52 54
53 void WebThreadImplForWorkerScheduler::InitOnThread( 55 void WebThreadImplForWorkerScheduler::InitOnThread(
54 base::WaitableEvent* completion) { 56 base::WaitableEvent* completion) {
55 // TODO(alexclarke): Do we need to unify virtual time for workers and the 57 // TODO(alexclarke): Do we need to unify virtual time for workers and the
56 // main thread? 58 // main thread?
57 task_runner_delegate_ = SchedulerTqmDelegateImpl::Create( 59 worker_scheduler_ = CreateWorkerScheduler();
58 thread_->message_loop(), make_scoped_ptr(new base::DefaultTickClock()));
59 worker_scheduler_ = WorkerScheduler::Create(task_runner_delegate_);
60 worker_scheduler_->Init(); 60 worker_scheduler_->Init();
61 if (UseThreadTaskRunnerAsDefault()) 61 task_runner_ = worker_scheduler_->DefaultTaskRunner();
62 task_runner_ = thread_task_runner_;
63 else
64 task_runner_ = worker_scheduler_->DefaultTaskRunner();
65 idle_task_runner_ = worker_scheduler_->IdleTaskRunner(); 62 idle_task_runner_ = worker_scheduler_->IdleTaskRunner();
66 web_scheduler_.reset(new WebSchedulerImpl( 63 web_scheduler_.reset(new WebSchedulerImpl(
67 worker_scheduler_.get(), worker_scheduler_->IdleTaskRunner(), 64 worker_scheduler_.get(), worker_scheduler_->IdleTaskRunner(),
68 worker_scheduler_->DefaultTaskRunner(), 65 worker_scheduler_->DefaultTaskRunner(),
69 worker_scheduler_->DefaultTaskRunner())); 66 worker_scheduler_->DefaultTaskRunner()));
70 base::MessageLoop::current()->AddDestructionObserver(this); 67 base::MessageLoop::current()->AddDestructionObserver(this);
71 web_task_runner_ = make_scoped_ptr(new WebTaskRunnerImpl(task_runner_)); 68 web_task_runner_ = make_scoped_ptr(new WebTaskRunnerImpl(task_runner_));
72 completion->Signal(); 69 completion->Signal();
73 } 70 }
74 71
75 void WebThreadImplForWorkerScheduler::RestoreTaskRunnerOnThread( 72 void WebThreadImplForWorkerScheduler::RestoreTaskRunnerOnThread(
76 base::WaitableEvent* completion) { 73 base::WaitableEvent* completion) {
77 task_runner_delegate_->RestoreDefaultTaskRunner(); 74 task_runner_delegate_->RestoreDefaultTaskRunner();
78 completion->Signal(); 75 completion->Signal();
79 } 76 }
80 77
81 void WebThreadImplForWorkerScheduler::WillDestroyCurrentMessageLoop() { 78 void WebThreadImplForWorkerScheduler::WillDestroyCurrentMessageLoop() {
82 task_runner_ = nullptr; 79 task_runner_ = nullptr;
83 idle_task_runner_ = nullptr; 80 idle_task_runner_ = nullptr;
84 web_scheduler_.reset(); 81 web_scheduler_.reset();
85 worker_scheduler_.reset(); 82 worker_scheduler_.reset();
86 } 83 }
87 84
88 bool WebThreadImplForWorkerScheduler::UseThreadTaskRunnerAsDefault() const { 85 scoped_ptr<scheduler::WorkerScheduler>
89 return false; 86 WebThreadImplForWorkerScheduler::CreateWorkerScheduler() {
87 task_runner_delegate_ = SchedulerTqmDelegateImpl::Create(
88 thread_->message_loop(), make_scoped_ptr(new base::DefaultTickClock()));
89 return WorkerScheduler::Create(task_runner_delegate_);
90 } 90 }
91 91
92 blink::PlatformThreadId WebThreadImplForWorkerScheduler::threadId() const { 92 blink::PlatformThreadId WebThreadImplForWorkerScheduler::threadId() const {
93 return thread_->GetThreadId(); 93 return thread_->GetThreadId();
94 } 94 }
95 95
96 blink::WebScheduler* WebThreadImplForWorkerScheduler::scheduler() const { 96 blink::WebScheduler* WebThreadImplForWorkerScheduler::scheduler() const {
97 return web_scheduler_.get(); 97 return web_scheduler_.get();
98 } 98 }
99 99
(...skipping 15 matching lines...) Expand all
115 base::MessageLoop::TaskObserver* observer) { 115 base::MessageLoop::TaskObserver* observer) {
116 worker_scheduler_->AddTaskObserver(observer); 116 worker_scheduler_->AddTaskObserver(observer);
117 } 117 }
118 118
119 void WebThreadImplForWorkerScheduler::RemoveTaskObserverInternal( 119 void WebThreadImplForWorkerScheduler::RemoveTaskObserverInternal(
120 base::MessageLoop::TaskObserver* observer) { 120 base::MessageLoop::TaskObserver* observer) {
121 worker_scheduler_->RemoveTaskObserver(observer); 121 worker_scheduler_->RemoveTaskObserver(observer);
122 } 122 }
123 123
124 } // namespace scheduler 124 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698