1 // Copyright 2018 The Chromium Authors
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/message_loop/message_pump.h"
8 #include "base/sequence_token.h"
9 #include "base/task/default_delayed_task_handle_delegate.h"
10
11 namespace base {
12 namespace internal {
13
PooledSequencedTaskRunner(const TaskTraits & traits,PooledTaskRunnerDelegate * pooled_task_runner_delegate)14 PooledSequencedTaskRunner::PooledSequencedTaskRunner(
15 const TaskTraits& traits,
16 PooledTaskRunnerDelegate* pooled_task_runner_delegate)
17 : pooled_task_runner_delegate_(pooled_task_runner_delegate),
18 sequence_(MakeRefCounted<Sequence>(traits,
19 this,
20 TaskSourceExecutionMode::kSequenced)) {
21 }
22
23 PooledSequencedTaskRunner::~PooledSequencedTaskRunner() = default;
24
PostDelayedTask(const Location & from_here,OnceClosure closure,TimeDelta delay)25 bool PooledSequencedTaskRunner::PostDelayedTask(const Location& from_here,
26 OnceClosure closure,
27 TimeDelta delay) {
28 if (!PooledTaskRunnerDelegate::MatchesCurrentDelegate(
29 pooled_task_runner_delegate_)) {
30 return false;
31 }
32
33 Task task(from_here, std::move(closure), TimeTicks::Now(), delay,
34 MessagePump::GetLeewayIgnoringThreadOverride());
35
36 // Post the task as part of |sequence_|.
37 return pooled_task_runner_delegate_->PostTaskWithSequence(std::move(task),
38 sequence_);
39 }
40
PostDelayedTaskAt(subtle::PostDelayedTaskPassKey,const Location & from_here,OnceClosure closure,TimeTicks delayed_run_time,subtle::DelayPolicy delay_policy)41 bool PooledSequencedTaskRunner::PostDelayedTaskAt(
42 subtle::PostDelayedTaskPassKey,
43 const Location& from_here,
44 OnceClosure closure,
45 TimeTicks delayed_run_time,
46 subtle::DelayPolicy delay_policy) {
47 if (!PooledTaskRunnerDelegate::MatchesCurrentDelegate(
48 pooled_task_runner_delegate_)) {
49 return false;
50 }
51
52 Task task(from_here, std::move(closure), TimeTicks::Now(), delayed_run_time,
53 MessagePump::GetLeewayIgnoringThreadOverride(), delay_policy);
54
55 // Post the task as part of |sequence_|.
56 return pooled_task_runner_delegate_->PostTaskWithSequence(std::move(task),
57 sequence_);
58 }
59
PostNonNestableDelayedTask(const Location & from_here,OnceClosure closure,TimeDelta delay)60 bool PooledSequencedTaskRunner::PostNonNestableDelayedTask(
61 const Location& from_here,
62 OnceClosure closure,
63 TimeDelta delay) {
64 // Tasks are never nested within the thread pool.
65 return PostDelayedTask(from_here, std::move(closure), delay);
66 }
67
RunsTasksInCurrentSequence() const68 bool PooledSequencedTaskRunner::RunsTasksInCurrentSequence() const {
69 return sequence_->token() == SequenceToken::GetForCurrentThread();
70 }
71
UpdatePriority(TaskPriority priority)72 void PooledSequencedTaskRunner::UpdatePriority(TaskPriority priority) {
73 pooled_task_runner_delegate_->UpdatePriority(sequence_, priority);
74 }
75
76 } // namespace internal
77 } // namespace base
78