|  | // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_DEFERRED_SEQUENCED_TASK_RUNNER_H_ | 
|  | #define BASE_DEFERRED_SEQUENCED_TASK_RUNNER_H_ | 
|  |  | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/callback.h" | 
|  | #include "base/compiler_specific.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/memory/ref_counted.h" | 
|  | #include "base/sequenced_task_runner.h" | 
|  | #include "base/synchronization/lock.h" | 
|  | #include "base/threading/platform_thread.h" | 
|  | #include "base/time/time.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | // A DeferredSequencedTaskRunner is a subclass of SequencedTaskRunner that | 
|  | // queues up all requests until the first call to Start() is issued. | 
|  | // DeferredSequencedTaskRunner may be created in two ways: | 
|  | // . with an explicit SequencedTaskRunner that the events are flushed to | 
|  | // . without a SequencedTaskRunner. In this configuration the | 
|  | //   SequencedTaskRunner is supplied in StartWithTaskRunner(). | 
|  | class BASE_EXPORT DeferredSequencedTaskRunner : public SequencedTaskRunner { | 
|  | public: | 
|  | explicit DeferredSequencedTaskRunner( | 
|  | scoped_refptr<SequencedTaskRunner> target_runner); | 
|  |  | 
|  | // Use this constructor when you don't have the target SequencedTaskRunner. | 
|  | // When using this call StartWithTaskRunner(). | 
|  | DeferredSequencedTaskRunner(); | 
|  |  | 
|  | // TaskRunner implementation | 
|  | bool PostDelayedTask(const Location& from_here, | 
|  | OnceClosure task, | 
|  | TimeDelta delay) override; | 
|  | bool RunsTasksInCurrentSequence() const override; | 
|  |  | 
|  | // SequencedTaskRunner implementation | 
|  | bool PostNonNestableDelayedTask(const Location& from_here, | 
|  | OnceClosure task, | 
|  | TimeDelta delay) override; | 
|  |  | 
|  | // Start the execution - posts all queued tasks to the target executor. The | 
|  | // deferred tasks are posted with their initial delay, meaning that the task | 
|  | // execution delay is actually measured from Start. | 
|  | // Fails when called a second time. | 
|  | void Start(); | 
|  |  | 
|  | // Same as Start(), but must be used with the no-arg constructor. | 
|  | void StartWithTaskRunner( | 
|  | scoped_refptr<SequencedTaskRunner> target_task_runner); | 
|  |  | 
|  | private: | 
|  | struct DeferredTask  { | 
|  | DeferredTask(); | 
|  | DeferredTask(DeferredTask&& other); | 
|  | ~DeferredTask(); | 
|  | DeferredTask& operator=(DeferredTask&& other); | 
|  |  | 
|  | Location posted_from; | 
|  | OnceClosure task; | 
|  | // The delay this task was initially posted with. | 
|  | TimeDelta delay; | 
|  | bool is_non_nestable; | 
|  | }; | 
|  |  | 
|  | ~DeferredSequencedTaskRunner() override; | 
|  |  | 
|  | // Both variants of Start() call into this. | 
|  | void StartImpl(); | 
|  |  | 
|  | // Creates a |Task| object and adds it to |deferred_tasks_queue_|. | 
|  | void QueueDeferredTask(const Location& from_here, | 
|  | OnceClosure task, | 
|  | TimeDelta delay, | 
|  | bool is_non_nestable); | 
|  |  | 
|  | // // Protects |started_| and |deferred_tasks_queue_|. | 
|  | mutable Lock lock_; | 
|  |  | 
|  | const PlatformThreadId created_thread_id_; | 
|  |  | 
|  | bool started_ = false; | 
|  | scoped_refptr<SequencedTaskRunner> target_task_runner_; | 
|  | std::vector<DeferredTask> deferred_tasks_queue_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(DeferredSequencedTaskRunner); | 
|  | }; | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_DEFERRED_SEQUENCED_TASK_RUNNER_H_ |