blob: 93f6ad7e49662091c1ba6c6d07075a72ea1ef974 [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
peary23322df62017-05-09 03:55:4851bool DeferredSequencedTaskRunner::RunsTasksInCurrentSequence() const {
52 return target_task_runner_->RunsTasksInCurrentSequence();
[email protected]afecfb72013-04-18 17:17:3353}
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) {
tzik498d42b2017-04-13 07:42:4875 // Use CHECK instead of DCHECK to crash earlier. See http://crbug.com/711167
76 // for details.
77 CHECK(task);
tzikc6976962017-04-04 17:27:3478
[email protected]afecfb72013-04-18 17:17:3379 DeferredTask deferred_task;
80 deferred_task.posted_from = from_here;
tzik070c8ffb2017-03-29 05:28:1281 deferred_task.task = std::move(task);
[email protected]afecfb72013-04-18 17:17:3382 deferred_task.delay = delay;
83 deferred_task.is_non_nestable = is_non_nestable;
tzik070c8ffb2017-03-29 05:28:1284 deferred_tasks_queue_.push_back(std::move(deferred_task));
[email protected]afecfb72013-04-18 17:17:3385}
86
[email protected]afecfb72013-04-18 17:17:3387void DeferredSequencedTaskRunner::Start() {
88 AutoLock lock(lock_);
89 DCHECK(!started_);
90 started_ = true;
91 for (std::vector<DeferredTask>::iterator i = deferred_tasks_queue_.begin();
92 i != deferred_tasks_queue_.end();
93 ++i) {
tzik070c8ffb2017-03-29 05:28:1294 DeferredTask& task = *i;
[email protected]afecfb72013-04-18 17:17:3395 if (task.is_non_nestable) {
tzik070c8ffb2017-03-29 05:28:1296 target_task_runner_->PostNonNestableDelayedTask(
97 task.posted_from, std::move(task.task), task.delay);
[email protected]afecfb72013-04-18 17:17:3398 } else {
99 target_task_runner_->PostDelayedTask(task.posted_from,
tzik070c8ffb2017-03-29 05:28:12100 std::move(task.task), task.delay);
[email protected]afecfb72013-04-18 17:17:33101 }
[email protected]afecfb72013-04-18 17:17:33102 }
103 deferred_tasks_queue_.clear();
104}
105
106} // namespace base