Index: components/scheduler/child/webthread_impl_for_worker_scheduler.cc |
diff --git a/components/scheduler/child/webthread_impl_for_worker_scheduler.cc b/components/scheduler/child/webthread_impl_for_worker_scheduler.cc |
index 87ac8208c746bd5b5b01dc10baa27ba93c296749..cf9322dfb882860989488722057e0a34c495f580 100644 |
--- a/components/scheduler/child/webthread_impl_for_worker_scheduler.cc |
+++ b/components/scheduler/child/webthread_impl_for_worker_scheduler.cc |
@@ -8,7 +8,7 @@ |
#include "base/location.h" |
#include "base/single_thread_task_runner.h" |
#include "base/synchronization/waitable_event.h" |
-#include "components/scheduler/child/scheduler_message_loop_delegate.h" |
+#include "components/scheduler/child/scheduler_task_runner_delegate_impl.h" |
#include "components/scheduler/child/web_scheduler_impl.h" |
#include "components/scheduler/child/worker_scheduler_impl.h" |
#include "third_party/WebKit/public/platform/WebTraceLocation.h" |
@@ -19,21 +19,31 @@ WebThreadImplForWorkerScheduler::WebThreadImplForWorkerScheduler( |
const char* name) |
: thread_(new base::Thread(name)) { |
thread_->Start(); |
+ thread_task_runner_ = thread_->task_runner(); |
base::WaitableEvent completion(false, false); |
- thread_->task_runner()->PostTask( |
+ thread_task_runner_->PostTask( |
FROM_HERE, base::Bind(&WebThreadImplForWorkerScheduler::InitOnThread, |
base::Unretained(this), &completion)); |
completion.Wait(); |
} |
WebThreadImplForWorkerScheduler::~WebThreadImplForWorkerScheduler() { |
+ base::WaitableEvent completion(false, false); |
+ // Restore the original task runner so that the thread can tear itself down. |
+ thread_task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&WebThreadImplForWorkerScheduler::RestoreTaskRunnerOnThread, |
+ base::Unretained(this), &completion)); |
+ completion.Wait(); |
thread_->Stop(); |
} |
void WebThreadImplForWorkerScheduler::InitOnThread( |
base::WaitableEvent* completion) { |
- worker_scheduler_ = WorkerScheduler::Create(thread_->message_loop()); |
+ task_runner_delegate_ = |
+ SchedulerTaskRunnerDelegateImpl::Create(thread_->message_loop()); |
+ worker_scheduler_ = WorkerScheduler::Create(task_runner_delegate_); |
worker_scheduler_->Init(); |
task_runner_ = worker_scheduler_->DefaultTaskRunner(); |
idle_task_runner_ = worker_scheduler_->IdleTaskRunner(); |
@@ -45,6 +55,12 @@ void WebThreadImplForWorkerScheduler::InitOnThread( |
completion->Signal(); |
} |
+void WebThreadImplForWorkerScheduler::RestoreTaskRunnerOnThread( |
+ base::WaitableEvent* completion) { |
+ task_runner_delegate_->RestoreDefaultTaskRunner(); |
+ completion->Signal(); |
+} |
+ |
void WebThreadImplForWorkerScheduler::WillDestroyCurrentMessageLoop() { |
task_runner_ = nullptr; |
idle_task_runner_ = nullptr; |