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

Unified Diff: content/child/scheduler/webthread_impl_for_worker_scheduler.cc

Issue 1033643004: Add a WorkerScheduler and a WebThreadImplForWorker (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix bug where tasks posted to a worker thread did not always run when the thread was shutdown Created 5 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: content/child/scheduler/webthread_impl_for_worker_scheduler.cc
diff --git a/content/child/scheduler/webthread_impl_for_worker_scheduler.cc b/content/child/scheduler/webthread_impl_for_worker_scheduler.cc
new file mode 100644
index 0000000000000000000000000000000000000000..20379b1212f2ffaa05b2850e4326355412a1ebca
--- /dev/null
+++ b/content/child/scheduler/webthread_impl_for_worker_scheduler.cc
@@ -0,0 +1,85 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/child/scheduler/webthread_impl_for_worker_scheduler.h"
+
+#include "base/bind.h"
+#include "base/synchronization/waitable_event.h"
+#include "content/child/scheduler/scheduler_message_loop_delegate.h"
+#include "content/child/scheduler/worker_scheduler_impl.h"
+#include "third_party/WebKit/public/platform/WebTraceLocation.h"
+
+namespace content {
+
+WebThreadImplForWorkerScheduler::WebThreadImplForWorkerScheduler(
+ const char* name)
+ : thread_(new base::Thread(name)) {
+ thread_->Start();
+
+ base::WaitableEvent completion(false, false);
+ thread_->message_loop()->PostTask(
+ FROM_HERE, base::Bind(&WebThreadImplForWorkerScheduler::InitOnThread,
+ base::Unretained(this), &completion));
+ completion.Wait();
+}
+
+WebThreadImplForWorkerScheduler::~WebThreadImplForWorkerScheduler() {
+ base::WaitableEvent completion(false, false);
+ // We need to post the shutdown task on the scheduler's task queue or tasks
+ // posted on the worker scheduler may not get run when the thread is deleted.
+ TaskRunner()->PostTask(
Sami 2015/04/13 17:38:49 In other words this shutdown task mustn't be allow
+ FROM_HERE, base::Bind(&WebThreadImplForWorkerScheduler::ShutDownOnThread,
+ base::Unretained(this), &completion));
+ completion.Wait();
+
+ thread_->Stop();
+}
+
+void WebThreadImplForWorkerScheduler::InitOnThread(
+ base::WaitableEvent* completion) {
+ worker_scheduler_ = WorkerScheduler::Create(thread_->message_loop());
+ worker_scheduler_->Init();
+ task_runner_ = worker_scheduler_->DefaultTaskRunner();
+ idle_task_runner_ = worker_scheduler_->IdleTaskRunner();
+ completion->Signal();
+}
+
+void WebThreadImplForWorkerScheduler::ShutDownOnThread(
+ base::WaitableEvent* completion) {
+ task_runner_ = nullptr;
+ idle_task_runner_ = nullptr;
+ worker_scheduler_.reset(nullptr);
+ completion->Signal();
+}
+
+blink::PlatformThreadId WebThreadImplForWorkerScheduler::threadId() const {
+ return thread_->thread_id();
+}
+
+base::MessageLoop* WebThreadImplForWorkerScheduler::MessageLoop() const {
+ // As per WebThreadImpl::MessageLoop()
+ return nullptr;
+}
+
+base::SingleThreadTaskRunner* WebThreadImplForWorkerScheduler::TaskRunner()
+ const {
+ return task_runner_.get();
+}
+
+SingleThreadIdleTaskRunner* WebThreadImplForWorkerScheduler::IdleTaskRunner()
+ const {
+ return idle_task_runner_.get();
+}
+
+void WebThreadImplForWorkerScheduler::AddTaskObserverInternal(
+ base::MessageLoop::TaskObserver* observer) {
+ worker_scheduler_->AddTaskObserver(observer);
+}
+
+void WebThreadImplForWorkerScheduler::RemoveTaskObserverInternal(
+ base::MessageLoop::TaskObserver* observer) {
+ worker_scheduler_->RemoveTaskObserver(observer);
+}
+
+} // namespace content

Powered by Google App Engine
This is Rietveld 408576698