|  | // 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 "base/base_export.h" | 
|  | #include "base/memory/ref_counted.h" | 
|  | #include "base/sequenced_task_runner.h" | 
|  | #include "base/task_runner.h" | 
|  | #include "base/task_scheduler/can_schedule_sequence_observer.h" | 
|  | #include "base/task_scheduler/sequence.h" | 
|  | #include "base/task_scheduler/task.h" | 
|  | #include "base/task_scheduler/task_traits.h" | 
|  | #include "base/task_scheduler/tracked_ref.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace internal { | 
|  |  | 
|  | class DelayedTaskManager; | 
|  | class TaskTracker; | 
|  |  | 
|  | // Interface for a worker pool. | 
|  | class BASE_EXPORT SchedulerWorkerPool : public CanScheduleSequenceObserver { | 
|  | public: | 
|  | ~SchedulerWorkerPool() override; | 
|  |  | 
|  | // Returns a TaskRunner whose PostTask invocations result in scheduling tasks | 
|  | // in this SchedulerWorkerPool using |traits|. Tasks may run in any order and | 
|  | // in parallel. | 
|  | scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits( | 
|  | const TaskTraits& traits); | 
|  |  | 
|  | // Returns a SequencedTaskRunner whose PostTask invocations result in | 
|  | // scheduling tasks in this SchedulerWorkerPool using |traits|. Tasks run one | 
|  | // at a time in posting order. | 
|  | scoped_refptr<SequencedTaskRunner> CreateSequencedTaskRunnerWithTraits( | 
|  | const TaskTraits& traits); | 
|  |  | 
|  | // Posts |task| to be executed by this SchedulerWorkerPool as part of | 
|  | // |sequence|. |task| won't be executed before its delayed run time, if any. | 
|  | // Returns true if |task| is posted. | 
|  | bool PostTaskWithSequence(Task task, scoped_refptr<Sequence> sequence); | 
|  |  | 
|  | // Registers the worker pool in TLS. | 
|  | void BindToCurrentThread(); | 
|  |  | 
|  | // Resets the worker pool in TLS. | 
|  | void UnbindFromCurrentThread(); | 
|  |  | 
|  | // Prevents new tasks from starting to run and waits for currently running | 
|  | // tasks to complete their execution. It is guaranteed that no thread will do | 
|  | // work on behalf of this SchedulerWorkerPool after this returns. It is | 
|  | // invalid to post a task once this is called. TaskTracker::Flush() can be | 
|  | // called before this to complete existing tasks, which might otherwise post a | 
|  | // task during JoinForTesting(). This can only be called once. | 
|  | virtual void JoinForTesting() = 0; | 
|  |  | 
|  | protected: | 
|  | SchedulerWorkerPool(TrackedRef<TaskTracker> task_tracker, | 
|  | DelayedTaskManager* delayed_task_manager); | 
|  |  | 
|  | // Posts |task| to be executed by this SchedulerWorkerPool as part of | 
|  | // |sequence|. This must only be called after |task| has gone through | 
|  | // PostTaskWithSequence() and after |task|'s delayed run time. | 
|  | void PostTaskWithSequenceNow(Task task, scoped_refptr<Sequence> sequence); | 
|  |  | 
|  | const TrackedRef<TaskTracker> task_tracker_; | 
|  | DelayedTaskManager* const delayed_task_manager_; | 
|  |  | 
|  | private: | 
|  | DISALLOW_COPY_AND_ASSIGN(SchedulerWorkerPool); | 
|  | }; | 
|  |  | 
|  | }  // namespace internal | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_H_ |