• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
12 namespace content {
13 
14 // DOMStorageTaskRunner
15 
RunsTasksOnCurrentThread() const16 bool DOMStorageTaskRunner::RunsTasksOnCurrentThread() const {
17   return IsRunningOnSequence(PRIMARY_SEQUENCE);
18 }
19 
20 // DOMStorageWorkerPoolTaskRunner
21 
DOMStorageWorkerPoolTaskRunner(base::SequencedWorkerPool * sequenced_worker_pool,base::SequencedWorkerPool::SequenceToken primary_sequence_token,base::SequencedWorkerPool::SequenceToken commit_sequence_token,base::MessageLoopProxy * delayed_task_loop)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) {
31 }
32 
~DOMStorageWorkerPoolTaskRunner()33 DOMStorageWorkerPoolTaskRunner::~DOMStorageWorkerPoolTaskRunner() {
34 }
35 
PostDelayedTask(const tracked_objects::Location & from_here,const base::Closure & task,base::TimeDelta delay)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);
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 
PostShutdownBlockingTask(const tracked_objects::Location & from_here,SequenceID sequence_id,const base::Closure & 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);
63 }
64 
IsRunningOnSequence(SequenceID sequence_id) const65 bool DOMStorageWorkerPoolTaskRunner::IsRunningOnSequence(
66     SequenceID sequence_id) const {
67   return sequenced_worker_pool_->IsRunningSequenceOnCurrentThread(
68       IDtoToken(sequence_id));
69 }
70 
71 base::SequencedWorkerPool::SequenceToken
IDtoToken(SequenceID id) const72 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_;
77 }
78 
79 // MockDOMStorageTaskRunner
80 
MockDOMStorageTaskRunner(base::MessageLoopProxy * message_loop)81 MockDOMStorageTaskRunner::MockDOMStorageTaskRunner(
82     base::MessageLoopProxy* message_loop)
83     : message_loop_(message_loop) {
84 }
85 
~MockDOMStorageTaskRunner()86 MockDOMStorageTaskRunner::~MockDOMStorageTaskRunner() {
87 }
88 
PostDelayedTask(const tracked_objects::Location & from_here,const base::Closure & task,base::TimeDelta delay)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);
94 }
95 
PostShutdownBlockingTask(const tracked_objects::Location & from_here,SequenceID sequence_id,const base::Closure & 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);
101 }
102 
IsRunningOnSequence(SequenceID) const103 bool MockDOMStorageTaskRunner::IsRunningOnSequence(SequenceID) const {
104   return message_loop_->RunsTasksOnCurrentThread();
105 }
106 
107 }  // namespace content
108