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 <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <list> | 9 #include <list> |
10 #include <map> | 10 #include <map> |
11 #include <memory> | 11 #include <memory> |
12 #include <set> | 12 #include <set> |
13 #include <unordered_map> | 13 #include <unordered_map> |
14 #include <utility> | 14 #include <utility> |
15 #include <vector> | 15 #include <vector> |
16 | 16 |
17 #include "base/atomic_sequence_num.h" | 17 #include "base/atomic_sequence_num.h" |
18 #include "base/callback.h" | 18 #include "base/callback.h" |
| 19 #include "base/callback_helpers.h" |
19 #include "base/compiler_specific.h" | 20 #include "base/compiler_specific.h" |
20 #include "base/critical_closure.h" | 21 #include "base/critical_closure.h" |
21 #include "base/debug/dump_without_crashing.h" | 22 #include "base/debug/dump_without_crashing.h" |
22 #include "base/lazy_instance.h" | 23 #include "base/lazy_instance.h" |
23 #include "base/logging.h" | 24 #include "base/logging.h" |
24 #include "base/macros.h" | 25 #include "base/macros.h" |
25 #include "base/memory/ptr_util.h" | 26 #include "base/memory/ptr_util.h" |
26 #include "base/stl_util.h" | 27 #include "base/stl_util.h" |
27 #include "base/strings/stringprintf.h" | 28 #include "base/strings/stringprintf.h" |
28 #include "base/synchronization/condition_variable.h" | 29 #include "base/synchronization/condition_variable.h" |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 // | 134 // |
134 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). | 135 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
135 class SequencedWorkerPoolTaskRunner : public TaskRunner { | 136 class SequencedWorkerPoolTaskRunner : public TaskRunner { |
136 public: | 137 public: |
137 SequencedWorkerPoolTaskRunner( | 138 SequencedWorkerPoolTaskRunner( |
138 scoped_refptr<SequencedWorkerPool> pool, | 139 scoped_refptr<SequencedWorkerPool> pool, |
139 SequencedWorkerPool::WorkerShutdown shutdown_behavior); | 140 SequencedWorkerPool::WorkerShutdown shutdown_behavior); |
140 | 141 |
141 // TaskRunner implementation | 142 // TaskRunner implementation |
142 bool PostDelayedTask(const tracked_objects::Location& from_here, | 143 bool PostDelayedTask(const tracked_objects::Location& from_here, |
143 const Closure& task, | 144 Closure task, |
144 TimeDelta delay) override; | 145 TimeDelta delay) override; |
145 bool RunsTasksOnCurrentThread() const override; | 146 bool RunsTasksOnCurrentThread() const override; |
146 | 147 |
147 private: | 148 private: |
148 ~SequencedWorkerPoolTaskRunner() override; | 149 ~SequencedWorkerPoolTaskRunner() override; |
149 | 150 |
150 const scoped_refptr<SequencedWorkerPool> pool_; | 151 const scoped_refptr<SequencedWorkerPool> pool_; |
151 | 152 |
152 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; | 153 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; |
153 | 154 |
154 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolTaskRunner); | 155 DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolTaskRunner); |
155 }; | 156 }; |
156 | 157 |
157 SequencedWorkerPoolTaskRunner::SequencedWorkerPoolTaskRunner( | 158 SequencedWorkerPoolTaskRunner::SequencedWorkerPoolTaskRunner( |
158 scoped_refptr<SequencedWorkerPool> pool, | 159 scoped_refptr<SequencedWorkerPool> pool, |
159 SequencedWorkerPool::WorkerShutdown shutdown_behavior) | 160 SequencedWorkerPool::WorkerShutdown shutdown_behavior) |
160 : pool_(std::move(pool)), shutdown_behavior_(shutdown_behavior) {} | 161 : pool_(std::move(pool)), shutdown_behavior_(shutdown_behavior) {} |
161 | 162 |
162 SequencedWorkerPoolTaskRunner::~SequencedWorkerPoolTaskRunner() { | 163 SequencedWorkerPoolTaskRunner::~SequencedWorkerPoolTaskRunner() { |
163 } | 164 } |
164 | 165 |
165 bool SequencedWorkerPoolTaskRunner::PostDelayedTask( | 166 bool SequencedWorkerPoolTaskRunner::PostDelayedTask( |
166 const tracked_objects::Location& from_here, | 167 const tracked_objects::Location& from_here, |
167 const Closure& task, | 168 Closure task, |
168 TimeDelta delay) { | 169 TimeDelta delay) { |
169 if (delay.is_zero()) { | 170 if (delay.is_zero()) { |
170 return pool_->PostWorkerTaskWithShutdownBehavior( | 171 return pool_->PostWorkerTaskWithShutdownBehavior(from_here, std::move(task), |
171 from_here, task, shutdown_behavior_); | 172 shutdown_behavior_); |
172 } | 173 } |
173 return pool_->PostDelayedWorkerTask(from_here, task, delay); | 174 return pool_->PostDelayedWorkerTask(from_here, std::move(task), delay); |
174 } | 175 } |
175 | 176 |
176 bool SequencedWorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { | 177 bool SequencedWorkerPoolTaskRunner::RunsTasksOnCurrentThread() const { |
177 return pool_->RunsTasksOnCurrentThread(); | 178 return pool_->RunsTasksOnCurrentThread(); |
178 } | 179 } |
179 | 180 |
180 } // namespace | 181 } // namespace |
181 | 182 |
182 // SequencedWorkerPool::PoolSequencedTaskRunner ------------------------------ | 183 // SequencedWorkerPool::PoolSequencedTaskRunner ------------------------------ |
183 // A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a | 184 // A SequencedTaskRunner which posts tasks to a SequencedWorkerPool with a |
184 // fixed sequence token. | 185 // fixed sequence token. |
185 // | 186 // |
186 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). | 187 // Note that this class is RefCountedThreadSafe (inherited from TaskRunner). |
187 class SequencedWorkerPool::PoolSequencedTaskRunner | 188 class SequencedWorkerPool::PoolSequencedTaskRunner |
188 : public SequencedTaskRunner { | 189 : public SequencedTaskRunner { |
189 public: | 190 public: |
190 PoolSequencedTaskRunner( | 191 PoolSequencedTaskRunner( |
191 scoped_refptr<SequencedWorkerPool> pool, | 192 scoped_refptr<SequencedWorkerPool> pool, |
192 SequencedWorkerPool::SequenceToken token, | 193 SequencedWorkerPool::SequenceToken token, |
193 SequencedWorkerPool::WorkerShutdown shutdown_behavior); | 194 SequencedWorkerPool::WorkerShutdown shutdown_behavior); |
194 | 195 |
195 // TaskRunner implementation | 196 // TaskRunner implementation |
196 bool PostDelayedTask(const tracked_objects::Location& from_here, | 197 bool PostDelayedTask(const tracked_objects::Location& from_here, |
197 const Closure& task, | 198 Closure task, |
198 TimeDelta delay) override; | 199 TimeDelta delay) override; |
199 bool RunsTasksOnCurrentThread() const override; | 200 bool RunsTasksOnCurrentThread() const override; |
200 | 201 |
201 // SequencedTaskRunner implementation | 202 // SequencedTaskRunner implementation |
202 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, | 203 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
203 const Closure& task, | 204 Closure task, |
204 TimeDelta delay) override; | 205 TimeDelta delay) override; |
205 | 206 |
206 private: | 207 private: |
207 ~PoolSequencedTaskRunner() override; | 208 ~PoolSequencedTaskRunner() override; |
208 | 209 |
209 const scoped_refptr<SequencedWorkerPool> pool_; | 210 const scoped_refptr<SequencedWorkerPool> pool_; |
210 | 211 |
211 const SequencedWorkerPool::SequenceToken token_; | 212 const SequencedWorkerPool::SequenceToken token_; |
212 | 213 |
213 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; | 214 const SequencedWorkerPool::WorkerShutdown shutdown_behavior_; |
214 | 215 |
215 DISALLOW_COPY_AND_ASSIGN(PoolSequencedTaskRunner); | 216 DISALLOW_COPY_AND_ASSIGN(PoolSequencedTaskRunner); |
216 }; | 217 }; |
217 | 218 |
218 SequencedWorkerPool::PoolSequencedTaskRunner:: | 219 SequencedWorkerPool::PoolSequencedTaskRunner:: |
219 PoolSequencedTaskRunner( | 220 PoolSequencedTaskRunner( |
220 scoped_refptr<SequencedWorkerPool> pool, | 221 scoped_refptr<SequencedWorkerPool> pool, |
221 SequencedWorkerPool::SequenceToken token, | 222 SequencedWorkerPool::SequenceToken token, |
222 SequencedWorkerPool::WorkerShutdown shutdown_behavior) | 223 SequencedWorkerPool::WorkerShutdown shutdown_behavior) |
223 : pool_(std::move(pool)), | 224 : pool_(std::move(pool)), |
224 token_(token), | 225 token_(token), |
225 shutdown_behavior_(shutdown_behavior) {} | 226 shutdown_behavior_(shutdown_behavior) {} |
226 | 227 |
227 SequencedWorkerPool::PoolSequencedTaskRunner:: | 228 SequencedWorkerPool::PoolSequencedTaskRunner:: |
228 ~PoolSequencedTaskRunner() = default; | 229 ~PoolSequencedTaskRunner() = default; |
229 | 230 |
230 bool SequencedWorkerPool::PoolSequencedTaskRunner:: | 231 bool SequencedWorkerPool::PoolSequencedTaskRunner::PostDelayedTask( |
231 PostDelayedTask(const tracked_objects::Location& from_here, | 232 const tracked_objects::Location& from_here, |
232 const Closure& task, | 233 Closure task, |
233 TimeDelta delay) { | 234 TimeDelta delay) { |
234 if (delay.is_zero()) { | 235 if (delay.is_zero()) { |
235 return pool_->PostSequencedWorkerTaskWithShutdownBehavior( | 236 return pool_->PostSequencedWorkerTaskWithShutdownBehavior( |
236 token_, from_here, task, shutdown_behavior_); | 237 token_, from_here, std::move(task), shutdown_behavior_); |
237 } | 238 } |
238 return pool_->PostDelayedSequencedWorkerTask(token_, from_here, task, delay); | 239 return pool_->PostDelayedSequencedWorkerTask(token_, from_here, |
| 240 std::move(task), delay); |
239 } | 241 } |
240 | 242 |
241 bool SequencedWorkerPool::PoolSequencedTaskRunner:: | 243 bool SequencedWorkerPool::PoolSequencedTaskRunner:: |
242 RunsTasksOnCurrentThread() const { | 244 RunsTasksOnCurrentThread() const { |
243 return pool_->IsRunningSequenceOnCurrentThread(token_); | 245 return pool_->IsRunningSequenceOnCurrentThread(token_); |
244 } | 246 } |
245 | 247 |
246 bool SequencedWorkerPool::PoolSequencedTaskRunner:: | 248 bool SequencedWorkerPool::PoolSequencedTaskRunner::PostNonNestableDelayedTask( |
247 PostNonNestableDelayedTask(const tracked_objects::Location& from_here, | 249 const tracked_objects::Location& from_here, |
248 const Closure& task, | 250 Closure task, |
249 TimeDelta delay) { | 251 TimeDelta delay) { |
250 // There's no way to run nested tasks, so simply forward to | 252 // There's no way to run nested tasks, so simply forward to |
251 // PostDelayedTask. | 253 // PostDelayedTask. |
252 return PostDelayedTask(from_here, task, delay); | 254 return PostDelayedTask(from_here, std::move(task), delay); |
253 } | 255 } |
254 | 256 |
255 // Worker --------------------------------------------------------------------- | 257 // Worker --------------------------------------------------------------------- |
256 | 258 |
257 class SequencedWorkerPool::Worker : public SimpleThread { | 259 class SequencedWorkerPool::Worker : public SimpleThread { |
258 public: | 260 public: |
259 // Hold a (cyclic) ref to |worker_pool|, since we want to keep it | 261 // Hold a (cyclic) ref to |worker_pool|, since we want to keep it |
260 // around as long as we are running. | 262 // around as long as we are running. |
261 Worker(scoped_refptr<SequencedWorkerPool> worker_pool, | 263 Worker(scoped_refptr<SequencedWorkerPool> worker_pool, |
262 int thread_number, | 264 int thread_number, |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 | 343 |
342 SequenceToken GetNamedSequenceToken(const std::string& name); | 344 SequenceToken GetNamedSequenceToken(const std::string& name); |
343 | 345 |
344 // This function accepts a name and an ID. If the name is null, the | 346 // This function accepts a name and an ID. If the name is null, the |
345 // token ID is used. This allows us to implement the optional name lookup | 347 // token ID is used. This allows us to implement the optional name lookup |
346 // from a single function without having to enter the lock a separate time. | 348 // from a single function without having to enter the lock a separate time. |
347 bool PostTask(const std::string* optional_token_name, | 349 bool PostTask(const std::string* optional_token_name, |
348 SequenceToken sequence_token, | 350 SequenceToken sequence_token, |
349 WorkerShutdown shutdown_behavior, | 351 WorkerShutdown shutdown_behavior, |
350 const tracked_objects::Location& from_here, | 352 const tracked_objects::Location& from_here, |
351 const Closure& task, | 353 Closure task, |
352 TimeDelta delay); | 354 TimeDelta delay); |
353 | 355 |
354 bool RunsTasksOnCurrentThread() const; | 356 bool RunsTasksOnCurrentThread() const; |
355 | 357 |
356 bool IsRunningSequenceOnCurrentThread(SequenceToken sequence_token) const; | 358 bool IsRunningSequenceOnCurrentThread(SequenceToken sequence_token) const; |
357 | 359 |
358 void CleanupForTesting(); | 360 void CleanupForTesting(); |
359 | 361 |
360 void SignalHasWorkForTesting(); | 362 void SignalHasWorkForTesting(); |
361 | 363 |
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
685 SequencedWorkerPool::Inner::GetNamedSequenceToken(const std::string& name) { | 687 SequencedWorkerPool::Inner::GetNamedSequenceToken(const std::string& name) { |
686 AutoLock lock(lock_); | 688 AutoLock lock(lock_); |
687 return SequenceToken(LockedGetNamedTokenID(name)); | 689 return SequenceToken(LockedGetNamedTokenID(name)); |
688 } | 690 } |
689 | 691 |
690 bool SequencedWorkerPool::Inner::PostTask( | 692 bool SequencedWorkerPool::Inner::PostTask( |
691 const std::string* optional_token_name, | 693 const std::string* optional_token_name, |
692 SequenceToken sequence_token, | 694 SequenceToken sequence_token, |
693 WorkerShutdown shutdown_behavior, | 695 WorkerShutdown shutdown_behavior, |
694 const tracked_objects::Location& from_here, | 696 const tracked_objects::Location& from_here, |
695 const Closure& task, | 697 Closure task, |
696 TimeDelta delay) { | 698 TimeDelta delay) { |
697 // TODO(fdoray): Uncomment this DCHECK. It is initially commented to avoid a | 699 // TODO(fdoray): Uncomment this DCHECK. It is initially commented to avoid a |
698 // revert of the CL that adds debug::DumpWithoutCrashing() if it fails on the | 700 // revert of the CL that adds debug::DumpWithoutCrashing() if it fails on the |
699 // waterfall. https://crbug.com/622400 | 701 // waterfall. https://crbug.com/622400 |
700 // DCHECK_NE(AllPoolsState::POST_TASK_DISABLED, g_all_pools_state); | 702 // DCHECK_NE(AllPoolsState::POST_TASK_DISABLED, g_all_pools_state); |
701 if (g_all_pools_state == AllPoolsState::POST_TASK_DISABLED) | 703 if (g_all_pools_state == AllPoolsState::POST_TASK_DISABLED) |
702 debug::DumpWithoutCrashing(); | 704 debug::DumpWithoutCrashing(); |
703 | 705 |
704 DCHECK(delay.is_zero() || shutdown_behavior == SKIP_ON_SHUTDOWN); | 706 DCHECK(delay.is_zero() || shutdown_behavior == SKIP_ON_SHUTDOWN); |
705 SequencedTask sequenced(from_here); | 707 SequencedTask sequenced(from_here); |
706 sequenced.sequence_token_id = sequence_token.id_; | 708 sequenced.sequence_token_id = sequence_token.id_; |
707 sequenced.shutdown_behavior = shutdown_behavior; | 709 sequenced.shutdown_behavior = shutdown_behavior; |
708 sequenced.posted_from = from_here; | 710 sequenced.posted_from = from_here; |
709 sequenced.task = | 711 sequenced.task = shutdown_behavior == BLOCK_SHUTDOWN |
710 shutdown_behavior == BLOCK_SHUTDOWN ? | 712 ? base::MakeCriticalClosure(std::move(task)) |
711 base::MakeCriticalClosure(task) : task; | 713 : std::move(task); |
712 sequenced.time_to_run = TimeTicks::Now() + delay; | 714 sequenced.time_to_run = TimeTicks::Now() + delay; |
713 | 715 |
714 int create_thread_id = 0; | 716 int create_thread_id = 0; |
715 { | 717 { |
716 AutoLock lock(lock_); | 718 AutoLock lock(lock_); |
717 | 719 |
718 if (shutdown_called_) { | 720 if (shutdown_called_) { |
719 // Don't allow a new task to be posted if it doesn't block shutdown. | 721 // Don't allow a new task to be posted if it doesn't block shutdown. |
720 if (shutdown_behavior != BLOCK_SHUTDOWN) | 722 if (shutdown_behavior != BLOCK_SHUTDOWN) |
721 return false; | 723 return false; |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1011 | 1013 |
1012 // Complete thread creation outside the lock if necessary. | 1014 // Complete thread creation outside the lock if necessary. |
1013 if (new_thread_id) | 1015 if (new_thread_id) |
1014 FinishStartingAdditionalThread(new_thread_id); | 1016 FinishStartingAdditionalThread(new_thread_id); |
1015 | 1017 |
1016 this_worker->set_running_task_info( | 1018 this_worker->set_running_task_info( |
1017 SequenceToken(task.sequence_token_id), task.shutdown_behavior); | 1019 SequenceToken(task.sequence_token_id), task.shutdown_behavior); |
1018 | 1020 |
1019 tracked_objects::TaskStopwatch stopwatch; | 1021 tracked_objects::TaskStopwatch stopwatch; |
1020 stopwatch.Start(); | 1022 stopwatch.Start(); |
1021 task.task.Run(); | 1023 std::move(task.task).Run(); |
1022 stopwatch.Stop(); | 1024 stopwatch.Stop(); |
1023 | 1025 |
1024 tracked_objects::ThreadData::TallyRunOnNamedThreadIfTracking( | 1026 tracked_objects::ThreadData::TallyRunOnNamedThreadIfTracking( |
1025 task, stopwatch); | 1027 task, stopwatch); |
1026 | 1028 |
1027 // Make sure our task is erased outside the lock for the | 1029 // Make sure our task is erased outside the lock for the |
1028 // same reason we do this with delete_these_oustide_lock. | 1030 // same reason we do this with delete_these_oustide_lock. |
1029 // Also, do it before calling reset_running_task_info() so | 1031 // Also, do it before calling reset_running_task_info() so |
1030 // that sequence-checking from within the task's destructor | 1032 // that sequence-checking from within the task's destructor |
1031 // still works. | 1033 // still works. |
1032 task.task = Closure(); | 1034 DCHECK(!task.task); |
1033 | 1035 |
1034 this_worker->reset_running_task_info(); | 1036 this_worker->reset_running_task_info(); |
1035 } | 1037 } |
1036 DidRunWorkerTask(task); // Must be done inside the lock. | 1038 DidRunWorkerTask(task); // Must be done inside the lock. |
1037 } else if (cleanup_state_ == CLEANUP_RUNNING) { | 1039 } else if (cleanup_state_ == CLEANUP_RUNNING) { |
1038 switch (status) { | 1040 switch (status) { |
1039 case GET_WORK_WAIT: { | 1041 case GET_WORK_WAIT: { |
1040 AutoUnlock unlock(lock_); | 1042 AutoUnlock unlock(lock_); |
1041 DeleteWithoutLock(&delete_these_outside_lock, this_worker); | 1043 DeleteWithoutLock(&delete_these_outside_lock, this_worker); |
1042 } | 1044 } |
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1525 } | 1527 } |
1526 | 1528 |
1527 scoped_refptr<TaskRunner> | 1529 scoped_refptr<TaskRunner> |
1528 SequencedWorkerPool::GetTaskRunnerWithShutdownBehavior( | 1530 SequencedWorkerPool::GetTaskRunnerWithShutdownBehavior( |
1529 WorkerShutdown shutdown_behavior) { | 1531 WorkerShutdown shutdown_behavior) { |
1530 return new SequencedWorkerPoolTaskRunner(this, shutdown_behavior); | 1532 return new SequencedWorkerPoolTaskRunner(this, shutdown_behavior); |
1531 } | 1533 } |
1532 | 1534 |
1533 bool SequencedWorkerPool::PostWorkerTask( | 1535 bool SequencedWorkerPool::PostWorkerTask( |
1534 const tracked_objects::Location& from_here, | 1536 const tracked_objects::Location& from_here, |
1535 const Closure& task) { | 1537 Closure task) { |
1536 return inner_->PostTask(NULL, SequenceToken(), BLOCK_SHUTDOWN, | 1538 return inner_->PostTask(NULL, SequenceToken(), BLOCK_SHUTDOWN, from_here, |
1537 from_here, task, TimeDelta()); | 1539 std::move(task), TimeDelta()); |
1538 } | 1540 } |
1539 | 1541 |
1540 bool SequencedWorkerPool::PostDelayedWorkerTask( | 1542 bool SequencedWorkerPool::PostDelayedWorkerTask( |
1541 const tracked_objects::Location& from_here, | 1543 const tracked_objects::Location& from_here, |
1542 const Closure& task, | 1544 Closure task, |
1543 TimeDelta delay) { | 1545 TimeDelta delay) { |
1544 WorkerShutdown shutdown_behavior = | 1546 WorkerShutdown shutdown_behavior = |
1545 delay.is_zero() ? BLOCK_SHUTDOWN : SKIP_ON_SHUTDOWN; | 1547 delay.is_zero() ? BLOCK_SHUTDOWN : SKIP_ON_SHUTDOWN; |
1546 return inner_->PostTask(NULL, SequenceToken(), shutdown_behavior, | 1548 return inner_->PostTask(NULL, SequenceToken(), shutdown_behavior, from_here, |
1547 from_here, task, delay); | 1549 std::move(task), delay); |
1548 } | 1550 } |
1549 | 1551 |
1550 bool SequencedWorkerPool::PostWorkerTaskWithShutdownBehavior( | 1552 bool SequencedWorkerPool::PostWorkerTaskWithShutdownBehavior( |
1551 const tracked_objects::Location& from_here, | 1553 const tracked_objects::Location& from_here, |
1552 const Closure& task, | 1554 Closure task, |
1553 WorkerShutdown shutdown_behavior) { | 1555 WorkerShutdown shutdown_behavior) { |
1554 return inner_->PostTask(NULL, SequenceToken(), shutdown_behavior, | 1556 return inner_->PostTask(NULL, SequenceToken(), shutdown_behavior, from_here, |
1555 from_here, task, TimeDelta()); | 1557 std::move(task), TimeDelta()); |
1556 } | 1558 } |
1557 | 1559 |
1558 bool SequencedWorkerPool::PostSequencedWorkerTask( | 1560 bool SequencedWorkerPool::PostSequencedWorkerTask( |
1559 SequenceToken sequence_token, | 1561 SequenceToken sequence_token, |
1560 const tracked_objects::Location& from_here, | 1562 const tracked_objects::Location& from_here, |
1561 const Closure& task) { | 1563 Closure task) { |
1562 return inner_->PostTask(NULL, sequence_token, BLOCK_SHUTDOWN, | 1564 return inner_->PostTask(NULL, sequence_token, BLOCK_SHUTDOWN, from_here, |
1563 from_here, task, TimeDelta()); | 1565 std::move(task), TimeDelta()); |
1564 } | 1566 } |
1565 | 1567 |
1566 bool SequencedWorkerPool::PostDelayedSequencedWorkerTask( | 1568 bool SequencedWorkerPool::PostDelayedSequencedWorkerTask( |
1567 SequenceToken sequence_token, | 1569 SequenceToken sequence_token, |
1568 const tracked_objects::Location& from_here, | 1570 const tracked_objects::Location& from_here, |
1569 const Closure& task, | 1571 Closure task, |
1570 TimeDelta delay) { | 1572 TimeDelta delay) { |
1571 WorkerShutdown shutdown_behavior = | 1573 WorkerShutdown shutdown_behavior = |
1572 delay.is_zero() ? BLOCK_SHUTDOWN : SKIP_ON_SHUTDOWN; | 1574 delay.is_zero() ? BLOCK_SHUTDOWN : SKIP_ON_SHUTDOWN; |
1573 return inner_->PostTask(NULL, sequence_token, shutdown_behavior, | 1575 return inner_->PostTask(NULL, sequence_token, shutdown_behavior, from_here, |
1574 from_here, task, delay); | 1576 std::move(task), delay); |
1575 } | 1577 } |
1576 | 1578 |
1577 bool SequencedWorkerPool::PostNamedSequencedWorkerTask( | 1579 bool SequencedWorkerPool::PostNamedSequencedWorkerTask( |
1578 const std::string& token_name, | 1580 const std::string& token_name, |
1579 const tracked_objects::Location& from_here, | 1581 const tracked_objects::Location& from_here, |
1580 const Closure& task) { | 1582 Closure task) { |
1581 DCHECK(!token_name.empty()); | 1583 DCHECK(!token_name.empty()); |
1582 return inner_->PostTask(&token_name, SequenceToken(), BLOCK_SHUTDOWN, | 1584 return inner_->PostTask(&token_name, SequenceToken(), BLOCK_SHUTDOWN, |
1583 from_here, task, TimeDelta()); | 1585 from_here, std::move(task), TimeDelta()); |
1584 } | 1586 } |
1585 | 1587 |
1586 bool SequencedWorkerPool::PostSequencedWorkerTaskWithShutdownBehavior( | 1588 bool SequencedWorkerPool::PostSequencedWorkerTaskWithShutdownBehavior( |
1587 SequenceToken sequence_token, | 1589 SequenceToken sequence_token, |
1588 const tracked_objects::Location& from_here, | 1590 const tracked_objects::Location& from_here, |
1589 const Closure& task, | 1591 Closure task, |
1590 WorkerShutdown shutdown_behavior) { | 1592 WorkerShutdown shutdown_behavior) { |
1591 return inner_->PostTask(NULL, sequence_token, shutdown_behavior, | 1593 return inner_->PostTask(NULL, sequence_token, shutdown_behavior, from_here, |
1592 from_here, task, TimeDelta()); | 1594 std::move(task), TimeDelta()); |
1593 } | 1595 } |
1594 | 1596 |
1595 bool SequencedWorkerPool::PostDelayedTask( | 1597 bool SequencedWorkerPool::PostDelayedTask( |
1596 const tracked_objects::Location& from_here, | 1598 const tracked_objects::Location& from_here, |
1597 const Closure& task, | 1599 Closure task, |
1598 TimeDelta delay) { | 1600 TimeDelta delay) { |
1599 return PostDelayedWorkerTask(from_here, task, delay); | 1601 return PostDelayedWorkerTask(from_here, std::move(task), delay); |
1600 } | 1602 } |
1601 | 1603 |
1602 bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { | 1604 bool SequencedWorkerPool::RunsTasksOnCurrentThread() const { |
1603 return inner_->RunsTasksOnCurrentThread(); | 1605 return inner_->RunsTasksOnCurrentThread(); |
1604 } | 1606 } |
1605 | 1607 |
1606 void SequencedWorkerPool::FlushForTesting() { | 1608 void SequencedWorkerPool::FlushForTesting() { |
1607 DCHECK(!RunsTasksOnCurrentThread()); | 1609 DCHECK(!RunsTasksOnCurrentThread()); |
1608 base::ThreadRestrictions::ScopedAllowWait allow_wait; | 1610 base::ThreadRestrictions::ScopedAllowWait allow_wait; |
1609 if (g_all_pools_state == AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) { | 1611 if (g_all_pools_state == AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) { |
(...skipping 16 matching lines...) Expand all Loading... |
1626 bool SequencedWorkerPool::IsShutdownInProgress() { | 1628 bool SequencedWorkerPool::IsShutdownInProgress() { |
1627 return inner_->IsShutdownInProgress(); | 1629 return inner_->IsShutdownInProgress(); |
1628 } | 1630 } |
1629 | 1631 |
1630 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( | 1632 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( |
1631 SequenceToken sequence_token) const { | 1633 SequenceToken sequence_token) const { |
1632 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); | 1634 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); |
1633 } | 1635 } |
1634 | 1636 |
1635 } // namespace base | 1637 } // namespace base |
OLD | NEW |