blob: 9830402943566a1e60abb44495fa39b9ee3b0e08 [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
Chris Watkinsbb7211c2017-11-29 07:16:3821DeferredSequencedTaskRunner::DeferredTask::~DeferredTask() = default;
[email protected]afecfb72013-04-18 17:17:3322
tzik070c8ffb2017-03-29 05:28:1223DeferredSequencedTaskRunner::DeferredTask&
24DeferredSequencedTaskRunner::DeferredTask::operator=(DeferredTask&& other) =
25 default;
26
[email protected]afecfb72013-04-18 17:17:3327DeferredSequencedTaskRunner::DeferredSequencedTaskRunner(
vmpstr82b0c16d2016-03-18 19:17:2828 scoped_refptr<SequencedTaskRunner> target_task_runner)
29 : started_(false), target_task_runner_(std::move(target_task_runner)) {}
[email protected]afecfb72013-04-18 17:17:3330
Chris Watkinsbb7211c2017-11-29 07:16:3831DeferredSequencedTaskRunner::~DeferredSequencedTaskRunner() = default;
[email protected]afecfb72013-04-18 17:17:3332
Brett Wilson8e88b312017-09-12 05:22:1633bool DeferredSequencedTaskRunner::PostDelayedTask(const Location& from_here,
34 OnceClosure task,
35 TimeDelta delay) {
[email protected]afecfb72013-04-18 17:17:3336 AutoLock lock(lock_);
37 if (started_) {
38 DCHECK(deferred_tasks_queue_.empty());
tzik070c8ffb2017-03-29 05:28:1239 return target_task_runner_->PostDelayedTask(from_here, std::move(task),
40 delay);
[email protected]afecfb72013-04-18 17:17:3341 }
42
tzik070c8ffb2017-03-29 05:28:1243 QueueDeferredTask(from_here, std::move(task), delay,
44 false /* is_non_nestable */);
[email protected]afecfb72013-04-18 17:17:3345 return true;
46}
47
peary23322df62017-05-09 03:55:4848bool DeferredSequencedTaskRunner::RunsTasksInCurrentSequence() const {
49 return target_task_runner_->RunsTasksInCurrentSequence();
[email protected]afecfb72013-04-18 17:17:3350}
51
52bool DeferredSequencedTaskRunner::PostNonNestableDelayedTask(
Brett Wilson8e88b312017-09-12 05:22:1653 const Location& from_here,
tzik6e427842017-04-05 10:13:2154 OnceClosure task,
[email protected]afecfb72013-04-18 17:17:3355 TimeDelta delay) {
56 AutoLock lock(lock_);
57 if (started_) {
58 DCHECK(deferred_tasks_queue_.empty());
tzik070c8ffb2017-03-29 05:28:1259 return target_task_runner_->PostNonNestableDelayedTask(
60 from_here, std::move(task), delay);
[email protected]afecfb72013-04-18 17:17:3361 }
tzik070c8ffb2017-03-29 05:28:1262 QueueDeferredTask(from_here, std::move(task), delay,
63 true /* is_non_nestable */);
[email protected]afecfb72013-04-18 17:17:3364 return true;
65}
66
Brett Wilson8e88b312017-09-12 05:22:1667void DeferredSequencedTaskRunner::QueueDeferredTask(const Location& from_here,
68 OnceClosure task,
69 TimeDelta delay,
70 bool is_non_nestable) {
tzik498d42b2017-04-13 07:42:4871 // Use CHECK instead of DCHECK to crash earlier. See http://crbug.com/711167
72 // for details.
73 CHECK(task);
tzikc6976962017-04-04 17:27:3474
[email protected]afecfb72013-04-18 17:17:3375 DeferredTask deferred_task;
76 deferred_task.posted_from = from_here;
tzik070c8ffb2017-03-29 05:28:1277 deferred_task.task = std::move(task);
[email protected]afecfb72013-04-18 17:17:3378 deferred_task.delay = delay;
79 deferred_task.is_non_nestable = is_non_nestable;
tzik070c8ffb2017-03-29 05:28:1280 deferred_tasks_queue_.push_back(std::move(deferred_task));
[email protected]afecfb72013-04-18 17:17:3381}
82
[email protected]afecfb72013-04-18 17:17:3383void DeferredSequencedTaskRunner::Start() {
84 AutoLock lock(lock_);
85 DCHECK(!started_);
86 started_ = true;
87 for (std::vector<DeferredTask>::iterator i = deferred_tasks_queue_.begin();
88 i != deferred_tasks_queue_.end();
89 ++i) {
tzik070c8ffb2017-03-29 05:28:1290 DeferredTask& task = *i;
[email protected]afecfb72013-04-18 17:17:3391 if (task.is_non_nestable) {
tzik070c8ffb2017-03-29 05:28:1292 target_task_runner_->PostNonNestableDelayedTask(
93 task.posted_from, std::move(task.task), task.delay);
[email protected]afecfb72013-04-18 17:17:3394 } else {
95 target_task_runner_->PostDelayedTask(task.posted_from,
tzik070c8ffb2017-03-29 05:28:1296 std::move(task.task), task.delay);
[email protected]afecfb72013-04-18 17:17:3397 }
[email protected]afecfb72013-04-18 17:17:3398 }
99 deferred_tasks_queue_.clear();
100}
101
102} // namespace base