| 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 |