| 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_thread_pool.h" | 5 #include "base/task_scheduler/scheduler_thread_pool.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 // initialization failed. | 133 // initialization failed. |
| 134 DCHECK(join_for_testing_returned_.IsSignaled() || worker_threads_.empty()); | 134 DCHECK(join_for_testing_returned_.IsSignaled() || worker_threads_.empty()); |
| 135 } | 135 } |
| 136 | 136 |
| 137 std::unique_ptr<SchedulerThreadPool> SchedulerThreadPool::CreateThreadPool( | 137 std::unique_ptr<SchedulerThreadPool> SchedulerThreadPool::CreateThreadPool( |
| 138 ThreadPriority thread_priority, | 138 ThreadPriority thread_priority, |
| 139 size_t max_threads, | 139 size_t max_threads, |
| 140 const EnqueueSequenceCallback& enqueue_sequence_callback, | 140 const EnqueueSequenceCallback& enqueue_sequence_callback, |
| 141 TaskTracker* task_tracker, | 141 TaskTracker* task_tracker, |
| 142 DelayedTaskManager* delayed_task_manager) { | 142 DelayedTaskManager* delayed_task_manager) { |
| 143 std::unique_ptr<SchedulerThreadPool> thread_pool(new SchedulerThreadPool( | 143 std::unique_ptr<SchedulerThreadPool> thread_pool( |
| 144 enqueue_sequence_callback, task_tracker, delayed_task_manager)); | 144 new SchedulerThreadPool(task_tracker, delayed_task_manager)); |
| 145 if (thread_pool->Initialize(thread_priority, max_threads)) | 145 if (thread_pool->Initialize(thread_priority, max_threads, |
| 146 enqueue_sequence_callback)) |
| 146 return thread_pool; | 147 return thread_pool; |
| 147 return nullptr; | 148 return nullptr; |
| 148 } | 149 } |
| 149 | 150 |
| 150 scoped_refptr<TaskRunner> SchedulerThreadPool::CreateTaskRunnerWithTraits( | 151 scoped_refptr<TaskRunner> SchedulerThreadPool::CreateTaskRunnerWithTraits( |
| 151 const TaskTraits& traits, | 152 const TaskTraits& traits, |
| 152 ExecutionMode execution_mode) { | 153 ExecutionMode execution_mode) { |
| 153 switch (execution_mode) { | 154 switch (execution_mode) { |
| 154 case ExecutionMode::PARALLEL: | 155 case ExecutionMode::PARALLEL: |
| 155 return make_scoped_refptr(new SchedulerParallelTaskRunner(traits, this)); | 156 return make_scoped_refptr(new SchedulerParallelTaskRunner(traits, this)); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 transaction->Pop(); | 290 transaction->Pop(); |
| 290 return sequence; | 291 return sequence; |
| 291 } | 292 } |
| 292 | 293 |
| 293 void SchedulerThreadPool::SchedulerWorkerThreadDelegateImpl::EnqueueSequence( | 294 void SchedulerThreadPool::SchedulerWorkerThreadDelegateImpl::EnqueueSequence( |
| 294 scoped_refptr<Sequence> sequence) { | 295 scoped_refptr<Sequence> sequence) { |
| 295 enqueue_sequence_callback_.Run(std::move(sequence)); | 296 enqueue_sequence_callback_.Run(std::move(sequence)); |
| 296 } | 297 } |
| 297 | 298 |
| 298 SchedulerThreadPool::SchedulerThreadPool( | 299 SchedulerThreadPool::SchedulerThreadPool( |
| 299 const EnqueueSequenceCallback& enqueue_sequence_callback, | |
| 300 TaskTracker* task_tracker, | 300 TaskTracker* task_tracker, |
| 301 DelayedTaskManager* delayed_task_manager) | 301 DelayedTaskManager* delayed_task_manager) |
| 302 : idle_worker_threads_stack_lock_(shared_priority_queue_.container_lock()), | 302 : idle_worker_threads_stack_lock_(shared_priority_queue_.container_lock()), |
| 303 idle_worker_threads_stack_cv_for_testing_( | 303 idle_worker_threads_stack_cv_for_testing_( |
| 304 idle_worker_threads_stack_lock_.CreateConditionVariable()), | 304 idle_worker_threads_stack_lock_.CreateConditionVariable()), |
| 305 join_for_testing_returned_(true, false), | 305 join_for_testing_returned_(true, false), |
| 306 worker_thread_delegate_( | |
| 307 new SchedulerWorkerThreadDelegateImpl(this, | |
| 308 enqueue_sequence_callback)), | |
| 309 task_tracker_(task_tracker), | 306 task_tracker_(task_tracker), |
| 310 delayed_task_manager_(delayed_task_manager) { | 307 delayed_task_manager_(delayed_task_manager) { |
| 311 DCHECK(task_tracker_); | 308 DCHECK(task_tracker_); |
| 312 DCHECK(delayed_task_manager_); | 309 DCHECK(delayed_task_manager_); |
| 313 } | 310 } |
| 314 | 311 |
| 315 bool SchedulerThreadPool::Initialize(ThreadPriority thread_priority, | 312 bool SchedulerThreadPool::Initialize( |
| 316 size_t max_threads) { | 313 ThreadPriority thread_priority, |
| 314 size_t max_threads, |
| 315 const EnqueueSequenceCallback& enqueue_sequence_callback) { |
| 317 AutoSchedulerLock auto_lock(idle_worker_threads_stack_lock_); | 316 AutoSchedulerLock auto_lock(idle_worker_threads_stack_lock_); |
| 318 | 317 |
| 319 DCHECK(worker_threads_.empty()); | 318 DCHECK(worker_threads_.empty()); |
| 320 | 319 |
| 321 for (size_t i = 0; i < max_threads; ++i) { | 320 for (size_t i = 0; i < max_threads; ++i) { |
| 322 std::unique_ptr<SchedulerWorkerThread> worker_thread = | 321 std::unique_ptr<SchedulerWorkerThread> worker_thread = |
| 323 SchedulerWorkerThread::CreateSchedulerWorkerThread( | 322 SchedulerWorkerThread::CreateWorkerThread( |
| 324 thread_priority, worker_thread_delegate_.get(), task_tracker_); | 323 thread_priority, WrapUnique(new SchedulerWorkerThreadDelegateImpl( |
| 324 this, enqueue_sequence_callback)), |
| 325 task_tracker_); |
| 325 if (!worker_thread) | 326 if (!worker_thread) |
| 326 break; | 327 break; |
| 327 idle_worker_threads_stack_.Push(worker_thread.get()); | 328 idle_worker_threads_stack_.Push(worker_thread.get()); |
| 328 worker_threads_.push_back(std::move(worker_thread)); | 329 worker_threads_.push_back(std::move(worker_thread)); |
| 329 } | 330 } |
| 330 | 331 |
| 331 return !worker_threads_.empty(); | 332 return !worker_threads_.empty(); |
| 332 } | 333 } |
| 333 | 334 |
| 334 void SchedulerThreadPool::WakeUpOneThread() { | 335 void SchedulerThreadPool::WakeUpOneThread() { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 351 AutoSchedulerLock auto_lock(idle_worker_threads_stack_lock_); | 352 AutoSchedulerLock auto_lock(idle_worker_threads_stack_lock_); |
| 352 | 353 |
| 353 if (idle_worker_threads_stack_.Empty()) | 354 if (idle_worker_threads_stack_.Empty()) |
| 354 return nullptr; | 355 return nullptr; |
| 355 | 356 |
| 356 return idle_worker_threads_stack_.Pop(); | 357 return idle_worker_threads_stack_.Pop(); |
| 357 } | 358 } |
| 358 | 359 |
| 359 } // namespace internal | 360 } // namespace internal |
| 360 } // namespace base | 361 } // namespace base |
| OLD | NEW |