blob: 20a6e9a60418eda705279815771c9bee337cca43 [file] [log] [blame] [edit]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMECAST_PUBLIC_TASK_RUNNER_H_
#define CHROMECAST_PUBLIC_TASK_RUNNER_H_
#include <stdint.h>
namespace chromecast {
// Provides a way for vendor libraries to run code on a specific thread.
// For example, cast_shell supplies an implementation of this interface through
// media APIs (see MediaPipelineDeviceParams) to allow media backends to
// schedule tasks to be run on the media thread.
class TaskRunner {
public:
// Subclass and implement 'Run' to supply code to be run by PostTask or
// PostDelayedTask. They both take ownership of the Task object passed in
// and will delete after running the Task.
class Task {
public:
virtual ~Task() {}
virtual void Run() = 0;
};
// This class is intended for use with base callback type. A template has been
// used to avoid introducing a hard dependency on Chromium base. It is used to
// convert a chromium-style callback to a Task as defined above.
template <typename T>
class CallbackTask : public Task {
public:
CallbackTask(T callback) : callback_(std::move(callback)) {}
~CallbackTask() override = default;
private:
// TaskRunner::Task overrides:
void Run() override { std::move(callback_).Run(); }
T callback_;
};
// Posts a task to the thread's task queue. Delay of 0 could mean task
// runs immediately (within the call to PostTask, if it's called on the
// target thread) but there also could be some delay (the task could be added
// to target thread's task queue).
virtual bool PostTask(Task* task, uint64_t delay_milliseconds) = 0;
protected:
virtual ~TaskRunner() {}
};
} // namespace chromecast
#endif // CHROMECAST_PUBLIC_TASK_RUNNER_H_