Index: components/scheduler/promises/thread_pool_promise_executor.cc |
diff --git a/components/scheduler/promises/thread_pool_promise_executor.cc b/components/scheduler/promises/thread_pool_promise_executor.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d46c4647c5a3f4d45f989f0e6d5f911938d767ef |
--- /dev/null |
+++ b/components/scheduler/promises/thread_pool_promise_executor.cc |
@@ -0,0 +1,57 @@ |
+// Copyright 2016 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 "components/scheduler/promises/thread_pool_promise_executor.h" |
+ |
+#include "base/bind.h" |
+#include "base/threading/worker_pool.h" |
+ |
+namespace promise { |
+namespace internal { |
+ |
+ThreadPoolPromiseExecutor::ThreadPoolPromiseExecutor() {} |
+ |
+ThreadPoolPromiseExecutor::~ThreadPoolPromiseExecutor() {} |
+ |
+void ThreadPoolPromiseExecutor::StartResolveInternal(PromiseBase* promise) { |
+ PromiseExecutor::StartResolveInternal(promise); |
+ DispatchExecutorDrivenResolve(); |
+} |
+ |
+void ThreadPoolPromiseExecutor::ExecutorDrivenResolve() { |
+ PromiseBase* ready_promise; |
+ { |
+ base::AutoLock lock(lock_); |
+ ready_promise = GetNextReadyPromise(); |
+ DCHECK(ready_promise->state() != PromiseBase::State::RESOLVED); |
+ DCHECK(ready_promise->AllPrerequisitesSatisfied()); |
+ } |
+ |
+ if (!ready_promise) |
+ return; |
+ |
+ ready_promise->ExecutorDrivenResolve(); |
+} |
+ |
+void ThreadPoolPromiseExecutor::DispatchExecutorDrivenResolve() { |
+ base::WorkerPool::PostTask( |
+ FROM_HERE, base::Bind(&ThreadPoolPromiseExecutor::ExecutorDrivenResolve, |
+ base::Unretained(this)), |
+ true); |
+} |
+ |
+bool ThreadPoolPromiseExecutor::OnPromiseResolved(PromiseBase* promise) { |
+ if (PromiseExecutor::OnPromiseResolved(promise)) |
+ DispatchExecutorDrivenResolve(); |
+ return false; |
+} |
+ |
+bool ThreadPoolPromiseExecutor::OnPromiseRejected(PromiseBase* promise) { |
+ if (PromiseExecutor::OnPromiseRejected(promise)) |
+ DispatchExecutorDrivenResolve(); |
+ return false; |
+} |
+ |
+} // namespace internal |
+} // namespace promise |