xref: /aosp_15_r20/external/libchrome/base/deferred_sequenced_task_runner.h (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #ifndef BASE_DEFERRED_SEQUENCED_TASK_RUNNER_H_
6*635a8641SAndroid Build Coastguard Worker #define BASE_DEFERRED_SEQUENCED_TASK_RUNNER_H_
7*635a8641SAndroid Build Coastguard Worker 
8*635a8641SAndroid Build Coastguard Worker #include <vector>
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/callback.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
15*635a8641SAndroid Build Coastguard Worker #include "base/sequenced_task_runner.h"
16*635a8641SAndroid Build Coastguard Worker #include "base/synchronization/lock.h"
17*635a8641SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
18*635a8641SAndroid Build Coastguard Worker #include "base/time/time.h"
19*635a8641SAndroid Build Coastguard Worker 
20*635a8641SAndroid Build Coastguard Worker namespace base {
21*635a8641SAndroid Build Coastguard Worker 
22*635a8641SAndroid Build Coastguard Worker // A DeferredSequencedTaskRunner is a subclass of SequencedTaskRunner that
23*635a8641SAndroid Build Coastguard Worker // queues up all requests until the first call to Start() is issued.
24*635a8641SAndroid Build Coastguard Worker // DeferredSequencedTaskRunner may be created in two ways:
25*635a8641SAndroid Build Coastguard Worker // . with an explicit SequencedTaskRunner that the events are flushed to
26*635a8641SAndroid Build Coastguard Worker // . without a SequencedTaskRunner. In this configuration the
27*635a8641SAndroid Build Coastguard Worker //   SequencedTaskRunner is supplied in StartWithTaskRunner().
28*635a8641SAndroid Build Coastguard Worker class BASE_EXPORT DeferredSequencedTaskRunner : public SequencedTaskRunner {
29*635a8641SAndroid Build Coastguard Worker  public:
30*635a8641SAndroid Build Coastguard Worker   explicit DeferredSequencedTaskRunner(
31*635a8641SAndroid Build Coastguard Worker       scoped_refptr<SequencedTaskRunner> target_runner);
32*635a8641SAndroid Build Coastguard Worker 
33*635a8641SAndroid Build Coastguard Worker   // Use this constructor when you don't have the target SequencedTaskRunner.
34*635a8641SAndroid Build Coastguard Worker   // When using this call StartWithTaskRunner().
35*635a8641SAndroid Build Coastguard Worker   DeferredSequencedTaskRunner();
36*635a8641SAndroid Build Coastguard Worker 
37*635a8641SAndroid Build Coastguard Worker   // TaskRunner implementation
38*635a8641SAndroid Build Coastguard Worker   bool PostDelayedTask(const Location& from_here,
39*635a8641SAndroid Build Coastguard Worker                        OnceClosure task,
40*635a8641SAndroid Build Coastguard Worker                        TimeDelta delay) override;
41*635a8641SAndroid Build Coastguard Worker   bool RunsTasksInCurrentSequence() const override;
42*635a8641SAndroid Build Coastguard Worker 
43*635a8641SAndroid Build Coastguard Worker   // SequencedTaskRunner implementation
44*635a8641SAndroid Build Coastguard Worker   bool PostNonNestableDelayedTask(const Location& from_here,
45*635a8641SAndroid Build Coastguard Worker                                   OnceClosure task,
46*635a8641SAndroid Build Coastguard Worker                                   TimeDelta delay) override;
47*635a8641SAndroid Build Coastguard Worker 
48*635a8641SAndroid Build Coastguard Worker   // Start the execution - posts all queued tasks to the target executor. The
49*635a8641SAndroid Build Coastguard Worker   // deferred tasks are posted with their initial delay, meaning that the task
50*635a8641SAndroid Build Coastguard Worker   // execution delay is actually measured from Start.
51*635a8641SAndroid Build Coastguard Worker   // Fails when called a second time.
52*635a8641SAndroid Build Coastguard Worker   void Start();
53*635a8641SAndroid Build Coastguard Worker 
54*635a8641SAndroid Build Coastguard Worker   // Same as Start(), but must be used with the no-arg constructor.
55*635a8641SAndroid Build Coastguard Worker   void StartWithTaskRunner(
56*635a8641SAndroid Build Coastguard Worker       scoped_refptr<SequencedTaskRunner> target_task_runner);
57*635a8641SAndroid Build Coastguard Worker 
58*635a8641SAndroid Build Coastguard Worker  private:
59*635a8641SAndroid Build Coastguard Worker   struct DeferredTask  {
60*635a8641SAndroid Build Coastguard Worker     DeferredTask();
61*635a8641SAndroid Build Coastguard Worker     DeferredTask(DeferredTask&& other);
62*635a8641SAndroid Build Coastguard Worker     ~DeferredTask();
63*635a8641SAndroid Build Coastguard Worker     DeferredTask& operator=(DeferredTask&& other);
64*635a8641SAndroid Build Coastguard Worker 
65*635a8641SAndroid Build Coastguard Worker     Location posted_from;
66*635a8641SAndroid Build Coastguard Worker     OnceClosure task;
67*635a8641SAndroid Build Coastguard Worker     // The delay this task was initially posted with.
68*635a8641SAndroid Build Coastguard Worker     TimeDelta delay;
69*635a8641SAndroid Build Coastguard Worker     bool is_non_nestable;
70*635a8641SAndroid Build Coastguard Worker   };
71*635a8641SAndroid Build Coastguard Worker 
72*635a8641SAndroid Build Coastguard Worker   ~DeferredSequencedTaskRunner() override;
73*635a8641SAndroid Build Coastguard Worker 
74*635a8641SAndroid Build Coastguard Worker   // Both variants of Start() call into this.
75*635a8641SAndroid Build Coastguard Worker   void StartImpl();
76*635a8641SAndroid Build Coastguard Worker 
77*635a8641SAndroid Build Coastguard Worker   // Creates a |Task| object and adds it to |deferred_tasks_queue_|.
78*635a8641SAndroid Build Coastguard Worker   void QueueDeferredTask(const Location& from_here,
79*635a8641SAndroid Build Coastguard Worker                          OnceClosure task,
80*635a8641SAndroid Build Coastguard Worker                          TimeDelta delay,
81*635a8641SAndroid Build Coastguard Worker                          bool is_non_nestable);
82*635a8641SAndroid Build Coastguard Worker 
83*635a8641SAndroid Build Coastguard Worker   // // Protects |started_| and |deferred_tasks_queue_|.
84*635a8641SAndroid Build Coastguard Worker   mutable Lock lock_;
85*635a8641SAndroid Build Coastguard Worker 
86*635a8641SAndroid Build Coastguard Worker   const PlatformThreadId created_thread_id_;
87*635a8641SAndroid Build Coastguard Worker 
88*635a8641SAndroid Build Coastguard Worker   bool started_ = false;
89*635a8641SAndroid Build Coastguard Worker   scoped_refptr<SequencedTaskRunner> target_task_runner_;
90*635a8641SAndroid Build Coastguard Worker   std::vector<DeferredTask> deferred_tasks_queue_;
91*635a8641SAndroid Build Coastguard Worker 
92*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(DeferredSequencedTaskRunner);
93*635a8641SAndroid Build Coastguard Worker };
94*635a8641SAndroid Build Coastguard Worker 
95*635a8641SAndroid Build Coastguard Worker }  // namespace base
96*635a8641SAndroid Build Coastguard Worker 
97*635a8641SAndroid Build Coastguard Worker #endif  // BASE_DEFERRED_SEQUENCED_TASK_RUNNER_H_
98