| 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 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 // initialization failed. | 301 // initialization failed. |
| 302 DCHECK(join_for_testing_returned_.IsSignaled() || workers_.empty()); | 302 DCHECK(join_for_testing_returned_.IsSignaled() || workers_.empty()); |
| 303 } | 303 } |
| 304 | 304 |
| 305 // static | 305 // static |
| 306 std::unique_ptr<SchedulerWorkerPoolImpl> SchedulerWorkerPoolImpl::Create( | 306 std::unique_ptr<SchedulerWorkerPoolImpl> SchedulerWorkerPoolImpl::Create( |
| 307 const SchedulerWorkerPoolParams& params, | 307 const SchedulerWorkerPoolParams& params, |
| 308 const ReEnqueueSequenceCallback& re_enqueue_sequence_callback, | 308 const ReEnqueueSequenceCallback& re_enqueue_sequence_callback, |
| 309 TaskTracker* task_tracker, | 309 TaskTracker* task_tracker, |
| 310 DelayedTaskManager* delayed_task_manager) { | 310 DelayedTaskManager* delayed_task_manager) { |
| 311 std::unique_ptr<SchedulerWorkerPoolImpl> worker_pool( | 311 auto worker_pool = WrapUnique(new SchedulerWorkerPoolImpl( |
| 312 new SchedulerWorkerPoolImpl(params.name(), | 312 params.name(), params.suggested_reclaim_time(), task_tracker, |
| 313 params.io_restriction(), | 313 delayed_task_manager)); |
| 314 params.suggested_reclaim_time(), | |
| 315 task_tracker, delayed_task_manager)); | |
| 316 if (worker_pool->Initialize( | 314 if (worker_pool->Initialize( |
| 317 params.priority_hint(), params.standby_thread_policy(), | 315 params.priority_hint(), params.standby_thread_policy(), |
| 318 params.max_threads(), re_enqueue_sequence_callback)) { | 316 params.max_threads(), re_enqueue_sequence_callback)) { |
| 319 return worker_pool; | 317 return worker_pool; |
| 320 } | 318 } |
| 321 return nullptr; | 319 return nullptr; |
| 322 } | 320 } |
| 323 | 321 |
| 324 scoped_refptr<TaskRunner> SchedulerWorkerPoolImpl::CreateTaskRunnerWithTraits( | 322 scoped_refptr<TaskRunner> SchedulerWorkerPoolImpl::CreateTaskRunnerWithTraits( |
| 325 const TaskTraits& traits) { | 323 const TaskTraits& traits) { |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 } | 510 } |
| 513 | 511 |
| 514 PlatformThread::SetName( | 512 PlatformThread::SetName( |
| 515 StringPrintf("TaskScheduler%sWorker%d", outer_->name_.c_str(), index_)); | 513 StringPrintf("TaskScheduler%sWorker%d", outer_->name_.c_str(), index_)); |
| 516 | 514 |
| 517 DCHECK(!tls_current_worker_pool.Get().Get()); | 515 DCHECK(!tls_current_worker_pool.Get().Get()); |
| 518 tls_current_worker_pool.Get().Set(outer_); | 516 tls_current_worker_pool.Get().Set(outer_); |
| 519 | 517 |
| 520 // New threads haven't run GetWork() yet, so reset the |idle_start_time_|. | 518 // New threads haven't run GetWork() yet, so reset the |idle_start_time_|. |
| 521 idle_start_time_ = TimeTicks(); | 519 idle_start_time_ = TimeTicks(); |
| 522 | |
| 523 ThreadRestrictions::SetIOAllowed( | |
| 524 outer_->io_restriction_ == | |
| 525 SchedulerWorkerPoolParams::IORestriction::ALLOWED); | |
| 526 } | 520 } |
| 527 | 521 |
| 528 scoped_refptr<Sequence> | 522 scoped_refptr<Sequence> |
| 529 SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::GetWork( | 523 SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::GetWork( |
| 530 SchedulerWorker* worker) { | 524 SchedulerWorker* worker) { |
| 531 DCHECK(ContainsWorker(outer_->workers_, worker)); | 525 DCHECK(ContainsWorker(outer_->workers_, worker)); |
| 532 | 526 |
| 533 // Record the TaskScheduler.NumTasksBetweenWaits histogram if the | 527 // Record the TaskScheduler.NumTasksBetweenWaits histogram if the |
| 534 // SchedulerWorker waited on its WaitableEvent since the last GetWork(). | 528 // SchedulerWorker waited on its WaitableEvent since the last GetWork(). |
| 535 // | 529 // |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 669 void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::OnDetach() { | 663 void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::OnDetach() { |
| 670 DCHECK(!did_detach_since_last_get_work_); | 664 DCHECK(!did_detach_since_last_get_work_); |
| 671 outer_->num_tasks_before_detach_histogram_->Add(num_tasks_since_last_detach_); | 665 outer_->num_tasks_before_detach_histogram_->Add(num_tasks_since_last_detach_); |
| 672 num_tasks_since_last_detach_ = 0; | 666 num_tasks_since_last_detach_ = 0; |
| 673 did_detach_since_last_get_work_ = true; | 667 did_detach_since_last_get_work_ = true; |
| 674 last_detach_time_ = TimeTicks::Now(); | 668 last_detach_time_ = TimeTicks::Now(); |
| 675 } | 669 } |
| 676 | 670 |
| 677 SchedulerWorkerPoolImpl::SchedulerWorkerPoolImpl( | 671 SchedulerWorkerPoolImpl::SchedulerWorkerPoolImpl( |
| 678 StringPiece name, | 672 StringPiece name, |
| 679 SchedulerWorkerPoolParams::IORestriction io_restriction, | |
| 680 const TimeDelta& suggested_reclaim_time, | 673 const TimeDelta& suggested_reclaim_time, |
| 681 TaskTracker* task_tracker, | 674 TaskTracker* task_tracker, |
| 682 DelayedTaskManager* delayed_task_manager) | 675 DelayedTaskManager* delayed_task_manager) |
| 683 : name_(name.as_string()), | 676 : name_(name.as_string()), |
| 684 io_restriction_(io_restriction), | |
| 685 suggested_reclaim_time_(suggested_reclaim_time), | 677 suggested_reclaim_time_(suggested_reclaim_time), |
| 686 idle_workers_stack_lock_(shared_priority_queue_.container_lock()), | 678 idle_workers_stack_lock_(shared_priority_queue_.container_lock()), |
| 687 idle_workers_stack_cv_for_testing_( | 679 idle_workers_stack_cv_for_testing_( |
| 688 idle_workers_stack_lock_.CreateConditionVariable()), | 680 idle_workers_stack_lock_.CreateConditionVariable()), |
| 689 join_for_testing_returned_(WaitableEvent::ResetPolicy::MANUAL, | 681 join_for_testing_returned_(WaitableEvent::ResetPolicy::MANUAL, |
| 690 WaitableEvent::InitialState::NOT_SIGNALED), | 682 WaitableEvent::InitialState::NOT_SIGNALED), |
| 691 #if DCHECK_IS_ON() | 683 #if DCHECK_IS_ON() |
| 692 workers_created_(WaitableEvent::ResetPolicy::MANUAL, | 684 workers_created_(WaitableEvent::ResetPolicy::MANUAL, |
| 693 WaitableEvent::InitialState::NOT_SIGNALED), | 685 WaitableEvent::InitialState::NOT_SIGNALED), |
| 694 #endif | 686 #endif |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 AutoSchedulerLock auto_lock(idle_workers_stack_lock_); | 799 AutoSchedulerLock auto_lock(idle_workers_stack_lock_); |
| 808 idle_workers_stack_.Remove(worker); | 800 idle_workers_stack_.Remove(worker); |
| 809 } | 801 } |
| 810 | 802 |
| 811 bool SchedulerWorkerPoolImpl::CanWorkerDetachForTesting() { | 803 bool SchedulerWorkerPoolImpl::CanWorkerDetachForTesting() { |
| 812 return !worker_detachment_disallowed_.IsSet(); | 804 return !worker_detachment_disallowed_.IsSet(); |
| 813 } | 805 } |
| 814 | 806 |
| 815 } // namespace internal | 807 } // namespace internal |
| 816 } // namespace base | 808 } // namespace base |
| OLD | NEW |