blob: 1482392fb4556cdd9461660fe7f826653f0b5056 [file] [log] [blame]
// 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.
#ifndef COMPONENTS_OFFLINE_PAGES_TASK_TASK_H_
#define COMPONENTS_OFFLINE_PAGES_TASK_TASK_H_
#include "base/callback.h"
namespace offline_pages {
class TaskQueue;
// A task which may run asynchronous steps. Its primary purpose is to implement
// operations to be inserted into a |TaskQueue|, however, tasks can also be run
// outside of a |TaskQueue|.
class Task {
public:
Task();
virtual ~Task();
Task(const Task&) = delete;
Task& operator=(const Task&) = delete;
void Execute(base::OnceClosure complete_callback);
protected:
friend TaskQueue;
// Entry point to the task. Called by |Execute()| to perform the task.
// Must call |TaskComplete()| as the final step.
virtual void Run() = 0;
// These functions are intended to be called by the implementor of Task:
// Tasks must call |TaskComplete()| as their last step.
void TaskComplete();
// Suspends task execution, and allows execution of other tasks in the queue.
// Afterward, either `Resume()` or `TaskComplete()` should eventually be
// called on this task, or it will remain alive until the owning `TaskQueue`
// is destroyed. Must be called on the TaskQueue's sequence.
void Suspend();
// Request continuation of task execution after a prior `Suspend()` call.
// `on_resume` is invoked when the task can being executing again. Resumed
// tasks are given priority above other tasks. Must be called on the
// TaskQueue's sequence.
void Resume(base::OnceClosure on_resume);
private:
enum class TaskState {
kWaiting,
kRunning,
kSuspended,
kCompleted,
};
// TaskQueue outlives and owns this task. Non-null only when this task is
// owned by a task queue.
TaskQueue* task_queue_ = nullptr;
// Reports completion or suspension to the caller.
base::OnceClosure task_completion_callback_;
TaskState state_ = TaskState::kWaiting;
};
} // namespace offline_pages
#endif // COMPONENTS_OFFLINE_PAGES_TASK_TASK_H_