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

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

Issue 2749303002: [reference - do not submit] Always create four pools in TaskSchedulerImpl. (Closed)
Patch Set: rebase Created 3 years, 9 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 10
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 } 200 }
201 201
202 SchedulerSingleThreadTaskRunnerManager* const outer_; 202 SchedulerSingleThreadTaskRunnerManager* const outer_;
203 const TaskTraits traits_; 203 const TaskTraits traits_;
204 SchedulerWorker* const worker_; 204 SchedulerWorker* const worker_;
205 205
206 DISALLOW_COPY_AND_ASSIGN(SchedulerSingleThreadTaskRunner); 206 DISALLOW_COPY_AND_ASSIGN(SchedulerSingleThreadTaskRunner);
207 }; 207 };
208 208
209 SchedulerSingleThreadTaskRunnerManager::SchedulerSingleThreadTaskRunnerManager( 209 SchedulerSingleThreadTaskRunnerManager::SchedulerSingleThreadTaskRunnerManager(
210 const std::vector<SchedulerWorkerPoolParams>& worker_pool_params_vector,
211 const TaskScheduler::WorkerPoolIndexForTraitsCallback&
212 worker_pool_index_for_traits_callback,
213 TaskTracker* task_tracker, 210 TaskTracker* task_tracker,
214 DelayedTaskManager* delayed_task_manager) 211 DelayedTaskManager* delayed_task_manager)
215 : worker_pool_params_vector_(worker_pool_params_vector), 212 : task_tracker_(task_tracker), delayed_task_manager_(delayed_task_manager) {
216 worker_pool_index_for_traits_callback_(
217 worker_pool_index_for_traits_callback),
218 task_tracker_(task_tracker),
219 delayed_task_manager_(delayed_task_manager) {
220 DCHECK_GT(worker_pool_params_vector_.size(), 0U);
221 DCHECK(worker_pool_index_for_traits_callback_);
222 DCHECK(task_tracker_); 213 DCHECK(task_tracker_);
223 DCHECK(delayed_task_manager_); 214 DCHECK(delayed_task_manager_);
224 } 215 }
225 216
226 SchedulerSingleThreadTaskRunnerManager:: 217 SchedulerSingleThreadTaskRunnerManager::
227 ~SchedulerSingleThreadTaskRunnerManager() { 218 ~SchedulerSingleThreadTaskRunnerManager() {
228 #if DCHECK_IS_ON() 219 #if DCHECK_IS_ON()
229 size_t workers_unregistered_during_join = 220 size_t workers_unregistered_during_join =
230 subtle::NoBarrier_Load(&workers_unregistered_during_join_); 221 subtle::NoBarrier_Load(&workers_unregistered_during_join_);
231 DCHECK_EQ(workers_unregistered_during_join, workers_.size()) 222 DCHECK_EQ(workers_unregistered_during_join, workers_.size())
232 << "There cannot be outstanding SingleThreadTaskRunners upon destruction " 223 << "There cannot be outstanding SingleThreadTaskRunners upon destruction "
233 "of SchedulerSingleThreadTaskRunnerManager or the Task Scheduler"; 224 "of SchedulerSingleThreadTaskRunnerManager or the Task Scheduler";
234 #endif 225 #endif
235 } 226 }
236 227
237 scoped_refptr<SingleThreadTaskRunner> 228 scoped_refptr<SingleThreadTaskRunner>
238 SchedulerSingleThreadTaskRunnerManager::CreateSingleThreadTaskRunnerWithTraits( 229 SchedulerSingleThreadTaskRunnerManager::CreateSingleThreadTaskRunnerWithTraits(
230 const std::string& name,
231 ThreadPriority priority_hint,
239 const TaskTraits& traits) { 232 const TaskTraits& traits) {
240 size_t index = worker_pool_index_for_traits_callback_.Run(traits);
241 DCHECK_LT(index, worker_pool_params_vector_.size());
242 return new SchedulerSingleThreadTaskRunner( 233 return new SchedulerSingleThreadTaskRunner(
243 this, traits, 234 this, traits, CreateAndRegisterSchedulerWorker(name, priority_hint));
244 CreateAndRegisterSchedulerWorker(worker_pool_params_vector_[index]));
245 } 235 }
246 236
247 void SchedulerSingleThreadTaskRunnerManager::JoinForTesting() { 237 void SchedulerSingleThreadTaskRunnerManager::JoinForTesting() {
248 decltype(workers_) local_workers; 238 decltype(workers_) local_workers;
249 { 239 {
250 AutoSchedulerLock auto_lock(workers_lock_); 240 AutoSchedulerLock auto_lock(workers_lock_);
251 local_workers = std::move(workers_); 241 local_workers = std::move(workers_);
252 } 242 }
253 243
254 for (const auto& worker : local_workers) 244 for (const auto& worker : local_workers)
255 worker->JoinForTesting(); 245 worker->JoinForTesting();
256 246
257 { 247 {
258 AutoSchedulerLock auto_lock(workers_lock_); 248 AutoSchedulerLock auto_lock(workers_lock_);
259 DCHECK(workers_.empty()) 249 DCHECK(workers_.empty())
260 << "New worker(s) unexpectedly registered during join."; 250 << "New worker(s) unexpectedly registered during join.";
261 workers_ = std::move(local_workers); 251 workers_ = std::move(local_workers);
262 } 252 }
263 } 253 }
264 254
265 SchedulerWorker* 255 SchedulerWorker*
266 SchedulerSingleThreadTaskRunnerManager::CreateAndRegisterSchedulerWorker( 256 SchedulerSingleThreadTaskRunnerManager::CreateAndRegisterSchedulerWorker(
267 const SchedulerWorkerPoolParams& params) { 257 const std::string& name,
258 ThreadPriority priority_hint) {
268 AutoSchedulerLock auto_lock(workers_lock_); 259 AutoSchedulerLock auto_lock(workers_lock_);
269 int id = next_worker_id_++; 260 int id = next_worker_id_++;
270 auto delegate = MakeUnique<SchedulerWorkerDelegate>(base::StringPrintf( 261 auto delegate = MakeUnique<SchedulerWorkerDelegate>(
271 "TaskSchedulerSingleThreadWorker%d%s", id, params.name().c_str())); 262 StringPrintf("TaskScheduler%sSingleThread%d", name.c_str(), id));
272 workers_.emplace_back(SchedulerWorker::Create( 263 workers_.emplace_back(
273 params.priority_hint(), std::move(delegate), task_tracker_, 264 SchedulerWorker::Create(priority_hint, std::move(delegate), task_tracker_,
274 SchedulerWorker::InitialState::DETACHED)); 265 SchedulerWorker::InitialState::DETACHED));
275 return workers_.back().get(); 266 return workers_.back().get();
276 } 267 }
277 268
278 void SchedulerSingleThreadTaskRunnerManager::UnregisterSchedulerWorker( 269 void SchedulerSingleThreadTaskRunnerManager::UnregisterSchedulerWorker(
279 SchedulerWorker* worker) { 270 SchedulerWorker* worker) {
280 // Cleanup uses a SchedulerLock, so call Cleanup() after releasing 271 // Cleanup uses a SchedulerLock, so call Cleanup() after releasing
281 // |workers_lock_|. 272 // |workers_lock_|.
282 scoped_refptr<SchedulerWorker> worker_to_destroy; 273 scoped_refptr<SchedulerWorker> worker_to_destroy;
283 { 274 {
284 AutoSchedulerLock auto_lock(workers_lock_); 275 AutoSchedulerLock auto_lock(workers_lock_);
(...skipping 14 matching lines...) Expand all
299 }); 290 });
300 DCHECK(worker_iter != workers_.end()); 291 DCHECK(worker_iter != workers_.end());
301 worker_to_destroy = std::move(*worker_iter); 292 worker_to_destroy = std::move(*worker_iter);
302 workers_.erase(worker_iter); 293 workers_.erase(worker_iter);
303 } 294 }
304 worker_to_destroy->Cleanup(); 295 worker_to_destroy->Cleanup();
305 } 296 }
306 297
307 } // namespace internal 298 } // namespace internal
308 } // namespace base 299 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698