1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/task/thread_pool/pooled_sequenced_task_runner.h"
6 
7 #include "base/sequence_token.h"
8 
9 namespace base {
10 namespace internal {
11 
PooledSequencedTaskRunner(const TaskTraits & traits,PooledTaskRunnerDelegate * pooled_task_runner_delegate)12 PooledSequencedTaskRunner::PooledSequencedTaskRunner(
13     const TaskTraits& traits,
14     PooledTaskRunnerDelegate* pooled_task_runner_delegate)
15     : pooled_task_runner_delegate_(pooled_task_runner_delegate),
16       sequence_(MakeRefCounted<Sequence>(traits,
17                                          this,
18                                          TaskSourceExecutionMode::kSequenced)) {
19 }
20 
21 PooledSequencedTaskRunner::~PooledSequencedTaskRunner() = default;
22 
PostDelayedTask(const Location & from_here,OnceClosure closure,TimeDelta delay)23 bool PooledSequencedTaskRunner::PostDelayedTask(const Location& from_here,
24                                                 OnceClosure closure,
25                                                 TimeDelta delay) {
26   if (!PooledTaskRunnerDelegate::Exists())
27     return false;
28 
29   Task task(from_here, std::move(closure), delay);
30 
31   // Post the task as part of |sequence_|.
32   return pooled_task_runner_delegate_->PostTaskWithSequence(std::move(task),
33                                                             sequence_);
34 }
35 
PostNonNestableDelayedTask(const Location & from_here,OnceClosure closure,TimeDelta delay)36 bool PooledSequencedTaskRunner::PostNonNestableDelayedTask(
37     const Location& from_here,
38     OnceClosure closure,
39     TimeDelta delay) {
40   // Tasks are never nested within the thread pool.
41   return PostDelayedTask(from_here, std::move(closure), delay);
42 }
43 
RunsTasksInCurrentSequence() const44 bool PooledSequencedTaskRunner::RunsTasksInCurrentSequence() const {
45   return sequence_->token() == SequenceToken::GetForCurrentThread();
46 }
47 
UpdatePriority(TaskPriority priority)48 void PooledSequencedTaskRunner::UpdatePriority(TaskPriority priority) {
49   pooled_task_runner_delegate_->UpdatePriority(sequence_, priority);
50 }
51 
52 }  // namespace internal
53 }  // namespace base
54