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