| 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
|
|
|