| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 #ifndef BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_IMPL_H_ | 5 #ifndef BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_IMPL_H_ |
| 6 #define BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_IMPL_H_ | 6 #define BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_IMPL_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 | 9 |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 const SchedulerWorkerPoolParams& params, | 60 const SchedulerWorkerPoolParams& params, |
| 61 const ReEnqueueSequenceCallback& re_enqueue_sequence_callback, | 61 const ReEnqueueSequenceCallback& re_enqueue_sequence_callback, |
| 62 TaskTracker* task_tracker, | 62 TaskTracker* task_tracker, |
| 63 DelayedTaskManager* delayed_task_manager); | 63 DelayedTaskManager* delayed_task_manager); |
| 64 | 64 |
| 65 // SchedulerWorkerPool: | 65 // SchedulerWorkerPool: |
| 66 scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits( | 66 scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits( |
| 67 const TaskTraits& traits) override; | 67 const TaskTraits& traits) override; |
| 68 scoped_refptr<SequencedTaskRunner> CreateSequencedTaskRunnerWithTraits( | 68 scoped_refptr<SequencedTaskRunner> CreateSequencedTaskRunnerWithTraits( |
| 69 const TaskTraits& traits) override; | 69 const TaskTraits& traits) override; |
| 70 scoped_refptr<SingleThreadTaskRunner> CreateSingleThreadTaskRunnerWithTraits( | |
| 71 const TaskTraits& traits) override; | |
| 72 void ReEnqueueSequence(scoped_refptr<Sequence> sequence, | 70 void ReEnqueueSequence(scoped_refptr<Sequence> sequence, |
| 73 const SequenceSortKey& sequence_sort_key) override; | 71 const SequenceSortKey& sequence_sort_key) override; |
| 74 bool PostTaskWithSequence(std::unique_ptr<Task> task, | 72 bool PostTaskWithSequence(std::unique_ptr<Task> task, |
| 75 scoped_refptr<Sequence> sequence, | 73 scoped_refptr<Sequence> sequence) override; |
| 76 SchedulerWorker* worker) override; | |
| 77 void PostTaskWithSequenceNow(std::unique_ptr<Task> task, | 74 void PostTaskWithSequenceNow(std::unique_ptr<Task> task, |
| 78 scoped_refptr<Sequence> sequence, | 75 scoped_refptr<Sequence> sequence) override; |
| 79 SchedulerWorker* worker) override; | |
| 80 | 76 |
| 81 const HistogramBase* num_tasks_before_detach_histogram() const { | 77 const HistogramBase* num_tasks_before_detach_histogram() const { |
| 82 return num_tasks_before_detach_histogram_; | 78 return num_tasks_before_detach_histogram_; |
| 83 } | 79 } |
| 84 | 80 |
| 85 const HistogramBase* num_tasks_between_waits_histogram() const { | 81 const HistogramBase* num_tasks_between_waits_histogram() const { |
| 86 return num_tasks_between_waits_histogram_; | 82 return num_tasks_between_waits_histogram_; |
| 87 } | 83 } |
| 88 | 84 |
| 89 void GetHistograms(std::vector<const HistogramBase*>* histograms) const; | 85 void GetHistograms(std::vector<const HistogramBase*>* histograms) const; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 104 // TimeDelta::Max(), the test must call this before JoinForTesting() to reduce | 100 // TimeDelta::Max(), the test must call this before JoinForTesting() to reduce |
| 105 // the chance of thread detachment during the process of joining all of the | 101 // the chance of thread detachment during the process of joining all of the |
| 106 // threads, and as a result, threads running after JoinForTesting(). | 102 // threads, and as a result, threads running after JoinForTesting(). |
| 107 void DisallowWorkerDetachmentForTesting(); | 103 void DisallowWorkerDetachmentForTesting(); |
| 108 | 104 |
| 109 // Returns the number of workers alive in this worker pool. The value may | 105 // Returns the number of workers alive in this worker pool. The value may |
| 110 // change if workers are woken up or detached during this call. | 106 // change if workers are woken up or detached during this call. |
| 111 size_t NumberOfAliveWorkersForTesting(); | 107 size_t NumberOfAliveWorkersForTesting(); |
| 112 | 108 |
| 113 private: | 109 private: |
| 114 class SchedulerSingleThreadTaskRunner; | |
| 115 class SchedulerWorkerDelegateImpl; | 110 class SchedulerWorkerDelegateImpl; |
| 116 | 111 |
| 117 SchedulerWorkerPoolImpl(const SchedulerWorkerPoolParams& params, | 112 SchedulerWorkerPoolImpl(const SchedulerWorkerPoolParams& params, |
| 118 TaskTracker* task_tracker, | 113 TaskTracker* task_tracker, |
| 119 DelayedTaskManager* delayed_task_manager); | 114 DelayedTaskManager* delayed_task_manager); |
| 120 | 115 |
| 121 bool Initialize( | 116 bool Initialize( |
| 122 const SchedulerWorkerPoolParams& params, | 117 const SchedulerWorkerPoolParams& params, |
| 123 const ReEnqueueSequenceCallback& re_enqueue_sequence_callback); | 118 const ReEnqueueSequenceCallback& re_enqueue_sequence_callback); |
| 124 | 119 |
| 125 // Wakes up |worker|. | |
| 126 void WakeUpWorker(SchedulerWorker* worker); | |
| 127 | |
| 128 // Wakes up the last worker from this worker pool to go idle, if any. | 120 // Wakes up the last worker from this worker pool to go idle, if any. |
| 129 void WakeUpOneWorker(); | 121 void WakeUpOneWorker(); |
| 130 | 122 |
| 131 // Adds |worker| to |idle_workers_stack_|. | 123 // Adds |worker| to |idle_workers_stack_|. |
| 132 void AddToIdleWorkersStack(SchedulerWorker* worker); | 124 void AddToIdleWorkersStack(SchedulerWorker* worker); |
| 133 | 125 |
| 134 // Peeks from |idle_workers_stack_|. | 126 // Peeks from |idle_workers_stack_|. |
| 135 const SchedulerWorker* PeekAtIdleWorkersStack() const; | 127 const SchedulerWorker* PeekAtIdleWorkersStack() const; |
| 136 | 128 |
| 137 // Removes |worker| from |idle_workers_stack_|. | 129 // Removes |worker| from |idle_workers_stack_|. |
| 138 void RemoveFromIdleWorkersStack(SchedulerWorker* worker); | 130 void RemoveFromIdleWorkersStack(SchedulerWorker* worker); |
| 139 | 131 |
| 140 // Returns true if worker thread detachment is permitted. | 132 // Returns true if worker thread detachment is permitted. |
| 141 bool CanWorkerDetachForTesting(); | 133 bool CanWorkerDetachForTesting(); |
| 142 | 134 |
| 143 // The name of this worker pool, used to label its worker threads. | 135 // The name of this worker pool, used to label its worker threads. |
| 144 const std::string name_; | 136 const std::string name_; |
| 145 | 137 |
| 146 // All worker owned by this worker pool. Only modified during initialization | 138 // All worker owned by this worker pool. Only modified during initialization |
| 147 // of the worker pool. | 139 // of the worker pool. |
| 148 std::vector<scoped_refptr<SchedulerWorker>> workers_; | 140 std::vector<scoped_refptr<SchedulerWorker>> workers_; |
| 149 | 141 |
| 150 // Synchronizes access to |next_worker_index_|. | |
| 151 SchedulerLock next_worker_index_lock_; | |
| 152 | |
| 153 // Index of the worker that will be assigned to the next single-threaded | |
| 154 // TaskRunner returned by this pool. | |
| 155 size_t next_worker_index_ = 0; | |
| 156 | |
| 157 // PriorityQueue from which all threads of this worker pool get work. | 142 // PriorityQueue from which all threads of this worker pool get work. |
| 158 PriorityQueue shared_priority_queue_; | 143 PriorityQueue shared_priority_queue_; |
| 159 | 144 |
| 160 // Suggested reclaim time for workers. | 145 // Suggested reclaim time for workers. |
| 161 const TimeDelta suggested_reclaim_time_; | 146 const TimeDelta suggested_reclaim_time_; |
| 162 | 147 |
| 163 // Synchronizes access to |idle_workers_stack_| and | 148 // Synchronizes access to |idle_workers_stack_| and |
| 164 // |idle_workers_stack_cv_for_testing_|. Has |shared_priority_queue_|'s | 149 // |idle_workers_stack_cv_for_testing_|. Has |shared_priority_queue_|'s |
| 165 // lock as its predecessor so that a worker can be pushed to | 150 // lock as its predecessor so that a worker can be pushed to |
| 166 // |idle_workers_stack_| within the scope of a Transaction (more | 151 // |idle_workers_stack_| within the scope of a Transaction (more |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 204 TaskTracker* const task_tracker_; | 189 TaskTracker* const task_tracker_; |
| 205 DelayedTaskManager* const delayed_task_manager_; | 190 DelayedTaskManager* const delayed_task_manager_; |
| 206 | 191 |
| 207 DISALLOW_COPY_AND_ASSIGN(SchedulerWorkerPoolImpl); | 192 DISALLOW_COPY_AND_ASSIGN(SchedulerWorkerPoolImpl); |
| 208 }; | 193 }; |
| 209 | 194 |
| 210 } // namespace internal | 195 } // namespace internal |
| 211 } // namespace base | 196 } // namespace base |
| 212 | 197 |
| 213 #endif // BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_IMPL_H_ | 198 #endif // BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_IMPL_H_ |
| OLD | NEW |