OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/task_scheduler/scheduler_worker_pool_impl.h" | 5 #include "base/task_scheduler/scheduler_worker_pool_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <utility> | 10 #include <utility> |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 params.io_restriction(), | 313 params.io_restriction(), |
314 params.suggested_reclaim_time(), | 314 params.suggested_reclaim_time(), |
315 task_tracker, delayed_task_manager)); | 315 task_tracker, delayed_task_manager)); |
316 if (worker_pool->Initialize(params.priority_hint(), params.max_threads(), | 316 if (worker_pool->Initialize(params.priority_hint(), params.max_threads(), |
317 re_enqueue_sequence_callback)) { | 317 re_enqueue_sequence_callback)) { |
318 return worker_pool; | 318 return worker_pool; |
319 } | 319 } |
320 return nullptr; | 320 return nullptr; |
321 } | 321 } |
322 | 322 |
323 void SchedulerWorkerPoolImpl::WaitForAllWorkersIdleForTesting() { | |
324 AutoSchedulerLock auto_lock(idle_workers_stack_lock_); | |
325 while (idle_workers_stack_.Size() < workers_.size()) | |
326 idle_workers_stack_cv_for_testing_->Wait(); | |
327 } | |
328 | |
329 void SchedulerWorkerPoolImpl::JoinForTesting() { | |
330 DCHECK(!CanWorkerDetachForTesting() || suggested_reclaim_time_.is_max()) << | |
331 "Workers can detach during join."; | |
332 for (const auto& worker : workers_) | |
333 worker->JoinForTesting(); | |
334 | |
335 DCHECK(!join_for_testing_returned_.IsSignaled()); | |
336 join_for_testing_returned_.Signal(); | |
337 } | |
338 | |
339 void SchedulerWorkerPoolImpl::DisallowWorkerDetachmentForTesting() { | |
340 worker_detachment_disallowed_.Set(); | |
341 } | |
342 | |
343 scoped_refptr<TaskRunner> SchedulerWorkerPoolImpl::CreateTaskRunnerWithTraits( | 323 scoped_refptr<TaskRunner> SchedulerWorkerPoolImpl::CreateTaskRunnerWithTraits( |
344 const TaskTraits& traits) { | 324 const TaskTraits& traits) { |
345 return make_scoped_refptr(new SchedulerParallelTaskRunner(traits, this)); | 325 return make_scoped_refptr(new SchedulerParallelTaskRunner(traits, this)); |
346 } | 326 } |
347 | 327 |
348 scoped_refptr<SequencedTaskRunner> | 328 scoped_refptr<SequencedTaskRunner> |
349 SchedulerWorkerPoolImpl::CreateSequencedTaskRunnerWithTraits( | 329 SchedulerWorkerPoolImpl::CreateSequencedTaskRunnerWithTraits( |
350 const TaskTraits& traits) { | 330 const TaskTraits& traits) { |
351 return make_scoped_refptr(new SchedulerSequencedTaskRunner(traits, this)); | 331 return make_scoped_refptr(new SchedulerSequencedTaskRunner(traits, this)); |
352 } | 332 } |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 WakeUpOneWorker(); | 425 WakeUpOneWorker(); |
446 } | 426 } |
447 } | 427 } |
448 | 428 |
449 void SchedulerWorkerPoolImpl::GetHistograms( | 429 void SchedulerWorkerPoolImpl::GetHistograms( |
450 std::vector<const HistogramBase*>* histograms) const { | 430 std::vector<const HistogramBase*>* histograms) const { |
451 histograms->push_back(detach_duration_histogram_); | 431 histograms->push_back(detach_duration_histogram_); |
452 histograms->push_back(num_tasks_between_waits_histogram_); | 432 histograms->push_back(num_tasks_between_waits_histogram_); |
453 } | 433 } |
454 | 434 |
| 435 void SchedulerWorkerPoolImpl::WaitForAllWorkersIdleForTesting() { |
| 436 AutoSchedulerLock auto_lock(idle_workers_stack_lock_); |
| 437 while (idle_workers_stack_.Size() < workers_.size()) |
| 438 idle_workers_stack_cv_for_testing_->Wait(); |
| 439 } |
| 440 |
| 441 void SchedulerWorkerPoolImpl::JoinForTesting() { |
| 442 DCHECK(!CanWorkerDetachForTesting() || suggested_reclaim_time_.is_max()) |
| 443 << "Workers can detach during join."; |
| 444 for (const auto& worker : workers_) |
| 445 worker->JoinForTesting(); |
| 446 |
| 447 DCHECK(!join_for_testing_returned_.IsSignaled()); |
| 448 join_for_testing_returned_.Signal(); |
| 449 } |
| 450 |
| 451 void SchedulerWorkerPoolImpl::DisallowWorkerDetachmentForTesting() { |
| 452 worker_detachment_disallowed_.Set(); |
| 453 } |
| 454 |
455 SchedulerWorkerPoolImpl::SchedulerSingleThreadTaskRunner:: | 455 SchedulerWorkerPoolImpl::SchedulerSingleThreadTaskRunner:: |
456 SchedulerSingleThreadTaskRunner(const TaskTraits& traits, | 456 SchedulerSingleThreadTaskRunner(const TaskTraits& traits, |
457 SchedulerWorkerPool* worker_pool, | 457 SchedulerWorkerPool* worker_pool, |
458 SchedulerWorker* worker) | 458 SchedulerWorker* worker) |
459 : traits_(traits), | 459 : traits_(traits), |
460 worker_pool_(worker_pool), | 460 worker_pool_(worker_pool), |
461 worker_(worker) { | 461 worker_(worker) { |
462 DCHECK(worker_pool_); | 462 DCHECK(worker_pool_); |
463 DCHECK(worker_); | 463 DCHECK(worker_); |
464 static_cast<SchedulerWorkerDelegateImpl*>(worker_->delegate())-> | 464 static_cast<SchedulerWorkerDelegateImpl*>(worker_->delegate())-> |
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 AutoSchedulerLock auto_lock(idle_workers_stack_lock_); | 790 AutoSchedulerLock auto_lock(idle_workers_stack_lock_); |
791 idle_workers_stack_.Remove(worker); | 791 idle_workers_stack_.Remove(worker); |
792 } | 792 } |
793 | 793 |
794 bool SchedulerWorkerPoolImpl::CanWorkerDetachForTesting() { | 794 bool SchedulerWorkerPoolImpl::CanWorkerDetachForTesting() { |
795 return !worker_detachment_disallowed_.IsSet(); | 795 return !worker_detachment_disallowed_.IsSet(); |
796 } | 796 } |
797 | 797 |
798 } // namespace internal | 798 } // namespace internal |
799 } // namespace base | 799 } // namespace base |
OLD | NEW |