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_impl.h" | 5 #include "base/task_scheduler/scheduler_thread_pool_impl.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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 | 127 |
128 DISALLOW_COPY_AND_ASSIGN(SchedulerWorkerThreadDelegateImpl); | 128 DISALLOW_COPY_AND_ASSIGN(SchedulerWorkerThreadDelegateImpl); |
129 }; | 129 }; |
130 | 130 |
131 SchedulerThreadPoolImpl::~SchedulerThreadPoolImpl() { | 131 SchedulerThreadPoolImpl::~SchedulerThreadPoolImpl() { |
132 // SchedulerThreadPool should never be deleted in production unless its | 132 // SchedulerThreadPool should never be deleted in production unless its |
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<SchedulerThreadPoolImpl> | 137 std::unique_ptr<SchedulerThreadPoolImpl> SchedulerThreadPoolImpl::Create( |
138 SchedulerThreadPoolImpl::CreateThreadPool( | |
139 ThreadPriority thread_priority, | 138 ThreadPriority thread_priority, |
140 size_t max_threads, | 139 size_t max_threads, |
141 const ReEnqueueSequenceCallback& re_enqueue_sequence_callback, | 140 const ReEnqueueSequenceCallback& re_enqueue_sequence_callback, |
142 TaskTracker* task_tracker, | 141 TaskTracker* task_tracker, |
143 DelayedTaskManager* delayed_task_manager) { | 142 DelayedTaskManager* delayed_task_manager) { |
144 std::unique_ptr<SchedulerThreadPoolImpl> thread_pool( | 143 std::unique_ptr<SchedulerThreadPoolImpl> thread_pool( |
145 new SchedulerThreadPoolImpl(re_enqueue_sequence_callback, task_tracker, | 144 new SchedulerThreadPoolImpl(task_tracker, delayed_task_manager)); |
146 delayed_task_manager)); | 145 if (thread_pool->Initialize(thread_priority, max_threads, |
147 if (thread_pool->Initialize(thread_priority, max_threads)) | 146 re_enqueue_sequence_callback)) { |
148 return thread_pool; | 147 return thread_pool; |
| 148 } |
149 return nullptr; | 149 return nullptr; |
150 } | 150 } |
151 | 151 |
152 void SchedulerThreadPoolImpl::WaitForAllWorkerThreadsIdleForTesting() { | 152 void SchedulerThreadPoolImpl::WaitForAllWorkerThreadsIdleForTesting() { |
153 AutoSchedulerLock auto_lock(idle_worker_threads_stack_lock_); | 153 AutoSchedulerLock auto_lock(idle_worker_threads_stack_lock_); |
154 while (idle_worker_threads_stack_.Size() < worker_threads_.size()) | 154 while (idle_worker_threads_stack_.Size() < worker_threads_.size()) |
155 idle_worker_threads_stack_cv_for_testing_->Wait(); | 155 idle_worker_threads_stack_cv_for_testing_->Wait(); |
156 } | 156 } |
157 | 157 |
158 void SchedulerThreadPoolImpl::JoinForTesting() { | 158 void SchedulerThreadPoolImpl::JoinForTesting() { |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 transaction->Pop(); | 292 transaction->Pop(); |
293 return sequence; | 293 return sequence; |
294 } | 294 } |
295 | 295 |
296 void SchedulerThreadPoolImpl::SchedulerWorkerThreadDelegateImpl:: | 296 void SchedulerThreadPoolImpl::SchedulerWorkerThreadDelegateImpl:: |
297 ReEnqueueSequence(scoped_refptr<Sequence> sequence) { | 297 ReEnqueueSequence(scoped_refptr<Sequence> sequence) { |
298 re_enqueue_sequence_callback_.Run(std::move(sequence)); | 298 re_enqueue_sequence_callback_.Run(std::move(sequence)); |
299 } | 299 } |
300 | 300 |
301 SchedulerThreadPoolImpl::SchedulerThreadPoolImpl( | 301 SchedulerThreadPoolImpl::SchedulerThreadPoolImpl( |
302 const ReEnqueueSequenceCallback& re_enqueue_sequence_callback, | |
303 TaskTracker* task_tracker, | 302 TaskTracker* task_tracker, |
304 DelayedTaskManager* delayed_task_manager) | 303 DelayedTaskManager* delayed_task_manager) |
305 : idle_worker_threads_stack_lock_(shared_priority_queue_.container_lock()), | 304 : idle_worker_threads_stack_lock_(shared_priority_queue_.container_lock()), |
306 idle_worker_threads_stack_cv_for_testing_( | 305 idle_worker_threads_stack_cv_for_testing_( |
307 idle_worker_threads_stack_lock_.CreateConditionVariable()), | 306 idle_worker_threads_stack_lock_.CreateConditionVariable()), |
308 join_for_testing_returned_(true, false), | 307 join_for_testing_returned_(true, false), |
309 worker_thread_delegate_( | |
310 new SchedulerWorkerThreadDelegateImpl(this, | |
311 re_enqueue_sequence_callback)), | |
312 task_tracker_(task_tracker), | 308 task_tracker_(task_tracker), |
313 delayed_task_manager_(delayed_task_manager) { | 309 delayed_task_manager_(delayed_task_manager) { |
314 DCHECK(task_tracker_); | 310 DCHECK(task_tracker_); |
315 DCHECK(delayed_task_manager_); | 311 DCHECK(delayed_task_manager_); |
316 } | 312 } |
317 | 313 |
318 bool SchedulerThreadPoolImpl::Initialize(ThreadPriority thread_priority, | 314 bool SchedulerThreadPoolImpl::Initialize( |
319 size_t max_threads) { | 315 ThreadPriority thread_priority, |
| 316 size_t max_threads, |
| 317 const ReEnqueueSequenceCallback& re_enqueue_sequence_callback) { |
320 AutoSchedulerLock auto_lock(idle_worker_threads_stack_lock_); | 318 AutoSchedulerLock auto_lock(idle_worker_threads_stack_lock_); |
321 | 319 |
322 DCHECK(worker_threads_.empty()); | 320 DCHECK(worker_threads_.empty()); |
323 | 321 |
324 for (size_t i = 0; i < max_threads; ++i) { | 322 for (size_t i = 0; i < max_threads; ++i) { |
325 std::unique_ptr<SchedulerWorkerThread> worker_thread = | 323 std::unique_ptr<SchedulerWorkerThread> worker_thread = |
326 SchedulerWorkerThread::CreateSchedulerWorkerThread( | 324 SchedulerWorkerThread::Create( |
327 thread_priority, worker_thread_delegate_.get(), task_tracker_); | 325 thread_priority, WrapUnique(new SchedulerWorkerThreadDelegateImpl( |
| 326 this, re_enqueue_sequence_callback)), |
| 327 task_tracker_); |
328 if (!worker_thread) | 328 if (!worker_thread) |
329 break; | 329 break; |
330 idle_worker_threads_stack_.Push(worker_thread.get()); | 330 idle_worker_threads_stack_.Push(worker_thread.get()); |
331 worker_threads_.push_back(std::move(worker_thread)); | 331 worker_threads_.push_back(std::move(worker_thread)); |
332 } | 332 } |
333 | 333 |
334 return !worker_threads_.empty(); | 334 return !worker_threads_.empty(); |
335 } | 335 } |
336 | 336 |
337 void SchedulerThreadPoolImpl::WakeUpOneThread() { | 337 void SchedulerThreadPoolImpl::WakeUpOneThread() { |
(...skipping 11 matching lines...) Expand all Loading... |
349 AutoSchedulerLock auto_lock(idle_worker_threads_stack_lock_); | 349 AutoSchedulerLock auto_lock(idle_worker_threads_stack_lock_); |
350 idle_worker_threads_stack_.Push(worker_thread); | 350 idle_worker_threads_stack_.Push(worker_thread); |
351 DCHECK_LE(idle_worker_threads_stack_.Size(), worker_threads_.size()); | 351 DCHECK_LE(idle_worker_threads_stack_.Size(), worker_threads_.size()); |
352 | 352 |
353 if (idle_worker_threads_stack_.Size() == worker_threads_.size()) | 353 if (idle_worker_threads_stack_.Size() == worker_threads_.size()) |
354 idle_worker_threads_stack_cv_for_testing_->Broadcast(); | 354 idle_worker_threads_stack_cv_for_testing_->Broadcast(); |
355 } | 355 } |
356 | 356 |
357 } // namespace internal | 357 } // namespace internal |
358 } // namespace base | 358 } // namespace base |
OLD | NEW |