1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef BASE_DEFERRED_SEQUENCED_TASK_RUNNER_H_
6 #define BASE_DEFERRED_SEQUENCED_TASK_RUNNER_H_
10 #include "base/base_export.h"
11 #include "base/callback.h"
12 #include "base/compiler_specific.h"
13 #include "base/macros.h"
14 #include "base/memory/ref_counted.h"
15 #include "base/sequenced_task_runner.h"
16 #include "base/synchronization/lock.h"
17 #include "base/threading/platform_thread.h"
18 #include "base/time/time.h"
22 // A DeferredSequencedTaskRunner is a subclass of SequencedTaskRunner that
23 // queues up all requests until the first call to Start() is issued.
24 // DeferredSequencedTaskRunner may be created in two ways:
25 // . with an explicit SequencedTaskRunner that the events are flushed to
26 // . without a SequencedTaskRunner. In this configuration the
27 // SequencedTaskRunner is supplied in StartWithTaskRunner().
28 class BASE_EXPORT DeferredSequencedTaskRunner : public SequencedTaskRunner {
30 explicit DeferredSequencedTaskRunner(
31 scoped_refptr<SequencedTaskRunner> target_runner);
33 // Use this constructor when you don't have the target SequencedTaskRunner.
34 // When using this call StartWithTaskRunner().
35 DeferredSequencedTaskRunner();
37 // TaskRunner implementation
38 bool PostDelayedTask(const Location& from_here,
40 TimeDelta delay) override;
41 bool RunsTasksInCurrentSequence() const override;
43 // SequencedTaskRunner implementation
44 bool PostNonNestableDelayedTask(const Location& from_here,
46 TimeDelta delay) override;
48 // Start the execution - posts all queued tasks to the target executor. The
49 // deferred tasks are posted with their initial delay, meaning that the task
50 // execution delay is actually measured from Start.
51 // Fails when called a second time.
54 // Same as Start(), but must be used with the no-arg constructor.
55 void StartWithTaskRunner(
56 scoped_refptr<SequencedTaskRunner> target_task_runner);
61 DeferredTask(DeferredTask&& other);
63 DeferredTask& operator=(DeferredTask&& other);
67 // The delay this task was initially posted with.
72 ~DeferredSequencedTaskRunner() override;
74 // Both variants of Start() call into this.
77 // Creates a |Task| object and adds it to |deferred_tasks_queue_|.
78 void QueueDeferredTask(const Location& from_here,
81 bool is_non_nestable);
83 // // Protects |started_| and |deferred_tasks_queue_|.
86 const PlatformThreadId created_thread_id_;
88 bool started_ = false;
89 scoped_refptr<SequencedTaskRunner> target_task_runner_;
90 std::vector<DeferredTask> deferred_tasks_queue_;
92 DISALLOW_COPY_AND_ASSIGN(DeferredSequencedTaskRunner);
97 #endif // BASE_DEFERRED_SEQUENCED_TASK_RUNNER_H_