blob: e6049761ba364353c2610c8dd905be79c25881c4 [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 GARNET_LIB_CALLBACK_SCOPED_TASK_RUNNER_H_
#define GARNET_LIB_CALLBACK_SCOPED_TASK_RUNNER_H_
#include "garnet/lib/callback/scoped_callback.h"
#include "lib/fxl/macros.h"
#include "lib/fxl/memory/ref_ptr.h"
#include "lib/fxl/memory/weak_ptr.h"
#include "lib/fxl/tasks/task_runner.h"
namespace callback {
// An object with the same interface as |fxl::TaskRunner| that wraps an existing
// |fxl::TaskRunner|, 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(fxl::RefPtr<fxl::TaskRunner> task_runner);
~ScopedTaskRunner();
// Posts a task to run as soon as possible.
void PostTask(fxl::Closure task);
// Posts a task to run as soon as possible after the specified |target_time|.
void PostTaskForTime(fxl::Closure task, fxl::TimePoint target_time);
// Posts a task to run as soon as possible after the specified |delay|.
void PostDelayedTask(fxl::Closure task, fxl::TimeDelta delay);
// Returns true if the task runner runs tasks on the current thread.
bool RunsTasksOnCurrentThread();
// 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:
fxl::RefPtr<fxl::TaskRunner> task_runner_;
fxl::WeakPtrFactory<ScopedTaskRunner> weak_factory_;
FXL_DISALLOW_COPY_AND_ASSIGN(ScopedTaskRunner);
};
} // namespace callback
#endif // GARNET_LIB_CALLBACK_SCOPED_TASK_RUNNER_H_