blob: c742ac3c454283d88b782b852831e4e0a5103710 [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 BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_H_
#define BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_H_
#include <memory>
#include "base/base_export.h"
#include "base/memory/ref_counted.h"
#include "base/sequenced_task_runner.h"
#include "base/single_thread_task_runner.h"
#include "base/task_runner.h"
#include "base/task_scheduler/sequence.h"
#include "base/task_scheduler/task.h"
#include "base/task_scheduler/task_traits.h"
namespace base {
namespace internal {
class SchedulerWorker;
class SequenceSortKey;
// Interface for a worker pool.
class BASE_EXPORT SchedulerWorkerPool {
public:
virtual ~SchedulerWorkerPool() = default;
// Returns a TaskRunner whose PostTask invocations result in scheduling tasks
// in this SchedulerWorkerPool using |traits|. Tasks may run in any order and
// in parallel.
virtual scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits(
const TaskTraits& traits) = 0;
// Returns a SequencedTaskRunner whose PostTask invocations result in
// scheduling tasks in this SchedulerWorkerPool using |traits|. Tasks run one
// at a time in posting order.
virtual scoped_refptr<SequencedTaskRunner>
CreateSequencedTaskRunnerWithTraits(const TaskTraits& traits) = 0;
// Returns a SingleThreadTaskRunner whose PostTask invocations result in
// scheduling tasks in this SchedulerWorkerPool using |traits|. Tasks run on a
// single thread in posting order.
virtual scoped_refptr<SingleThreadTaskRunner>
CreateSingleThreadTaskRunnerWithTraits(const TaskTraits& traits) = 0;
// Inserts |sequence| with |sequence_sort_key| into a queue of Sequences that
// can be processed by any worker owned by this SchedulerWorkerPool. Must only
// be used to put |sequence| back into a queue after running a Task from it.
// The thread that calls this doesn't have to belong to this
// SchedulerWorkerPool.
virtual void ReEnqueueSequence(scoped_refptr<Sequence> sequence,
const SequenceSortKey& sequence_sort_key) = 0;
// Posts |task| to be executed by this SchedulerWorkerPool as part of
// |sequence|. If |worker| is non-null, |task| will be scheduled to run on it
// specifically (note: |worker| must be owned by this SchedulerWorkerPool);
// otherwise, |task| will be added to the pending shared work. |task| won't be
// executed before its delayed run time, if any. Returns true if |task| is
// posted.
virtual bool PostTaskWithSequence(std::unique_ptr<Task> task,
scoped_refptr<Sequence> sequence,
SchedulerWorker* worker) = 0;
// Posts |task| to be executed by this SchedulerWorkerPool as part of
// |sequence|. If |worker| is non-null, |task| will be scheduled to run on it
// specifically (note: |worker| must be owned by this SchedulerWorkerPool);
// otherwise, |task| will be added to the pending shared work. This must only
// be called after |task| has gone through PostTaskWithSequence() and after
// |task|'s delayed run time.
virtual void PostTaskWithSequenceNow(std::unique_ptr<Task> task,
scoped_refptr<Sequence> sequence,
SchedulerWorker* worker) = 0;
};
} // namespace internal
} // namespace base
#endif // BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_H_