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

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

Issue 1106213002: Adds a SHUTDOWN_TASK_QUEUE and a PreShutdown api to the scheduler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review comments. Created 5 years, 7 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/synchronization/waitable_event.h" 8 #include "base/synchronization/waitable_event.h"
9 #include "components/scheduler/child/scheduler_message_loop_delegate.h" 9 #include "components/scheduler/child/scheduler_message_loop_delegate.h"
10 #include "components/scheduler/child/web_scheduler_impl.h" 10 #include "components/scheduler/child/web_scheduler_impl.h"
11 #include "components/scheduler/child/worker_scheduler_impl.h" 11 #include "components/scheduler/child/worker_scheduler_impl.h"
12 #include "third_party/WebKit/public/platform/WebTraceLocation.h" 12 #include "third_party/WebKit/public/platform/WebTraceLocation.h"
13 13
14 namespace scheduler { 14 namespace scheduler {
15 15
16 WebThreadImplForWorkerScheduler::WebThreadImplForWorkerScheduler( 16 WebThreadImplForWorkerScheduler::WebThreadImplForWorkerScheduler(
17 const char* name) 17 const char* name)
18 : thread_(new base::Thread(name)) { 18 : thread_(new base::Thread(name)) {
19 thread_->Start(); 19 thread_->Start();
20 20
21 base::WaitableEvent completion(false, false); 21 base::WaitableEvent completion(false, false);
22 thread_->message_loop()->PostTask( 22 thread_->message_loop()->PostTask(
23 FROM_HERE, base::Bind(&WebThreadImplForWorkerScheduler::InitOnThread, 23 FROM_HERE, base::Bind(&WebThreadImplForWorkerScheduler::InitOnThread,
24 base::Unretained(this), &completion)); 24 base::Unretained(this), &completion));
25 completion.Wait(); 25 completion.Wait();
26 } 26 }
27 27
28 WebThreadImplForWorkerScheduler::~WebThreadImplForWorkerScheduler() { 28 WebThreadImplForWorkerScheduler::~WebThreadImplForWorkerScheduler() {
29 base::WaitableEvent completion(false, false); 29 base::WaitableEvent completion(false, false);
30 // We need to post the shutdown task on the scheduler's task queue or tasks 30 // We need to post the shutdown task on the scheduler's shutdown task queue or
31 // posted on the worker scheduler may not get run when the thread is deleted. 31 // other (shutdown) tasks posted on the worker scheduler may not get run when
32 TaskRunner()->PostTask( 32 // the thread is deleted.
33 worker_scheduler_->ShutdownTaskRunner()->PostTask(
33 FROM_HERE, base::Bind(&WebThreadImplForWorkerScheduler::ShutDownOnThread, 34 FROM_HERE, base::Bind(&WebThreadImplForWorkerScheduler::ShutDownOnThread,
34 base::Unretained(this), &completion)); 35 base::Unretained(this), &completion));
35 completion.Wait(); 36 completion.Wait();
36 37
37 thread_->Stop(); 38 thread_->Stop();
38 } 39 }
39 40
40 void WebThreadImplForWorkerScheduler::InitOnThread( 41 void WebThreadImplForWorkerScheduler::InitOnThread(
41 base::WaitableEvent* completion) { 42 base::WaitableEvent* completion) {
42 worker_scheduler_ = WorkerScheduler::Create(thread_->message_loop()); 43 worker_scheduler_ = WorkerScheduler::Create(thread_->message_loop());
43 worker_scheduler_->Init(); 44 worker_scheduler_->Init();
44 task_runner_ = worker_scheduler_->DefaultTaskRunner(); 45 task_runner_ = worker_scheduler_->DefaultTaskRunner();
45 idle_task_runner_ = worker_scheduler_->IdleTaskRunner(); 46 idle_task_runner_ = worker_scheduler_->IdleTaskRunner();
46 web_scheduler_.reset(new WebSchedulerImpl( 47 web_scheduler_.reset(new WebSchedulerImpl(
47 worker_scheduler_.get(), worker_scheduler_->IdleTaskRunner(), 48 worker_scheduler_.get(), worker_scheduler_->IdleTaskRunner(),
48 worker_scheduler_->DefaultTaskRunner(), 49 worker_scheduler_->DefaultTaskRunner(),
49 worker_scheduler_->DefaultTaskRunner())); 50 worker_scheduler_->DefaultTaskRunner(),
51 worker_scheduler_->ShutdownTaskRunner()));
50 completion->Signal(); 52 completion->Signal();
51 } 53 }
52 54
53 void WebThreadImplForWorkerScheduler::ShutDownOnThread( 55 void WebThreadImplForWorkerScheduler::ShutDownOnThread(
54 base::WaitableEvent* completion) { 56 base::WaitableEvent* completion) {
55 task_runner_ = nullptr; 57 task_runner_ = nullptr;
56 idle_task_runner_ = nullptr; 58 idle_task_runner_ = nullptr;
57 web_scheduler_.reset(); 59 web_scheduler_.reset();
58 worker_scheduler_.reset(); 60 worker_scheduler_.reset();
59 completion->Signal(); 61 completion->Signal();
(...skipping 26 matching lines...) Expand all
86 base::MessageLoop::TaskObserver* observer) { 88 base::MessageLoop::TaskObserver* observer) {
87 worker_scheduler_->AddTaskObserver(observer); 89 worker_scheduler_->AddTaskObserver(observer);
88 } 90 }
89 91
90 void WebThreadImplForWorkerScheduler::RemoveTaskObserverInternal( 92 void WebThreadImplForWorkerScheduler::RemoveTaskObserverInternal(
91 base::MessageLoop::TaskObserver* observer) { 93 base::MessageLoop::TaskObserver* observer) {
92 worker_scheduler_->RemoveTaskObserver(observer); 94 worker_scheduler_->RemoveTaskObserver(observer);
93 } 95 }
94 96
95 } // namespace scheduler 97 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698