OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "base/threading/sequenced_worker_pool.h" | 5 #include "base/threading/sequenced_worker_pool.h" |
6 | 6 |
7 #include <list> | 7 #include <list> |
8 #include <map> | 8 #include <map> |
9 #include <set> | 9 #include <set> |
10 #include <utility> | 10 #include <utility> |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). | 55 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
56 class SequencedWorkerPoolTaskRunner : public TaskRunner { | 56 class SequencedWorkerPoolTaskRunner : public TaskRunner { |
57 public: | 57 public: |
58 SequencedWorkerPoolTaskRunner( | 58 SequencedWorkerPoolTaskRunner( |
59 const scoped_refptr<SequencedWorkerPool>& pool, | 59 const scoped_refptr<SequencedWorkerPool>& pool, |
60 SequencedWorkerPool::WorkerShutdown shutdown_behavior); | 60 SequencedWorkerPool::WorkerShutdown shutdown_behavior); |
61 | 61 |
62 // TaskRunner implementation | 62 // TaskRunner implementation |
63 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, | 63 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, |
64 const Closure& task, | 64 const Closure& task, |
| 65 int64 delay_ms) OVERRIDE; |
| 66 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, |
| 67 const Closure& task, |
65 TimeDelta delay) OVERRIDE; | 68 TimeDelta delay) OVERRIDE; |
66 virtual bool RunsTasksOnCurrentThread() const OVERRIDE; | 69 virtual bool RunsTasksOnCurrentThread() const OVERRIDE; |
67 | 70 |
68 private: | 71 private: |
69 virtual ~SequencedWorkerPoolTaskRunner(); | 72 virtual ~SequencedWorkerPoolTaskRunner(); |
70 | 73 |
71 // Helper function for posting a delayed task. Asserts that the delay is | 74 // Helper function for posting a delayed task. Asserts that the delay is |
72 // zero because non-zero delays are not yet supported. | 75 // zero because non-zero delays are not yet supported. |
73 bool PostDelayedTaskAssertZeroDelay( | 76 bool PostDelayedTaskAssertZeroDelay( |
74 const tracked_objects::Location& from_here, | 77 const tracked_objects::Location& from_here, |
75 const Closure& task, | 78 const Closure& task, |
| 79 int64 delay_ms); |
| 80 bool PostDelayedTaskAssertZeroDelay( |
| 81 const tracked_objects::Location& from_here, |
| 82 const Closure& task, |
76 TimeDelta delay); | 83 TimeDelta delay); |
77 | 84 |
78 const scoped_refptr<SequencedWorkerPool> pool_; | 85 const scoped_refptr<SequencedWorkerPool> pool_; |
79 | 86 |
80 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; | 87 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; |
81 | 88 |
82 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolTaskRunner); | 89 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolTaskRunner); |
83 }; | 90 }; |
84 | 91 |
85 SequencedWorkerPoolTaskRunner::SequencedWorkerPoolTaskRunner( | 92 SequencedWorkerPoolTaskRunner::SequencedWorkerPoolTaskRunner( |
86 const scoped_refptr<SequencedWorkerPool>& pool, | 93 const scoped_refptr<SequencedWorkerPool>& pool, |
87 SequencedWorkerPool::WorkerShutdown shutdown_behavior) | 94 SequencedWorkerPool::WorkerShutdown shutdown_behavior) |
88 : pool_(pool), | 95 : pool_(pool), |
89 shutdown_behavior_(shutdown_behavior) { | 96 shutdown_behavior_(shutdown_behavior) { |
90 } | 97 } |
91 | 98 |
92 SequencedWorkerPoolTaskRunner::~SequencedWorkerPoolTaskRunner() { | 99 SequencedWorkerPoolTaskRunner::~SequencedWorkerPoolTaskRunner() { |
93 } | 100 } |
94 | 101 |
95 bool SequencedWorkerPoolTaskRunner::PostDelayedTask( | 102 bool SequencedWorkerPoolTaskRunner::PostDelayedTask( |
96 const tracked_objects::Location& from_here, | 103 const tracked_objects::Location& from_here, |
97 const Closure& task, | 104 const Closure& task, |
| 105 int64 delay_ms) { |
| 106 return PostDelayedTaskAssertZeroDelay(from_here, task, delay_ms); |
| 107 } |
| 108 |
| 109 bool SequencedWorkerPoolTaskRunner::PostDelayedTask( |
| 110 const tracked_objects::Location& from_here, |
| 111 const Closure& task, |
98 TimeDelta delay) { | 112 TimeDelta delay) { |
99 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); | 113 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); |
100 } | 114 } |
101 | 115 |
102 bool SequencedWorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { | 116 bool SequencedWorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { |
103 return pool_->RunsTasksOnCurrentThread(); | 117 return pool_->RunsTasksOnCurrentThread(); |
104 } | 118 } |
105 | 119 |
106 bool SequencedWorkerPoolTaskRunner::PostDelayedTaskAssertZeroDelay( | 120 bool SequencedWorkerPoolTaskRunner::PostDelayedTaskAssertZeroDelay( |
107 const tracked_objects::Location& from_here, | 121 const tracked_objects::Location& from_here, |
108 const Closure& task, | 122 const Closure& task, |
109 TimeDelta delay) { | 123 int64 delay_ms) { |
110 // TODO(francoisk777@gmail.com): Change the following two statements once | 124 // TODO(francoisk777@gmail.com): Change the following two statements once |
111 // SequencedWorkerPool supports non-zero delays. | 125 // SequencedWorkerPool supports non-zero delays. |
112 DCHECK_EQ(delay.InMillisecondsRoundedUp(), 0) | 126 DCHECK_EQ(delay_ms, 0) |
113 << "SequencedWorkerPoolTaskRunner does not yet support non-zero delays"; | 127 << "SequencedWorkerPoolTaskRunner does not yet support non-zero delays"; |
114 return pool_->PostWorkerTaskWithShutdownBehavior( | 128 return pool_->PostWorkerTaskWithShutdownBehavior( |
115 from_here, task, shutdown_behavior_); | 129 from_here, task, shutdown_behavior_); |
116 } | 130 } |
117 | 131 |
| 132 bool SequencedWorkerPoolTaskRunner::PostDelayedTaskAssertZeroDelay( |
| 133 const tracked_objects::Location& from_here, |
| 134 const Closure& task, |
| 135 TimeDelta delay) { |
| 136 return PostDelayedTaskAssertZeroDelay(from_here, |
| 137 task, |
| 138 delay.InMillisecondsRoundedUp()); |
| 139 } |
| 140 |
118 // SequencedWorkerPoolSequencedTaskRunner ------------------------------------ | 141 // SequencedWorkerPoolSequencedTaskRunner ------------------------------------ |
119 // A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a | 142 // A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a |
120 // fixed sequence token. | 143 // fixed sequence token. |
121 // | 144 // |
122 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). | 145 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
123 class SequencedWorkerPoolSequencedTaskRunner : public SequencedTaskRunner { | 146 class SequencedWorkerPoolSequencedTaskRunner : public SequencedTaskRunner { |
124 public: | 147 public: |
125 SequencedWorkerPoolSequencedTaskRunner( | 148 SequencedWorkerPoolSequencedTaskRunner( |
126 const scoped_refptr<SequencedWorkerPool>& pool, | 149 const scoped_refptr<SequencedWorkerPool>& pool, |
127 SequencedWorkerPool::SequenceToken token, | 150 SequencedWorkerPool::SequenceToken token, |
128 SequencedWorkerPool::WorkerShutdown shutdown_behavior); | 151 SequencedWorkerPool::WorkerShutdown shutdown_behavior); |
129 | 152 |
130 // TaskRunner implementation | 153 // TaskRunner implementation |
131 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, | 154 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, |
132 const Closure& task, | 155 const Closure& task, |
| 156 int64 delay_ms) OVERRIDE; |
| 157 virtual bool PostDelayedTask(const tracked_objects::Location& from_here, |
| 158 const Closure& task, |
133 TimeDelta delay) OVERRIDE; | 159 TimeDelta delay) OVERRIDE; |
134 virtual bool RunsTasksOnCurrentThread() const OVERRIDE; | 160 virtual bool RunsTasksOnCurrentThread() const OVERRIDE; |
135 | 161 |
136 // SequencedTaskRunner implementation | 162 // SequencedTaskRunner implementation |
137 virtual bool PostNonNestableDelayedTask( | 163 virtual bool PostNonNestableDelayedTask( |
138 const tracked_objects::Location& from_here, | 164 const tracked_objects::Location& from_here, |
139 const Closure& task, | 165 const Closure& task, |
| 166 int64 delay_ms) OVERRIDE; |
| 167 virtual bool PostNonNestableDelayedTask( |
| 168 const tracked_objects::Location& from_here, |
| 169 const Closure& task, |
140 TimeDelta delay) OVERRIDE; | 170 TimeDelta delay) OVERRIDE; |
141 | 171 |
142 private: | 172 private: |
143 virtual ~SequencedWorkerPoolSequencedTaskRunner(); | 173 virtual ~SequencedWorkerPoolSequencedTaskRunner(); |
144 | 174 |
145 // Helper function for posting a delayed task. Asserts that the delay is | 175 // Helper function for posting a delayed task. Asserts that the delay is |
146 // zero because non-zero delays are not yet supported. | 176 // zero because non-zero delays are not yet supported. |
147 bool PostDelayedTaskAssertZeroDelay( | 177 bool PostDelayedTaskAssertZeroDelay( |
148 const tracked_objects::Location& from_here, | 178 const tracked_objects::Location& from_here, |
149 const Closure& task, | 179 const Closure& task, |
| 180 int64 delay_ms); |
| 181 bool PostDelayedTaskAssertZeroDelay( |
| 182 const tracked_objects::Location& from_here, |
| 183 const Closure& task, |
150 TimeDelta delay); | 184 TimeDelta delay); |
151 | 185 |
152 const scoped_refptr<SequencedWorkerPool> pool_; | 186 const scoped_refptr<SequencedWorkerPool> pool_; |
153 | 187 |
154 const SequencedWorkerPool::SequenceToken token_; | 188 const SequencedWorkerPool::SequenceToken token_; |
155 | 189 |
156 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; | 190 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; |
157 | 191 |
158 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolSequencedTaskRunner); | 192 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolSequencedTaskRunner); |
159 }; | 193 }; |
160 | 194 |
161 SequencedWorkerPoolSequencedTaskRunner::SequencedWorkerPoolSequencedTaskRunner( | 195 SequencedWorkerPoolSequencedTaskRunner::SequencedWorkerPoolSequencedTaskRunner( |
162 const scoped_refptr<SequencedWorkerPool>& pool, | 196 const scoped_refptr<SequencedWorkerPool>& pool, |
163 SequencedWorkerPool::SequenceToken token, | 197 SequencedWorkerPool::SequenceToken token, |
164 SequencedWorkerPool::WorkerShutdown shutdown_behavior) | 198 SequencedWorkerPool::WorkerShutdown shutdown_behavior) |
165 : pool_(pool), | 199 : pool_(pool), |
166 token_(token), | 200 token_(token), |
167 shutdown_behavior_(shutdown_behavior) { | 201 shutdown_behavior_(shutdown_behavior) { |
168 } | 202 } |
169 | 203 |
170 SequencedWorkerPoolSequencedTaskRunner:: | 204 SequencedWorkerPoolSequencedTaskRunner:: |
171 ~SequencedWorkerPoolSequencedTaskRunner() { | 205 ~SequencedWorkerPoolSequencedTaskRunner() { |
172 } | 206 } |
173 | 207 |
174 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask( | 208 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask( |
175 const tracked_objects::Location& from_here, | 209 const tracked_objects::Location& from_here, |
176 const Closure& task, | 210 const Closure& task, |
| 211 int64 delay_ms) { |
| 212 return PostDelayedTaskAssertZeroDelay(from_here, task, delay_ms); |
| 213 } |
| 214 |
| 215 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTask( |
| 216 const tracked_objects::Location& from_here, |
| 217 const Closure& task, |
177 TimeDelta delay) { | 218 TimeDelta delay) { |
178 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); | 219 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); |
179 } | 220 } |
180 | 221 |
181 bool SequencedWorkerPoolSequencedTaskRunner::RunsTasksOnCurrentThread() const { | 222 bool SequencedWorkerPoolSequencedTaskRunner::RunsTasksOnCurrentThread() const { |
182 return pool_->IsRunningSequenceOnCurrentThread(token_); | 223 return pool_->IsRunningSequenceOnCurrentThread(token_); |
183 } | 224 } |
184 | 225 |
185 bool SequencedWorkerPoolSequencedTaskRunner::PostNonNestableDelayedTask( | 226 bool SequencedWorkerPoolSequencedTaskRunner::PostNonNestableDelayedTask( |
186 const tracked_objects::Location& from_here, | 227 const tracked_objects::Location& from_here, |
187 const Closure& task, | 228 const Closure& task, |
| 229 int64 delay_ms) { |
| 230 return PostDelayedTaskAssertZeroDelay(from_here, task, delay_ms); |
| 231 } |
| 232 |
| 233 bool SequencedWorkerPoolSequencedTaskRunner::PostNonNestableDelayedTask( |
| 234 const tracked_objects::Location& from_here, |
| 235 const Closure& task, |
188 TimeDelta delay) { | 236 TimeDelta delay) { |
189 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); | 237 return PostDelayedTaskAssertZeroDelay(from_here, task, delay); |
190 } | 238 } |
191 | 239 |
192 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTaskAssertZeroDelay( | 240 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTaskAssertZeroDelay( |
193 const tracked_objects::Location& from_here, | 241 const tracked_objects::Location& from_here, |
194 const Closure& task, | 242 const Closure& task, |
195 TimeDelta delay) { | 243 int64 delay_ms) { |
196 // TODO(francoisk777@gmail.com): Change the following two statements once | 244 // TODO(francoisk777@gmail.com): Change the following two statements once |
197 // SequencedWorkerPool supports non-zero delays. | 245 // SequencedWorkerPool supports non-zero delays. |
198 DCHECK_EQ(delay.InMillisecondsRoundedUp(), 0) | 246 DCHECK_EQ(delay_ms, 0) |
199 << "SequencedWorkerPoolSequencedTaskRunner does not yet support non-zero" | 247 << "SequencedWorkerPoolSequencedTaskRunner does not yet support non-zero" |
200 " delays"; | 248 " delays"; |
201 return pool_->PostSequencedWorkerTaskWithShutdownBehavior( | 249 return pool_->PostSequencedWorkerTaskWithShutdownBehavior( |
202 token_, from_here, task, shutdown_behavior_); | 250 token_, from_here, task, shutdown_behavior_); |
203 } | 251 } |
204 | 252 |
| 253 bool SequencedWorkerPoolSequencedTaskRunner::PostDelayedTaskAssertZeroDelay( |
| 254 const tracked_objects::Location& from_here, |
| 255 const Closure& task, |
| 256 TimeDelta delay) { |
| 257 return PostDelayedTaskAssertZeroDelay(from_here, |
| 258 task, |
| 259 delay.InMillisecondsRoundedUp()); |
| 260 } |
| 261 |
205 } // namespace | 262 } // namespace |
206 | 263 |
207 // Worker --------------------------------------------------------------------- | 264 // Worker --------------------------------------------------------------------- |
208 | 265 |
209 class SequencedWorkerPool::Worker : public SimpleThread { | 266 class SequencedWorkerPool::Worker : public SimpleThread { |
210 public: | 267 public: |
211 // Hold a (cyclic) ref to |worker_pool|, since we want to keep it | 268 // Hold a (cyclic) ref to |worker_pool|, since we want to keep it |
212 // around as long as we are running. | 269 // around as long as we are running. |
213 Worker(const scoped_refptr<SequencedWorkerPool>& worker_pool, | 270 Worker(const scoped_refptr<SequencedWorkerPool>& worker_pool, |
214 int thread_number, | 271 int thread_number, |
(...skipping 754 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
969 const tracked_objects::Location& from_here, | 1026 const tracked_objects::Location& from_here, |
970 const Closure& task, | 1027 const Closure& task, |
971 WorkerShutdown shutdown_behavior) { | 1028 WorkerShutdown shutdown_behavior) { |
972 return inner_->PostTask(NULL, sequence_token, shutdown_behavior, | 1029 return inner_->PostTask(NULL, sequence_token, shutdown_behavior, |
973 from_here, task); | 1030 from_here, task); |
974 } | 1031 } |
975 | 1032 |
976 bool SequencedWorkerPool::PostDelayedTask( | 1033 bool SequencedWorkerPool::PostDelayedTask( |
977 const tracked_objects::Location& from_here, | 1034 const tracked_objects::Location& from_here, |
978 const Closure& task, | 1035 const Closure& task, |
| 1036 int64 delay_ms) { |
| 1037 // TODO(akalin): Add support for non-zero delays. |
| 1038 DCHECK_EQ(delay_ms, 0); |
| 1039 return PostWorkerTask(from_here, task); |
| 1040 } |
| 1041 |
| 1042 bool SequencedWorkerPool::PostDelayedTask( |
| 1043 const tracked_objects::Location& from_here, |
| 1044 const Closure& task, |
979 TimeDelta delay) { | 1045 TimeDelta delay) { |
980 // TODO(akalin): Add support for non-zero delays. | 1046 // TODO(akalin): Add support for non-zero delays. |
981 DCHECK_EQ(delay.InMillisecondsRoundedUp(), 0); | 1047 DCHECK_EQ(delay.InMillisecondsRoundedUp(), 0); |
982 return PostWorkerTask(from_here, task); | 1048 return PostWorkerTask(from_here, task); |
983 } | 1049 } |
984 | 1050 |
985 bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { | 1051 bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { |
986 return inner_->RunsTasksOnCurrentThread(); | 1052 return inner_->RunsTasksOnCurrentThread(); |
987 } | 1053 } |
988 | 1054 |
989 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( | 1055 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( |
990 SequenceToken sequence_token) const { | 1056 SequenceToken sequence_token) const { |
991 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); | 1057 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); |
992 } | 1058 } |
993 | 1059 |
994 void SequencedWorkerPool::FlushForTesting() { | 1060 void SequencedWorkerPool::FlushForTesting() { |
995 inner_->FlushForTesting(); | 1061 inner_->FlushForTesting(); |
996 } | 1062 } |
997 | 1063 |
998 void SequencedWorkerPool::SignalHasWorkForTesting() { | 1064 void SequencedWorkerPool::SignalHasWorkForTesting() { |
999 inner_->SignalHasWorkForTesting(); | 1065 inner_->SignalHasWorkForTesting(); |
1000 } | 1066 } |
1001 | 1067 |
1002 void SequencedWorkerPool::Shutdown() { | 1068 void SequencedWorkerPool::Shutdown() { |
1003 DCHECK(constructor_message_loop_->BelongsToCurrentThread()); | 1069 DCHECK(constructor_message_loop_->BelongsToCurrentThread()); |
1004 inner_->Shutdown(); | 1070 inner_->Shutdown(); |
1005 } | 1071 } |
1006 | 1072 |
1007 } // namespace base | 1073 } // namespace base |
OLD | NEW |