Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(457)

Side by Side Diff: base/task_scheduler/scheduler_single_thread_task_runner_manager.cc

Issue 2809163003: Always use TaskScheduler::InitParams to initialize a TaskScheduler. (Closed)
Patch Set: self-review Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698