1// Copyright 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 "content/browser/dom_storage/dom_storage_task_runner.h"
6
7#include "base/bind.h"
8#include "base/bind_helpers.h"
9#include "base/message_loop/message_loop_proxy.h"
10#include "base/tracked_objects.h"
11
12namespace content {
13
14// DOMStorageTaskRunner
15
16bool DOMStorageTaskRunner::RunsTasksOnCurrentThread() const {
17  return IsRunningOnSequence(PRIMARY_SEQUENCE);
18}
19
20// DOMStorageWorkerPoolTaskRunner
21
22DOMStorageWorkerPoolTaskRunner::DOMStorageWorkerPoolTaskRunner(
23    base::SequencedWorkerPool* sequenced_worker_pool,
24    base::SequencedWorkerPool::SequenceToken primary_sequence_token,
25    base::SequencedWorkerPool::SequenceToken commit_sequence_token,
26    base::MessageLoopProxy* delayed_task_loop)
27    : message_loop_(delayed_task_loop),
28      sequenced_worker_pool_(sequenced_worker_pool),
29      primary_sequence_token_(primary_sequence_token),
30      commit_sequence_token_(commit_sequence_token) {
31}
32
33DOMStorageWorkerPoolTaskRunner::~DOMStorageWorkerPoolTaskRunner() {
34}
35
36bool DOMStorageWorkerPoolTaskRunner::PostDelayedTask(
37    const tracked_objects::Location& from_here,
38    const base::Closure& task,
39    base::TimeDelta delay) {
40  // Note base::TaskRunner implements PostTask in terms of PostDelayedTask
41  // with a delay of zero, we detect that usage and avoid the unecessary
42  // trip thru the message loop.
43  if (delay == base::TimeDelta()) {
44    return sequenced_worker_pool_->PostSequencedWorkerTaskWithShutdownBehavior(
45        primary_sequence_token_, from_here, task,
46        base::SequencedWorkerPool::BLOCK_SHUTDOWN);
47  }
48  // Post a task to call this->PostTask() after the delay.
49  return message_loop_->PostDelayedTask(
50      FROM_HERE,
51      base::Bind(base::IgnoreResult(&DOMStorageWorkerPoolTaskRunner::PostTask),
52                 this, from_here, task),
53      delay);
54}
55
56bool DOMStorageWorkerPoolTaskRunner::PostShutdownBlockingTask(
57    const tracked_objects::Location& from_here,
58    SequenceID sequence_id,
59    const base::Closure& task) {
60  return sequenced_worker_pool_->PostSequencedWorkerTaskWithShutdownBehavior(
61      IDtoToken(sequence_id), from_here, task,
62      base::SequencedWorkerPool::BLOCK_SHUTDOWN);
63}
64
65bool DOMStorageWorkerPoolTaskRunner::IsRunningOnSequence(
66    SequenceID sequence_id) const {
67  return sequenced_worker_pool_->IsRunningSequenceOnCurrentThread(
68      IDtoToken(sequence_id));
69}
70
71base::SequencedWorkerPool::SequenceToken
72DOMStorageWorkerPoolTaskRunner::IDtoToken(SequenceID id) const {
73  if (id == PRIMARY_SEQUENCE)
74    return primary_sequence_token_;
75  DCHECK_EQ(COMMIT_SEQUENCE, id);
76  return commit_sequence_token_;
77}
78
79// MockDOMStorageTaskRunner
80
81MockDOMStorageTaskRunner::MockDOMStorageTaskRunner(
82    base::MessageLoopProxy* message_loop)
83    : message_loop_(message_loop) {
84}
85
86MockDOMStorageTaskRunner::~MockDOMStorageTaskRunner() {
87}
88
89bool MockDOMStorageTaskRunner::PostDelayedTask(
90    const tracked_objects::Location& from_here,
91    const base::Closure& task,
92    base::TimeDelta delay) {
93  return message_loop_->PostTask(from_here, task);
94}
95
96bool MockDOMStorageTaskRunner::PostShutdownBlockingTask(
97    const tracked_objects::Location& from_here,
98    SequenceID sequence_id,
99    const base::Closure& task) {
100  return message_loop_->PostTask(from_here, task);
101}
102
103bool MockDOMStorageTaskRunner::IsRunningOnSequence(SequenceID) const {
104  return message_loop_->RunsTasksOnCurrentThread();
105}
106
107}  // namespace content
108