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