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