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.
5 #include "content/browser/dom_storage/dom_storage_task_runner.h"
8 #include "base/bind_helpers.h"
9 #include "base/message_loop/message_loop_proxy.h"
10 #include "base/tracked_objects.h"
14 // DOMStorageTaskRunner
16 bool DOMStorageTaskRunner::RunsTasksOnCurrentThread() const {
17 return IsRunningOnSequence(PRIMARY_SEQUENCE
);
20 // DOMStorageWorkerPoolTaskRunner
22 DOMStorageWorkerPoolTaskRunner::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
) {
33 DOMStorageWorkerPoolTaskRunner::~DOMStorageWorkerPoolTaskRunner() {
36 bool 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
);
48 // Post a task to call this->PostTask() after the delay.
49 return message_loop_
->PostDelayedTask(
51 base::Bind(base::IgnoreResult(&DOMStorageWorkerPoolTaskRunner::PostTask
),
52 this, from_here
, task
),
56 bool 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
);
65 bool DOMStorageWorkerPoolTaskRunner::IsRunningOnSequence(
66 SequenceID sequence_id
) const {
67 return sequenced_worker_pool_
->IsRunningSequenceOnCurrentThread(
68 IDtoToken(sequence_id
));
71 base::SequencedWorkerPool::SequenceToken
72 DOMStorageWorkerPoolTaskRunner::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_
;
79 // MockDOMStorageTaskRunner
81 MockDOMStorageTaskRunner::MockDOMStorageTaskRunner(
82 base::MessageLoopProxy
* message_loop
)
83 : message_loop_(message_loop
) {
86 MockDOMStorageTaskRunner::~MockDOMStorageTaskRunner() {
89 bool 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
);
96 bool 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
);
103 bool MockDOMStorageTaskRunner::IsRunningOnSequence(SequenceID
) const {
104 return message_loop_
->RunsTasksOnCurrentThread();
107 } // namespace content