blob: aa75c3c530a1fd4697fab10a1af93f238256d43a [file] [log] [blame]
Ben Murdochbb1529c2013-08-08 10:24:53 +01001// Copyright 2013 The Chromium Authors. All rights reserved.
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +01002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Murdochbb1529c2013-08-08 10:24:53 +01005#include "content/browser/dom_storage/dom_storage_task_runner.h"
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +01006
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
Ben Murdochbb1529c2013-08-08 10:24:53 +010012namespace content {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010013
Ben Murdochbb1529c2013-08-08 10:24:53 +010014// DOMStorageTaskRunner
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010015
Ben Murdochbb1529c2013-08-08 10:24:53 +010016bool DOMStorageTaskRunner::RunsTasksOnCurrentThread() const {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010017 return IsRunningOnSequence(PRIMARY_SEQUENCE);
18}
19
Ben Murdochbb1529c2013-08-08 10:24:53 +010020// DOMStorageWorkerPoolTaskRunner
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010021
Ben Murdochbb1529c2013-08-08 10:24:53 +010022DOMStorageWorkerPoolTaskRunner::DOMStorageWorkerPoolTaskRunner(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010023 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
Ben Murdochbb1529c2013-08-08 10:24:53 +010033DOMStorageWorkerPoolTaskRunner::~DOMStorageWorkerPoolTaskRunner() {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010034}
35
Ben Murdochbb1529c2013-08-08 10:24:53 +010036bool DOMStorageWorkerPoolTaskRunner::PostDelayedTask(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010037 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,
Ben Murdochbb1529c2013-08-08 10:24:53 +010051 base::Bind(base::IgnoreResult(&DOMStorageWorkerPoolTaskRunner::PostTask),
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010052 this, from_here, task),
53 delay);
54}
55
Ben Murdochbb1529c2013-08-08 10:24:53 +010056bool DOMStorageWorkerPoolTaskRunner::PostShutdownBlockingTask(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010057 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
Ben Murdochbb1529c2013-08-08 10:24:53 +010065bool DOMStorageWorkerPoolTaskRunner::IsRunningOnSequence(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010066 SequenceID sequence_id) const {
67 return sequenced_worker_pool_->IsRunningSequenceOnCurrentThread(
68 IDtoToken(sequence_id));
69}
70
71base::SequencedWorkerPool::SequenceToken
Ben Murdochbb1529c2013-08-08 10:24:53 +010072DOMStorageWorkerPoolTaskRunner::IDtoToken(SequenceID id) const {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010073 if (id == PRIMARY_SEQUENCE)
74 return primary_sequence_token_;
75 DCHECK_EQ(COMMIT_SEQUENCE, id);
76 return commit_sequence_token_;
77}
78
Ben Murdochbb1529c2013-08-08 10:24:53 +010079// MockDOMStorageTaskRunner
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010080
Ben Murdochbb1529c2013-08-08 10:24:53 +010081MockDOMStorageTaskRunner::MockDOMStorageTaskRunner(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010082 base::MessageLoopProxy* message_loop)
83 : message_loop_(message_loop) {
84}
85
Ben Murdochbb1529c2013-08-08 10:24:53 +010086MockDOMStorageTaskRunner::~MockDOMStorageTaskRunner() {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010087}
88
Ben Murdochbb1529c2013-08-08 10:24:53 +010089bool MockDOMStorageTaskRunner::PostDelayedTask(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010090 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
Ben Murdochbb1529c2013-08-08 10:24:53 +010096bool MockDOMStorageTaskRunner::PostShutdownBlockingTask(
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +010097 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
Ben Murdochbb1529c2013-08-08 10:24:53 +0100103bool MockDOMStorageTaskRunner::IsRunningOnSequence(SequenceID) const {
Torne (Richard Coles)868fa2f2013-06-11 10:57:03 +0100104 return message_loop_->RunsTasksOnCurrentThread();
105}
106
Ben Murdochbb1529c2013-08-08 10:24:53 +0100107} // namespace content