blob: 15367f06b660ad5d7fe70324b4047525fdfc0ac6 [file] [log] [blame]
[email protected]afecfb72013-04-18 17:17:331// 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.
4
5#include "base/deferred_sequenced_task_runner.h"
6
tzik070c8ffb2017-03-29 05:28:127#include <utility>
8
[email protected]afecfb72013-04-18 17:17:339#include "base/bind.h"
10#include "base/logging.h"
11
12namespace base {
13
[email protected]20ad4c202013-08-30 12:59:2514DeferredSequencedTaskRunner::DeferredTask::DeferredTask()
15 : is_non_nestable(false) {
[email protected]afecfb72013-04-18 17:17:3316}
17
tzik070c8ffb2017-03-29 05:28:1218DeferredSequencedTaskRunner::DeferredTask::DeferredTask(DeferredTask&& other) =
19 default;
vmpstr7c7877062016-02-18 22:12:2420
[email protected]afecfb72013-04-18 17:17:3321DeferredSequencedTaskRunner::DeferredTask::~DeferredTask() {
22}
23
tzik070c8ffb2017-03-29 05:28:1224DeferredSequencedTaskRunner::DeferredTask&
25DeferredSequencedTaskRunner::DeferredTask::operator=(DeferredTask&& other) =
26 default;
27
[email protected]afecfb72013-04-18 17:17:3328DeferredSequencedTaskRunner::DeferredSequencedTaskRunner(
vmpstr82b0c16d2016-03-18 19:17:2829 scoped_refptr<SequencedTaskRunner> target_task_runner)
30 : started_(false), target_task_runner_(std::move(target_task_runner)) {}
[email protected]afecfb72013-04-18 17:17:3331
32DeferredSequencedTaskRunner::~DeferredSequencedTaskRunner() {
33}
34
35bool DeferredSequencedTaskRunner::PostDelayedTask(
36 const tracked_objects::Location& from_here,
tzik6e427842017-04-05 10:13:2137 OnceClosure task,
[email protected]afecfb72013-04-18 17:17:3338 TimeDelta delay) {
39 AutoLock lock(lock_);
40 if (started_) {
41 DCHECK(deferred_tasks_queue_.empty());
tzik070c8ffb2017-03-29 05:28:1242 return target_task_runner_->PostDelayedTask(from_here, std::move(task),
43 delay);
[email protected]afecfb72013-04-18 17:17:3344 }
45
tzik070c8ffb2017-03-29 05:28:1246 QueueDeferredTask(from_here, std::move(task), delay,
47 false /* is_non_nestable */);
[email protected]afecfb72013-04-18 17:17:3348 return true;
49}
50
51bool DeferredSequencedTaskRunner::RunsTasksOnCurrentThread() const {
52 return target_task_runner_->RunsTasksOnCurrentThread();
53}
54
55bool DeferredSequencedTaskRunner::PostNonNestableDelayedTask(
56 const tracked_objects::Location& from_here,
tzik6e427842017-04-05 10:13:2157 OnceClosure task,
[email protected]afecfb72013-04-18 17:17:3358 TimeDelta delay) {
59 AutoLock lock(lock_);
60 if (started_) {
61 DCHECK(deferred_tasks_queue_.empty());
tzik070c8ffb2017-03-29 05:28:1262 return target_task_runner_->PostNonNestableDelayedTask(
63 from_here, std::move(task), delay);
[email protected]afecfb72013-04-18 17:17:3364 }
tzik070c8ffb2017-03-29 05:28:1265 QueueDeferredTask(from_here, std::move(task), delay,
66 true /* is_non_nestable */);
[email protected]afecfb72013-04-18 17:17:3367 return true;
68}
69
70void DeferredSequencedTaskRunner::QueueDeferredTask(
71 const tracked_objects::Location& from_here,
tzik6e427842017-04-05 10:13:2172 OnceClosure task,
[email protected]afecfb72013-04-18 17:17:3373 TimeDelta delay,
74 bool is_non_nestable) {
tzikc6976962017-04-04 17:27:3475 DCHECK(task);
76
[email protected]afecfb72013-04-18 17:17:3377 DeferredTask deferred_task;
78 deferred_task.posted_from = from_here;
tzik070c8ffb2017-03-29 05:28:1279 deferred_task.task = std::move(task);
[email protected]afecfb72013-04-18 17:17:3380 deferred_task.delay = delay;
81 deferred_task.is_non_nestable = is_non_nestable;
tzik070c8ffb2017-03-29 05:28:1282 deferred_tasks_queue_.push_back(std::move(deferred_task));
[email protected]afecfb72013-04-18 17:17:3383}
84
[email protected]afecfb72013-04-18 17:17:3385void DeferredSequencedTaskRunner::Start() {
86 AutoLock lock(lock_);
87 DCHECK(!started_);
88 started_ = true;
89 for (std::vector<DeferredTask>::iterator i = deferred_tasks_queue_.begin();
90 i != deferred_tasks_queue_.end();
91 ++i) {
tzik070c8ffb2017-03-29 05:28:1292 DeferredTask& task = *i;
[email protected]afecfb72013-04-18 17:17:3393 if (task.is_non_nestable) {
tzik070c8ffb2017-03-29 05:28:1294 target_task_runner_->PostNonNestableDelayedTask(
95 task.posted_from, std::move(task.task), task.delay);
[email protected]afecfb72013-04-18 17:17:3396 } else {
97 target_task_runner_->PostDelayedTask(task.posted_from,
tzik070c8ffb2017-03-29 05:28:1298 std::move(task.task), task.delay);
[email protected]afecfb72013-04-18 17:17:3399 }
[email protected]afecfb72013-04-18 17:17:33100 }
101 deferred_tasks_queue_.clear();
102}
103
104} // namespace base