Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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_single_thread_task_runner_manager.h" | 5 #include "base/task_scheduler/scheduler_single_thread_task_runner_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 306 } | 306 } |
| 307 | 307 |
| 308 SchedulerSingleThreadTaskRunnerManager* const outer_; | 308 SchedulerSingleThreadTaskRunnerManager* const outer_; |
| 309 const TaskTraits traits_; | 309 const TaskTraits traits_; |
| 310 SchedulerWorker* const worker_; | 310 SchedulerWorker* const worker_; |
| 311 | 311 |
| 312 DISALLOW_COPY_AND_ASSIGN(SchedulerSingleThreadTaskRunner); | 312 DISALLOW_COPY_AND_ASSIGN(SchedulerSingleThreadTaskRunner); |
| 313 }; | 313 }; |
| 314 | 314 |
| 315 SchedulerSingleThreadTaskRunnerManager::SchedulerSingleThreadTaskRunnerManager( | 315 SchedulerSingleThreadTaskRunnerManager::SchedulerSingleThreadTaskRunnerManager( |
| 316 const std::vector<SchedulerWorkerPoolParams>& worker_pool_params_vector, | |
| 317 const TaskScheduler::WorkerPoolIndexForTraitsCallback& | |
| 318 worker_pool_index_for_traits_callback, | |
| 319 TaskTracker* task_tracker, | 316 TaskTracker* task_tracker, |
| 320 DelayedTaskManager* delayed_task_manager) | 317 DelayedTaskManager* delayed_task_manager) |
| 321 : worker_pool_params_vector_(worker_pool_params_vector), | 318 : task_tracker_(task_tracker), delayed_task_manager_(delayed_task_manager) { |
| 322 worker_pool_index_for_traits_callback_( | |
| 323 worker_pool_index_for_traits_callback), | |
| 324 task_tracker_(task_tracker), | |
| 325 delayed_task_manager_(delayed_task_manager) { | |
| 326 DCHECK_GT(worker_pool_params_vector_.size(), 0U); | |
| 327 DCHECK(worker_pool_index_for_traits_callback_); | |
| 328 DCHECK(task_tracker_); | 319 DCHECK(task_tracker_); |
| 329 DCHECK(delayed_task_manager_); | 320 DCHECK(delayed_task_manager_); |
| 330 } | 321 } |
| 331 | 322 |
| 332 SchedulerSingleThreadTaskRunnerManager:: | 323 SchedulerSingleThreadTaskRunnerManager:: |
| 333 ~SchedulerSingleThreadTaskRunnerManager() { | 324 ~SchedulerSingleThreadTaskRunnerManager() { |
| 334 #if DCHECK_IS_ON() | 325 #if DCHECK_IS_ON() |
| 335 size_t workers_unregistered_during_join = | 326 size_t workers_unregistered_during_join = |
| 336 subtle::NoBarrier_Load(&workers_unregistered_during_join_); | 327 subtle::NoBarrier_Load(&workers_unregistered_during_join_); |
| 337 DCHECK_EQ(workers_unregistered_during_join, workers_.size()) | 328 DCHECK_EQ(workers_unregistered_during_join, workers_.size()) |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 351 // Start workers that were created before this method was called. Other | 342 // Start workers that were created before this method was called. Other |
| 352 // workers are started as they are created. | 343 // workers are started as they are created. |
| 353 for (scoped_refptr<SchedulerWorker> worker : workers_to_start) { | 344 for (scoped_refptr<SchedulerWorker> worker : workers_to_start) { |
| 354 worker->Start(); | 345 worker->Start(); |
| 355 worker->WakeUp(); | 346 worker->WakeUp(); |
| 356 } | 347 } |
| 357 } | 348 } |
| 358 | 349 |
| 359 scoped_refptr<SingleThreadTaskRunner> | 350 scoped_refptr<SingleThreadTaskRunner> |
| 360 SchedulerSingleThreadTaskRunnerManager::CreateSingleThreadTaskRunnerWithTraits( | 351 SchedulerSingleThreadTaskRunnerManager::CreateSingleThreadTaskRunnerWithTraits( |
| 352 const std::string& name, | |
| 353 ThreadPriority priority_hint, | |
| 361 const TaskTraits& traits) { | 354 const TaskTraits& traits) { |
| 362 return CreateSingleThreadTaskRunnerWithDelegate<SchedulerWorkerDelegate>( | 355 return CreateSingleThreadTaskRunnerWithDelegate<SchedulerWorkerDelegate>( |
| 363 traits); | 356 name, priority_hint, traits); |
| 364 } | 357 } |
| 365 | 358 |
| 366 #if defined(OS_WIN) | 359 #if defined(OS_WIN) |
| 367 scoped_refptr<SingleThreadTaskRunner> | 360 scoped_refptr<SingleThreadTaskRunner> |
| 368 SchedulerSingleThreadTaskRunnerManager::CreateCOMSTATaskRunnerWithTraits( | 361 SchedulerSingleThreadTaskRunnerManager::CreateCOMSTATaskRunnerWithTraits( |
| 362 const std::string& name, | |
| 363 ThreadPriority priority_hint, | |
| 369 const TaskTraits& traits) { | 364 const TaskTraits& traits) { |
| 370 return CreateSingleThreadTaskRunnerWithDelegate<SchedulerWorkerCOMDelegate>( | 365 return CreateSingleThreadTaskRunnerWithDelegate<SchedulerWorkerCOMDelegate>( |
| 371 traits); | 366 name, priority_hint, traits); |
| 372 } | 367 } |
| 373 #endif // defined(OS_WIN) | 368 #endif // defined(OS_WIN) |
| 374 | 369 |
| 375 void SchedulerSingleThreadTaskRunnerManager::JoinForTesting() { | 370 void SchedulerSingleThreadTaskRunnerManager::JoinForTesting() { |
| 376 decltype(workers_) local_workers; | 371 decltype(workers_) local_workers; |
| 377 { | 372 { |
| 378 AutoSchedulerLock auto_lock(lock_); | 373 AutoSchedulerLock auto_lock(lock_); |
| 379 local_workers = std::move(workers_); | 374 local_workers = std::move(workers_); |
| 380 } | 375 } |
| 381 | 376 |
| 382 for (const auto& worker : local_workers) | 377 for (const auto& worker : local_workers) |
| 383 worker->JoinForTesting(); | 378 worker->JoinForTesting(); |
| 384 | 379 |
| 385 { | 380 { |
| 386 AutoSchedulerLock auto_lock(lock_); | 381 AutoSchedulerLock auto_lock(lock_); |
| 387 DCHECK(workers_.empty()) | 382 DCHECK(workers_.empty()) |
| 388 << "New worker(s) unexpectedly registered during join."; | 383 << "New worker(s) unexpectedly registered during join."; |
| 389 workers_ = std::move(local_workers); | 384 workers_ = std::move(local_workers); |
| 390 } | 385 } |
| 391 } | 386 } |
| 392 | 387 |
| 393 template <typename DelegateType> | 388 template <typename DelegateType> |
| 394 scoped_refptr<SingleThreadTaskRunner> SchedulerSingleThreadTaskRunnerManager:: | 389 scoped_refptr<SingleThreadTaskRunner> SchedulerSingleThreadTaskRunnerManager:: |
| 395 CreateSingleThreadTaskRunnerWithDelegate(const TaskTraits& traits) { | 390 CreateSingleThreadTaskRunnerWithDelegate(const std::string& name, |
| 396 size_t index = worker_pool_index_for_traits_callback_.Run(traits); | 391 ThreadPriority priority_hint, |
| 397 DCHECK_LT(index, worker_pool_params_vector_.size()); | 392 const TaskTraits& traits) { |
| 398 return new SchedulerSingleThreadTaskRunner( | 393 return new SchedulerSingleThreadTaskRunner( |
| 399 this, traits, | 394 this, traits, |
| 400 CreateAndRegisterSchedulerWorker<DelegateType>( | 395 CreateAndRegisterSchedulerWorker<DelegateType>(name, priority_hint)); |
| 401 worker_pool_params_vector_[index])); | |
| 402 } | 396 } |
| 403 | 397 |
| 404 template <> | 398 template <> |
| 405 std::unique_ptr<SchedulerWorkerDelegate> | 399 std::unique_ptr<SchedulerWorkerDelegate> |
| 406 SchedulerSingleThreadTaskRunnerManager::CreateSchedulerWorkerDelegate< | 400 SchedulerSingleThreadTaskRunnerManager::CreateSchedulerWorkerDelegate< |
| 407 SchedulerWorkerDelegate>(const SchedulerWorkerPoolParams& params, int id) { | 401 SchedulerWorkerDelegate>(const std::string& name, int id) { |
| 408 return MakeUnique<SchedulerWorkerDelegate>(StringPrintf( | 402 return MakeUnique<SchedulerWorkerDelegate>( |
| 409 "TaskSchedulerSingleThreadWorker%d%s", id, params.name().c_str())); | 403 StringPrintf("TaskScheduler%sSingleThread%d", name.c_str(), id)); |
|
robliao
2017/04/12 19:08:13
This naming makes it harder to sort against all of
fdoray
2017/04/12 20:00:23
Done.
robliao
2017/04/12 20:37:50
This leads me to my second question. It does seem
fdoray
2017/04/12 20:57:48
In this CL, TaskSchedulerImpl derives the thread p
robliao
2017/04/12 21:09:05
Right. This also means that later on someone could
fdoray
2017/04/19 12:21:21
Acknowledged.
| |
| 410 } | 404 } |
| 411 | 405 |
| 412 #if defined(OS_WIN) | 406 #if defined(OS_WIN) |
| 413 template <> | 407 template <> |
| 414 std::unique_ptr<SchedulerWorkerDelegate> | 408 std::unique_ptr<SchedulerWorkerDelegate> |
| 415 SchedulerSingleThreadTaskRunnerManager::CreateSchedulerWorkerDelegate< | 409 SchedulerSingleThreadTaskRunnerManager::CreateSchedulerWorkerDelegate< |
| 416 SchedulerWorkerCOMDelegate>(const SchedulerWorkerPoolParams& params, | 410 SchedulerWorkerCOMDelegate>(const std::string& name, int id) { |
| 417 int id) { | |
| 418 return MakeUnique<SchedulerWorkerCOMDelegate>( | 411 return MakeUnique<SchedulerWorkerCOMDelegate>( |
| 419 StringPrintf("TaskSchedulerSingleThreadWorker%d%sCOMSTA", id, | 412 StringPrintf("TaskScheduler%sSingleThreadCOMSTA%d", name.c_str(), id), |
| 420 params.name().c_str()), | |
| 421 task_tracker_); | 413 task_tracker_); |
| 422 } | 414 } |
| 423 #endif // defined(OS_WIN) | 415 #endif // defined(OS_WIN) |
| 424 | 416 |
| 425 template <typename DelegateType> | 417 template <typename DelegateType> |
| 426 SchedulerWorker* | 418 SchedulerWorker* |
| 427 SchedulerSingleThreadTaskRunnerManager::CreateAndRegisterSchedulerWorker( | 419 SchedulerSingleThreadTaskRunnerManager::CreateAndRegisterSchedulerWorker( |
| 428 const SchedulerWorkerPoolParams& params) { | 420 const std::string& name, |
| 421 ThreadPriority priority_hint) { | |
| 429 SchedulerWorker* worker; | 422 SchedulerWorker* worker; |
| 430 bool start_worker; | 423 bool start_worker; |
| 431 | 424 |
| 432 { | 425 { |
| 433 AutoSchedulerLock auto_lock(lock_); | 426 AutoSchedulerLock auto_lock(lock_); |
| 434 int id = next_worker_id_++; | 427 int id = next_worker_id_++; |
| 435 workers_.emplace_back(make_scoped_refptr(new SchedulerWorker( | 428 workers_.emplace_back(make_scoped_refptr(new SchedulerWorker( |
| 436 params.priority_hint(), | 429 priority_hint, CreateSchedulerWorkerDelegate<DelegateType>(name, id), |
| 437 CreateSchedulerWorkerDelegate<DelegateType>(params, id), | |
| 438 task_tracker_))); | 430 task_tracker_))); |
| 439 worker = workers_.back().get(); | 431 worker = workers_.back().get(); |
| 440 start_worker = started_; | 432 start_worker = started_; |
| 441 } | 433 } |
| 442 | 434 |
| 443 if (start_worker) | 435 if (start_worker) |
| 444 worker->Start(); | 436 worker->Start(); |
| 445 | 437 |
| 446 return worker; | 438 return worker; |
| 447 } | 439 } |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 470 }); | 462 }); |
| 471 DCHECK(worker_iter != workers_.end()); | 463 DCHECK(worker_iter != workers_.end()); |
| 472 worker_to_destroy = std::move(*worker_iter); | 464 worker_to_destroy = std::move(*worker_iter); |
| 473 workers_.erase(worker_iter); | 465 workers_.erase(worker_iter); |
| 474 } | 466 } |
| 475 worker_to_destroy->Cleanup(); | 467 worker_to_destroy->Cleanup(); |
| 476 } | 468 } |
| 477 | 469 |
| 478 } // namespace internal | 470 } // namespace internal |
| 479 } // namespace base | 471 } // namespace base |
| OLD | NEW |