blob: 7649758f790eddf29c832f516c549b18eb6b86e5 [file] [log] [blame]
// 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.
#ifndef LIB_CALLBACK_SCOPED_TASK_RUNNER_H_
#define LIB_CALLBACK_SCOPED_TASK_RUNNER_H_
#include <lib/async/dispatcher.h>
#include <lib/fit/function.h>
#include <zx/time.h>
#include "lib/callback/scoped_callback.h"
#include "lib/fxl/macros.h"
#include "lib/fxl/memory/ref_ptr.h"
#include "lib/fxl/memory/weak_ptr.h"
namespace callback {
// An object that wraps the posting logic of an |async_t|, but that is
// neither copyable nor moveable and will never run any task after being
// deleted.
// Because this class also acts as a WeakPtrFactory, it needs to be the last
// member of a class.
class ScopedTaskRunner {
public:
explicit ScopedTaskRunner(async_dispatcher_t* dispatcher);
~ScopedTaskRunner();
// Posts a task to run as soon as possible.
void PostTask(fit::closure task);
// Posts a task to run as soon as possible after the specified |target_time|.
void PostTaskForTime(fit::closure task, zx::time target_time);
// Posts a task to run as soon as possible after the specified |delay|.
void PostDelayedTask(fit::closure task, zx::duration delay);
// Scope the given callback to the current task runner. This means that the
// given callback will be called when the returned callback is called if and
// only if this task runner has not been deleted.
template <typename T>
auto MakeScoped(T lambda) {
return callback::MakeScoped(weak_factory_.GetWeakPtr(), std::move(lambda));
}
private:
async_dispatcher_t* const dispatcher_;
fxl::WeakPtrFactory<ScopedTaskRunner> weak_factory_;
FXL_DISALLOW_COPY_AND_ASSIGN(ScopedTaskRunner);
};
} // namespace callback
#endif // LIB_CALLBACK_SCOPED_TASK_RUNNER_H_