| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/threading/sequenced_worker_pool.h" | 5 #include "base/threading/sequenced_worker_pool.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <list> | 9 #include <list> |
| 10 #include <map> | 10 #include <map> |
| (...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 645 blocking_shutdown_thread_count_(0), | 645 blocking_shutdown_thread_count_(0), |
| 646 next_sequence_task_number_(0), | 646 next_sequence_task_number_(0), |
| 647 blocking_shutdown_pending_task_count_(0), | 647 blocking_shutdown_pending_task_count_(0), |
| 648 trace_id_(0), | 648 trace_id_(0), |
| 649 shutdown_called_(false), | 649 shutdown_called_(false), |
| 650 max_blocking_tasks_after_shutdown_(0), | 650 max_blocking_tasks_after_shutdown_(0), |
| 651 cleanup_state_(CLEANUP_DONE), | 651 cleanup_state_(CLEANUP_DONE), |
| 652 cleanup_idlers_(0), | 652 cleanup_idlers_(0), |
| 653 cleanup_cv_(&lock_), | 653 cleanup_cv_(&lock_), |
| 654 testing_observer_(observer), | 654 testing_observer_(observer), |
| 655 task_priority_(task_priority) {} | 655 task_priority_(task_priority) { |
| 656 DCHECK_GT(max_threads_, 1U); |
| 657 } |
| 656 | 658 |
| 657 SequencedWorkerPool::Inner::~Inner() { | 659 SequencedWorkerPool::Inner::~Inner() { |
| 658 // You must call Shutdown() before destroying the pool. | 660 // You must call Shutdown() before destroying the pool. |
| 659 DCHECK(shutdown_called_); | 661 DCHECK(shutdown_called_); |
| 660 | 662 |
| 661 // Need to explicitly join with the threads before they're destroyed or else | 663 // Need to explicitly join with the threads before they're destroyed or else |
| 662 // they will be running when our object is half torn down. | 664 // they will be running when our object is half torn down. |
| 663 for (ThreadMap::iterator it = threads_.begin(); it != threads_.end(); ++it) | 665 for (ThreadMap::iterator it = threads_.begin(); it != threads_.end(); ++it) |
| 664 it->second->Join(); | 666 it->second->Join(); |
| 665 threads_.clear(); | 667 threads_.clear(); |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 841 sequence_token_id ? sequenced_task_runner_map_[sequence_token_id] | 843 sequence_token_id ? sequenced_task_runner_map_[sequence_token_id] |
| 842 : unsequenced_task_runners_[static_cast<int>( | 844 : unsequenced_task_runners_[static_cast<int>( |
| 843 traits.shutdown_behavior())]; | 845 traits.shutdown_behavior())]; |
| 844 | 846 |
| 845 // TODO(fdoray): DCHECK that all tasks posted to the same sequence have the | 847 // TODO(fdoray): DCHECK that all tasks posted to the same sequence have the |
| 846 // same shutdown behavior. | 848 // same shutdown behavior. |
| 847 | 849 |
| 848 if (!task_runner) { | 850 if (!task_runner) { |
| 849 ExecutionMode execution_mode = | 851 ExecutionMode execution_mode = |
| 850 sequence_token_id ? ExecutionMode::SEQUENCED : ExecutionMode::PARALLEL; | 852 sequence_token_id ? ExecutionMode::SEQUENCED : ExecutionMode::PARALLEL; |
| 851 | |
| 852 if (max_threads_ == 1U) { | |
| 853 // Tasks posted to single-threaded pools can assume thread affinity. | |
| 854 execution_mode = ExecutionMode::SINGLE_THREADED; | |
| 855 | |
| 856 // Disallow posting tasks with different sequence tokens to single- | |
| 857 // threaded pools since the TaskScheduler can't force different sequences | |
| 858 // to run on the same thread. | |
| 859 DCHECK_LE(sequenced_task_runner_map_.size(), 1U); | |
| 860 | |
| 861 // Disallow posting tasks without a sequence token to a single-threaded | |
| 862 // pool. No users do that currently and we don't want to support new use | |
| 863 // cases. | |
| 864 DCHECK(sequence_token_id); | |
| 865 } | |
| 866 | |
| 867 task_runner = CreateTaskRunnerWithTraits(traits, execution_mode); | 853 task_runner = CreateTaskRunnerWithTraits(traits, execution_mode); |
| 868 } | 854 } |
| 869 | 855 |
| 870 return task_runner; | 856 return task_runner; |
| 871 } | 857 } |
| 872 | 858 |
| 873 bool SequencedWorkerPool::Inner::RunsTasksOnCurrentThread() const { | 859 bool SequencedWorkerPool::Inner::RunsTasksOnCurrentThread() const { |
| 874 AutoLock lock(lock_); | 860 AutoLock lock(lock_); |
| 875 if (subtle::NoBarrier_Load(&g_all_pools_state) == | 861 if (subtle::NoBarrier_Load(&g_all_pools_state) == |
| 876 AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) { | 862 AllPoolsState::REDIRECTED_TO_TASK_SCHEDULER) { |
| (...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1627 bool SequencedWorkerPool::IsShutdownInProgress() { | 1613 bool SequencedWorkerPool::IsShutdownInProgress() { |
| 1628 return inner_->IsShutdownInProgress(); | 1614 return inner_->IsShutdownInProgress(); |
| 1629 } | 1615 } |
| 1630 | 1616 |
| 1631 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( | 1617 bool SequencedWorkerPool::IsRunningSequenceOnCurrentThread( |
| 1632 SequenceToken sequence_token) const { | 1618 SequenceToken sequence_token) const { |
| 1633 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); | 1619 return inner_->IsRunningSequenceOnCurrentThread(sequence_token); |
| 1634 } | 1620 } |
| 1635 | 1621 |
| 1636 } // namespace base | 1622 } // namespace base |
| OLD | NEW |