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 |