xref: /aosp_15_r20/external/cronet/base/task/thread_pool/pooled_sequenced_task_runner.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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