| 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 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 const TaskTraits traits_; | 323 const TaskTraits traits_; |
| 324 SchedulerWorker* const worker_; | 324 SchedulerWorker* const worker_; |
| 325 const SingleThreadTaskRunnerThreadMode thread_mode_; | 325 const SingleThreadTaskRunnerThreadMode thread_mode_; |
| 326 | 326 |
| 327 DISALLOW_COPY_AND_ASSIGN(SchedulerSingleThreadTaskRunner); | 327 DISALLOW_COPY_AND_ASSIGN(SchedulerSingleThreadTaskRunner); |
| 328 }; | 328 }; |
| 329 | 329 |
| 330 SchedulerSingleThreadTaskRunnerManager::SchedulerSingleThreadTaskRunnerManager( | 330 SchedulerSingleThreadTaskRunnerManager::SchedulerSingleThreadTaskRunnerManager( |
| 331 TaskTracker* task_tracker, | 331 TaskTracker* task_tracker, |
| 332 DelayedTaskManager* delayed_task_manager) | 332 DelayedTaskManager* delayed_task_manager) |
| 333 : task_tracker_(task_tracker), | 333 : task_tracker_(task_tracker), delayed_task_manager_(delayed_task_manager) { |
| 334 delayed_task_manager_(delayed_task_manager), | |
| 335 shared_scheduler_workers_ {} | |
| 336 #if defined(OS_WIN) | |
| 337 , | |
| 338 shared_com_scheduler_workers_ {} | |
| 339 #endif // defined(OS_WIN) | |
| 340 { | |
| 341 DCHECK(task_tracker_); | 334 DCHECK(task_tracker_); |
| 342 DCHECK(delayed_task_manager_); | 335 DCHECK(delayed_task_manager_); |
| 343 static_assert( | |
| 344 arraysize(shared_scheduler_workers_) == ENVIRONMENT_COUNT, | |
| 345 "The size of |shared_scheduler_workers_| must match ENVIRONMENT_COUNT"); | |
| 346 #if defined(OS_WIN) | 336 #if defined(OS_WIN) |
| 347 static_assert(arraysize(shared_com_scheduler_workers_) == | 337 static_assert(arraysize(shared_com_scheduler_workers_) == |
| 348 arraysize(shared_scheduler_workers_), | 338 arraysize(shared_scheduler_workers_), |
| 349 "The size of |shared_com_scheduler_workers_| must match " | 339 "The size of |shared_com_scheduler_workers_| must match " |
| 350 "|shared_scheduler_workers_|"); | 340 "|shared_scheduler_workers_|"); |
| 351 #endif // defined(OS_WIN) | 341 #endif // defined(OS_WIN) |
| 352 } | 342 } |
| 353 | 343 |
| 354 SchedulerSingleThreadTaskRunnerManager:: | 344 SchedulerSingleThreadTaskRunnerManager:: |
| 355 ~SchedulerSingleThreadTaskRunnerManager() { | 345 ~SchedulerSingleThreadTaskRunnerManager() { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 template <typename DelegateType> | 410 template <typename DelegateType> |
| 421 scoped_refptr< | 411 scoped_refptr< |
| 422 SchedulerSingleThreadTaskRunnerManager::SchedulerSingleThreadTaskRunner> | 412 SchedulerSingleThreadTaskRunnerManager::SchedulerSingleThreadTaskRunner> |
| 423 SchedulerSingleThreadTaskRunnerManager::CreateTaskRunnerWithTraitsImpl( | 413 SchedulerSingleThreadTaskRunnerManager::CreateTaskRunnerWithTraitsImpl( |
| 424 const std::string& name, | 414 const std::string& name, |
| 425 const TaskTraits& traits, | 415 const TaskTraits& traits, |
| 426 SingleThreadTaskRunnerThreadMode thread_mode) { | 416 SingleThreadTaskRunnerThreadMode thread_mode) { |
| 427 DCHECK(thread_mode != SingleThreadTaskRunnerThreadMode::SHARED || | 417 DCHECK(thread_mode != SingleThreadTaskRunnerThreadMode::SHARED || |
| 428 !traits.with_base_sync_primitives()) | 418 !traits.with_base_sync_primitives()) |
| 429 << "Using WithBaseSyncPrimitives() on a shared SingleThreadTaskRunner " | 419 << "Using WithBaseSyncPrimitives() on a shared SingleThreadTaskRunner " |
| 430 "may cause deadlocks. Either reevaluate your usage pattern or use " | 420 "may cause deadlocks. Either reevaluate your usage (e.g. use " |
| 421 "SequencedTaskRunner) or use " |
| 431 "SingleThreadTaskRunnerThreadMode::DEDICATED."; | 422 "SingleThreadTaskRunnerThreadMode::DEDICATED."; |
| 432 // To simplify the code, |dedicated_worker| is a local only variable that | 423 // To simplify the code, |dedicated_worker| is a local only variable that |
| 433 // allows the code to treat both the DEDICATED and SHARED cases similarly for | 424 // allows the code to treat both the DEDICATED and SHARED cases similarly for |
| 434 // SingleThreadTaskRunnerThreadMode. In DEDICATED, the scoped_refptr is backed | 425 // SingleThreadTaskRunnerThreadMode. In DEDICATED, the scoped_refptr is backed |
| 435 // by a local variable and in SHARED, the scoped_refptr is backed by a member | 426 // by a local variable and in SHARED, the scoped_refptr is backed by a member |
| 436 // variable. | 427 // variable. |
| 437 SchedulerWorker* dedicated_worker = nullptr; | 428 SchedulerWorker* dedicated_worker = nullptr; |
| 438 SchedulerWorker*& worker = | 429 SchedulerWorker*& worker = |
| 439 thread_mode == SingleThreadTaskRunnerThreadMode::DEDICATED | 430 thread_mode == SingleThreadTaskRunnerThreadMode::DEDICATED |
| 440 ? dedicated_worker | 431 ? dedicated_worker |
| (...skipping 12 matching lines...) Expand all Loading... |
| 453 worker = CreateAndRegisterSchedulerWorker<DelegateType>( | 444 worker = CreateAndRegisterSchedulerWorker<DelegateType>( |
| 454 processed_name, environment_params.priority_hint); | 445 processed_name, environment_params.priority_hint); |
| 455 new_worker = true; | 446 new_worker = true; |
| 456 } | 447 } |
| 457 started = started_; | 448 started = started_; |
| 458 } | 449 } |
| 459 | 450 |
| 460 if (new_worker && started) | 451 if (new_worker && started) |
| 461 worker->Start(); | 452 worker->Start(); |
| 462 | 453 |
| 463 return new SchedulerSingleThreadTaskRunner(this, traits, worker, thread_mode); | 454 return MakeRefCounted<SchedulerSingleThreadTaskRunner>(this, traits, worker, |
| 455 thread_mode); |
| 464 } | 456 } |
| 465 | 457 |
| 466 void SchedulerSingleThreadTaskRunnerManager::JoinForTesting() { | 458 void SchedulerSingleThreadTaskRunnerManager::JoinForTesting() { |
| 467 ReleaseSharedSchedulerWorkers(); | 459 ReleaseSharedSchedulerWorkers(); |
| 468 | 460 |
| 469 decltype(workers_) local_workers; | 461 decltype(workers_) local_workers; |
| 470 { | 462 { |
| 471 AutoSchedulerLock auto_lock(lock_); | 463 AutoSchedulerLock auto_lock(lock_); |
| 472 local_workers = std::move(workers_); | 464 local_workers = std::move(workers_); |
| 473 } | 465 } |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 | 554 |
| 563 void SchedulerSingleThreadTaskRunnerManager::ReleaseSharedSchedulerWorkers() { | 555 void SchedulerSingleThreadTaskRunnerManager::ReleaseSharedSchedulerWorkers() { |
| 564 decltype(shared_scheduler_workers_) local_shared_scheduler_workers; | 556 decltype(shared_scheduler_workers_) local_shared_scheduler_workers; |
| 565 #if defined(OS_WIN) | 557 #if defined(OS_WIN) |
| 566 decltype(shared_com_scheduler_workers_) local_shared_com_scheduler_workers; | 558 decltype(shared_com_scheduler_workers_) local_shared_com_scheduler_workers; |
| 567 #endif | 559 #endif |
| 568 { | 560 { |
| 569 AutoSchedulerLock auto_lock(lock_); | 561 AutoSchedulerLock auto_lock(lock_); |
| 570 for (size_t i = 0; i < arraysize(shared_scheduler_workers_); ++i) { | 562 for (size_t i = 0; i < arraysize(shared_scheduler_workers_); ++i) { |
| 571 local_shared_scheduler_workers[i] = shared_scheduler_workers_[i]; | 563 local_shared_scheduler_workers[i] = shared_scheduler_workers_[i]; |
| 564 shared_scheduler_workers_[i] = nullptr; |
| 572 #if defined(OS_WIN) | 565 #if defined(OS_WIN) |
| 573 local_shared_com_scheduler_workers[i] = shared_com_scheduler_workers_[i]; | 566 local_shared_com_scheduler_workers[i] = shared_com_scheduler_workers_[i]; |
| 567 shared_com_scheduler_workers_[i] = nullptr; |
| 574 #endif | 568 #endif |
| 575 } | 569 } |
| 576 } | 570 } |
| 577 | 571 |
| 578 for (size_t i = 0; i < arraysize(local_shared_scheduler_workers); ++i) { | 572 for (size_t i = 0; i < arraysize(local_shared_scheduler_workers); ++i) { |
| 579 if (local_shared_scheduler_workers[i]) | 573 if (local_shared_scheduler_workers[i]) |
| 580 UnregisterSchedulerWorker(local_shared_scheduler_workers[i]); | 574 UnregisterSchedulerWorker(local_shared_scheduler_workers[i]); |
| 581 #if defined(OS_WIN) | 575 #if defined(OS_WIN) |
| 582 if (local_shared_com_scheduler_workers[i]) | 576 if (local_shared_com_scheduler_workers[i]) |
| 583 UnregisterSchedulerWorker(local_shared_com_scheduler_workers[i]); | 577 UnregisterSchedulerWorker(local_shared_com_scheduler_workers[i]); |
| 584 #endif | 578 #endif |
| 585 } | 579 } |
| 586 } | 580 } |
| 587 | 581 |
| 588 } // namespace internal | 582 } // namespace internal |
| 589 } // namespace base | 583 } // namespace base |
| OLD | NEW |