summaryrefslogtreecommitdiffstats
path: root/base/deferred_sequenced_task_runner.cc
diff options
context:
space:
mode:
Diffstat (limited to 'base/deferred_sequenced_task_runner.cc')
-rw-r--r--base/deferred_sequenced_task_runner.cc99
1 files changed, 99 insertions, 0 deletions
diff --git a/base/deferred_sequenced_task_runner.cc b/base/deferred_sequenced_task_runner.cc
new file mode 100644
index 0000000..c96704c
--- /dev/null
+++ b/base/deferred_sequenced_task_runner.cc
@@ -0,0 +1,99 @@
+// 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.
+
+#include "base/deferred_sequenced_task_runner.h"
+
+#include "base/bind.h"
+#include "base/logging.h"
+
+namespace base {
+
+DeferredSequencedTaskRunner::DeferredTask::DeferredTask() {
+}
+
+DeferredSequencedTaskRunner::DeferredTask::~DeferredTask() {
+}
+
+DeferredSequencedTaskRunner::DeferredSequencedTaskRunner(
+ const scoped_refptr<SequencedTaskRunner>& target_task_runner)
+ : started_(false),
+ target_task_runner_(target_task_runner) {
+}
+
+DeferredSequencedTaskRunner::~DeferredSequencedTaskRunner() {
+}
+
+bool DeferredSequencedTaskRunner::PostDelayedTask(
+ const tracked_objects::Location& from_here,
+ const Closure& task,
+ TimeDelta delay) {
+ AutoLock lock(lock_);
+ if (started_) {
+ DCHECK(deferred_tasks_queue_.empty());
+ return target_task_runner_->PostDelayedTask(from_here, task, delay);
+ }
+
+ QueueDeferredTask(from_here, task, delay, false /* is_non_nestable */);
+ return true;
+}
+
+bool DeferredSequencedTaskRunner::RunsTasksOnCurrentThread() const {
+ return target_task_runner_->RunsTasksOnCurrentThread();
+}
+
+bool DeferredSequencedTaskRunner::PostNonNestableDelayedTask(
+ const tracked_objects::Location& from_here,
+ const Closure& task,
+ TimeDelta delay) {
+ AutoLock lock(lock_);
+ if (started_) {
+ DCHECK(deferred_tasks_queue_.empty());
+ return target_task_runner_->PostNonNestableDelayedTask(from_here,
+ task,
+ delay);
+ }
+ QueueDeferredTask(from_here, task, delay, true /* is_non_nestable */);
+ return true;
+}
+
+void DeferredSequencedTaskRunner::QueueDeferredTask(
+ const tracked_objects::Location& from_here,
+ const Closure& task,
+ TimeDelta delay,
+ bool is_non_nestable) {
+ DeferredTask deferred_task;
+ deferred_task.posted_from = from_here;
+ deferred_task.task = task;
+ deferred_task.delay = delay;
+ deferred_task.is_non_nestable = is_non_nestable;
+ deferred_tasks_queue_.push_back(deferred_task);
+}
+
+
+void DeferredSequencedTaskRunner::Start() {
+ AutoLock lock(lock_);
+ DCHECK(!started_);
+ started_ = true;
+ for (std::vector<DeferredTask>::iterator i = deferred_tasks_queue_.begin();
+ i != deferred_tasks_queue_.end();
+ ++i) {
+ const DeferredTask& task = *i;
+ if (task.is_non_nestable) {
+ target_task_runner_->PostNonNestableDelayedTask(task.posted_from,
+ task.task,
+ task.delay);
+ } else {
+ target_task_runner_->PostDelayedTask(task.posted_from,
+ task.task,
+ task.delay);
+ }
+ // Replace the i-th element in the |deferred_tasks_queue_| with an empty
+ // |DelayedTask| to ensure that |task| is destroyed before the next task
+ // is posted.
+ *i = DeferredTask();
+ }
+ deferred_tasks_queue_.clear();
+}
+
+} // namespace base