OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_H_ | 5 #ifndef CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_H_ |
6 #define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_H_ | 6 #define CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_H_ |
7 | 7 |
8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
9 #include "base/sequence_checker.h" | 9 #include "base/sequence_checker.h" |
10 #include "base/sequenced_task_runner.h" | 10 #include "base/sequenced_task_runner.h" |
11 #include "base/single_thread_task_runner.h" | |
12 #include "base/threading/sequenced_worker_pool.h" | |
13 #include "base/time/time.h" | 11 #include "base/time/time.h" |
14 #include "content/common/content_export.h" | 12 #include "content/common/content_export.h" |
15 | 13 |
16 namespace base { | |
17 class SingleThreadTaskRunner; | |
18 } | |
19 | |
20 namespace content { | 14 namespace content { |
21 | 15 |
22 // DOMStorage uses two task sequences (primary vs commit) to avoid | 16 // DOMStorage uses two task sequences (primary vs commit) to avoid |
23 // primary access from queuing up behind commits to disk. | 17 // primary access from queuing up behind commits to disk. |
24 // * Initialization, shutdown, and administrative tasks are performed as | 18 // * Initialization, shutdown, and administrative tasks are performed as |
25 // shutdown-blocking primary sequence tasks. | 19 // shutdown-blocking primary sequence tasks. |
26 // * Tasks directly related to the javascript'able interface are performed | 20 // * Tasks directly related to the javascript'able interface are performed |
27 // as shutdown-blocking primary sequence tasks. | 21 // as shutdown-blocking primary sequence tasks. |
28 // TODO(michaeln): Skip tasks for reading during shutdown. | 22 // TODO(michaeln): Skip tasks for reading during shutdown. |
29 // * Internal tasks related to committing changes to disk are performed as | 23 // * Internal tasks related to committing changes to disk are performed as |
(...skipping 21 matching lines...) Expand all Loading... |
51 virtual void AssertIsRunningOnPrimarySequence() const = 0; | 45 virtual void AssertIsRunningOnPrimarySequence() const = 0; |
52 virtual void AssertIsRunningOnCommitSequence() const = 0; | 46 virtual void AssertIsRunningOnCommitSequence() const = 0; |
53 | 47 |
54 virtual scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner( | 48 virtual scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner( |
55 SequenceID sequence_id) = 0; | 49 SequenceID sequence_id) = 0; |
56 | 50 |
57 protected: | 51 protected: |
58 ~DOMStorageTaskRunner() override {} | 52 ~DOMStorageTaskRunner() override {} |
59 }; | 53 }; |
60 | 54 |
61 // A derived class used in chromium that utilizes a SequenceWorkerPool | 55 // A DOMStorageTaskRunner which manages a primary and a commit sequence. |
62 // under dom_storage specific SequenceTokens. The |delayed_task_loop| | |
63 // is used to delay scheduling on the worker pool. | |
64 class CONTENT_EXPORT DOMStorageWorkerPoolTaskRunner : | 56 class CONTENT_EXPORT DOMStorageWorkerPoolTaskRunner : |
65 public DOMStorageTaskRunner { | 57 public DOMStorageTaskRunner { |
66 public: | 58 public: |
| 59 // |primary_sequence| and |commit_sequence| should have |
| 60 // TaskShutdownBehaviour::BLOCK_SHUTDOWN semantics. |
67 DOMStorageWorkerPoolTaskRunner( | 61 DOMStorageWorkerPoolTaskRunner( |
68 base::SequencedWorkerPool* sequenced_worker_pool, | 62 scoped_refptr<base::SequencedTaskRunner> primary_sequence, |
69 base::SequencedWorkerPool::SequenceToken primary_sequence_token, | 63 scoped_refptr<base::SequencedTaskRunner> commit_sequence); |
70 base::SequencedWorkerPool::SequenceToken commit_sequence_token, | |
71 base::SingleThreadTaskRunner* delayed_task_task_runner); | |
72 | 64 |
73 bool RunsTasksOnCurrentThread() const override; | 65 bool RunsTasksOnCurrentThread() const override; |
74 | 66 |
75 bool PostDelayedTask(const tracked_objects::Location& from_here, | 67 bool PostDelayedTask(const tracked_objects::Location& from_here, |
76 const base::Closure& task, | 68 const base::Closure& task, |
77 base::TimeDelta delay) override; | 69 base::TimeDelta delay) override; |
78 | 70 |
79 bool PostShutdownBlockingTask(const tracked_objects::Location& from_here, | 71 bool PostShutdownBlockingTask(const tracked_objects::Location& from_here, |
80 SequenceID sequence_id, | 72 SequenceID sequence_id, |
81 const base::Closure& task) override; | 73 const base::Closure& task) override; |
82 | 74 |
83 void AssertIsRunningOnPrimarySequence() const override; | 75 void AssertIsRunningOnPrimarySequence() const override; |
84 void AssertIsRunningOnCommitSequence() const override; | 76 void AssertIsRunningOnCommitSequence() const override; |
85 | 77 |
86 scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner( | 78 scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner( |
87 SequenceID sequence_id) override; | 79 SequenceID sequence_id) override; |
88 | 80 |
89 protected: | 81 protected: |
90 ~DOMStorageWorkerPoolTaskRunner() override; | 82 ~DOMStorageWorkerPoolTaskRunner() override; |
91 | 83 |
92 private: | 84 private: |
| 85 scoped_refptr<base::SequencedTaskRunner> primary_sequence_; |
| 86 scoped_refptr<base::SequencedTaskRunner> commit_sequence_; |
93 | 87 |
94 base::SequencedWorkerPool::SequenceToken IDtoToken(SequenceID id) const; | 88 DISALLOW_COPY_AND_ASSIGN(DOMStorageWorkerPoolTaskRunner); |
95 | |
96 const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | |
97 const scoped_refptr<base::SequencedWorkerPool> sequenced_worker_pool_; | |
98 base::SequencedWorkerPool::SequenceToken primary_sequence_token_; | |
99 base::SequenceChecker primary_sequence_checker_; | |
100 base::SequencedWorkerPool::SequenceToken commit_sequence_token_; | |
101 base::SequenceChecker commit_sequence_checker_; | |
102 }; | 89 }; |
103 | 90 |
104 // A derived class used in unit tests that ignores all delays so | 91 // A derived class used in unit tests that ignores all delays so |
105 // we don't block in unit tests waiting for timeouts to expire. | 92 // we don't block in unit tests waiting for timeouts to expire. |
106 // There is no distinction between [non]-shutdown-blocking or | 93 // There is no distinction between [non]-shutdown-blocking or |
107 // the primary sequence vs the commit sequence in the mock, | 94 // the primary sequence vs the commit sequence in the mock, |
108 // all tasks are scheduled on |message_loop| with zero delay. | 95 // all tasks are scheduled on |task_runner| with zero delay. |
109 class CONTENT_EXPORT MockDOMStorageTaskRunner : | 96 class CONTENT_EXPORT MockDOMStorageTaskRunner : |
110 public DOMStorageTaskRunner { | 97 public DOMStorageTaskRunner { |
111 public: | 98 public: |
112 explicit MockDOMStorageTaskRunner(base::SingleThreadTaskRunner* task_runner); | 99 explicit MockDOMStorageTaskRunner( |
| 100 scoped_refptr<base::SequencedTaskRunner> task_runner); |
113 | 101 |
114 bool RunsTasksOnCurrentThread() const override; | 102 bool RunsTasksOnCurrentThread() const override; |
115 | 103 |
116 bool PostDelayedTask(const tracked_objects::Location& from_here, | 104 bool PostDelayedTask(const tracked_objects::Location& from_here, |
117 const base::Closure& task, | 105 const base::Closure& task, |
118 base::TimeDelta delay) override; | 106 base::TimeDelta delay) override; |
119 | 107 |
120 bool PostShutdownBlockingTask(const tracked_objects::Location& from_here, | 108 bool PostShutdownBlockingTask(const tracked_objects::Location& from_here, |
121 SequenceID sequence_id, | 109 SequenceID sequence_id, |
122 const base::Closure& task) override; | 110 const base::Closure& task) override; |
123 | 111 |
124 void AssertIsRunningOnPrimarySequence() const override; | 112 void AssertIsRunningOnPrimarySequence() const override; |
125 void AssertIsRunningOnCommitSequence() const override; | 113 void AssertIsRunningOnCommitSequence() const override; |
126 | 114 |
127 scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner( | 115 scoped_refptr<base::SequencedTaskRunner> GetSequencedTaskRunner( |
128 SequenceID sequence_id) override; | 116 SequenceID sequence_id) override; |
129 | 117 |
130 protected: | 118 protected: |
131 ~MockDOMStorageTaskRunner() override; | 119 ~MockDOMStorageTaskRunner() override; |
132 | 120 |
133 private: | 121 private: |
134 const scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 122 const scoped_refptr<base::SequencedTaskRunner> task_runner_; |
| 123 |
| 124 DISALLOW_COPY_AND_ASSIGN(MockDOMStorageTaskRunner); |
135 }; | 125 }; |
136 | 126 |
137 } // namespace content | 127 } // namespace content |
138 | 128 |
139 #endif // CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_H_ | 129 #endif // CONTENT_BROWSER_DOM_STORAGE_DOM_STORAGE_TASK_RUNNER_H_ |
OLD | NEW |