| // Copyright 2017 The Fuchsia 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 "src/lib/callback/scoped_task_runner.h" |
| |
| #include <lib/async/cpp/task.h> |
| |
| #include <utility> |
| |
| namespace callback { |
| |
| TaskController::TaskController() = default; |
| TaskController::~TaskController() = default; |
| |
| void SimpleTaskController::ShutDown() { alive_ = false; } |
| |
| void SimpleTaskController::RunTask(fit::closure task) { |
| if (alive_) |
| task(); |
| } |
| |
| ScopedTaskRunner::ScopedTaskRunner(async_dispatcher_t* dispatcher) |
| : ScopedTaskRunner(SimpleTaskController::Type{}, dispatcher) {} |
| |
| ScopedTaskRunner::ScopedTaskRunner(ScopedTaskRunner&&) = default; |
| |
| ScopedTaskRunner::~ScopedTaskRunner() { ShutDown(); } |
| |
| ScopedTaskRunner& ScopedTaskRunner::operator=(ScopedTaskRunner&&) = default; |
| |
| void ScopedTaskRunner::ShutDown() { controller_->ShutDown(); } |
| |
| void ScopedTaskRunner::Reset() { Reset(SimpleTaskController::Type{}); } |
| |
| void ScopedTaskRunner::PostTask(fit::closure task) { |
| async::PostTask(dispatcher_, MakeScoped(std::move(task))); |
| } |
| |
| void ScopedTaskRunner::PostTaskForTime(fit::closure task, zx::time target_time) { |
| async::PostTaskForTime(dispatcher_, MakeScoped(std::move(task)), target_time); |
| } |
| |
| void ScopedTaskRunner::PostDelayedTask(fit::closure task, zx::duration delay) { |
| async::PostDelayedTask(dispatcher_, MakeScoped(std::move(task)), delay); |
| } |
| |
| void ScopedTaskRunner::PostPeriodicTask(fit::closure task, zx::duration interval, bool invoke_now) { |
| // We live with re-wrapping this task every iteration to greatly simplify the |
| // implementation. It's possible to wrap once, but as the scoped task would |
| // then need to capture itself, we'd have to declare a dedicated functor. |
| // Since this area is not performance-critical, err on the side of simplicity |
| // for now. |
| auto task_iteration = [this, task = std::move(task), interval]() mutable { |
| task(); |
| PostPeriodicTask(std::move(task), interval, false); |
| }; |
| |
| if (invoke_now) { |
| PostTask(std::move(task_iteration)); |
| } else { |
| PostDelayedTask(std::move(task_iteration), interval); |
| } |
| } |
| |
| } // namespace callback |