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

Side by Side Diff: components/scheduler/child/scheduler_helper.cc

Issue 1101703003: Adds a SHUTDOWN_TASK_QUEUE and a PreShutdown api to the scheduler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase of DOOM Created 5 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/scheduler/child/scheduler_helper.h" 5 #include "components/scheduler/child/scheduler_helper.h"
6 6
7 #include "base/synchronization/waitable_event.h"
7 #include "base/trace_event/trace_event.h" 8 #include "base/trace_event/trace_event.h"
8 #include "base/trace_event/trace_event_argument.h" 9 #include "base/trace_event/trace_event_argument.h"
9 #include "components/scheduler/child/nestable_single_thread_task_runner.h" 10 #include "components/scheduler/child/nestable_single_thread_task_runner.h"
10 #include "components/scheduler/child/prioritizing_task_queue_selector.h" 11 #include "components/scheduler/child/prioritizing_task_queue_selector.h"
11 #include "components/scheduler/child/time_source.h" 12 #include "components/scheduler/child/time_source.h"
12 13
13 namespace scheduler { 14 namespace scheduler {
14 15
15 SchedulerHelper::SchedulerHelper( 16 SchedulerHelper::SchedulerHelper(
16 scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner, 17 scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner,
(...skipping 10 matching lines...) Expand all
27 task_queue_selector_.get(), 28 task_queue_selector_.get(),
28 disabled_by_default_tracing_category)), 29 disabled_by_default_tracing_category)),
29 idle_period_state_(IdlePeriodState::NOT_IN_IDLE_PERIOD), 30 idle_period_state_(IdlePeriodState::NOT_IN_IDLE_PERIOD),
30 scheduler_helper_delegate_(scheduler_helper_delegate), 31 scheduler_helper_delegate_(scheduler_helper_delegate),
31 control_task_runner_( 32 control_task_runner_(
32 task_queue_manager_->TaskRunnerForQueue(QueueId::CONTROL_TASK_QUEUE)), 33 task_queue_manager_->TaskRunnerForQueue(QueueId::CONTROL_TASK_QUEUE)),
33 control_task_after_wakeup_runner_(task_queue_manager_->TaskRunnerForQueue( 34 control_task_after_wakeup_runner_(task_queue_manager_->TaskRunnerForQueue(
34 QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE)), 35 QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE)),
35 default_task_runner_( 36 default_task_runner_(
36 task_queue_manager_->TaskRunnerForQueue(QueueId::DEFAULT_TASK_QUEUE)), 37 task_queue_manager_->TaskRunnerForQueue(QueueId::DEFAULT_TASK_QUEUE)),
38 shutdown_task_runner_(task_queue_manager_->TaskRunnerForQueue(
39 QueueId::SHUTDOWN_TASK_QUEUE)),
40 total_task_queue_count_(total_task_queue_count),
37 quiescence_monitored_task_queue_mask_( 41 quiescence_monitored_task_queue_mask_(
38 ((1ull << total_task_queue_count) - 1ull) & 42 ((1ull << total_task_queue_count) - 1ull) &
39 ~(1ull << QueueId::IDLE_TASK_QUEUE) & 43 ~(1ull << QueueId::IDLE_TASK_QUEUE) &
40 ~(1ull << QueueId::CONTROL_TASK_QUEUE) & 44 ~(1ull << QueueId::CONTROL_TASK_QUEUE) &
41 ~(1ull << QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE)), 45 ~(1ull << QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE)),
42 required_quiescence_duration_before_long_idle_period_( 46 required_quiescence_duration_before_long_idle_period_(
43 required_quiescence_duration_before_long_idle_period), 47 required_quiescence_duration_before_long_idle_period),
44 time_source_(new TimeSource), 48 time_source_(new TimeSource),
45 tracing_category_(tracing_category), 49 tracing_category_(tracing_category),
46 disabled_by_default_tracing_category_( 50 disabled_by_default_tracing_category_(
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 94
91 SchedulerHelper::~SchedulerHelper() { 95 SchedulerHelper::~SchedulerHelper() {
92 } 96 }
93 97
94 SchedulerHelper::SchedulerHelperDelegate::SchedulerHelperDelegate() { 98 SchedulerHelper::SchedulerHelperDelegate::SchedulerHelperDelegate() {
95 } 99 }
96 100
97 SchedulerHelper::SchedulerHelperDelegate::~SchedulerHelperDelegate() { 101 SchedulerHelper::SchedulerHelperDelegate::~SchedulerHelperDelegate() {
98 } 102 }
99 103
104 void SchedulerHelper::PreShutdown() {
Sami 2015/04/23 13:14:03 Can we make the client ensure that this is called
alex clarke (OOO till 29th) 2015/04/23 17:34:32 I was able to do this blink side instead.
Sami 2015/04/23 18:47:49 Great, thanks.
105 TRACE_EVENT0(disabled_by_default_tracing_category_, "PreShutdown");
106 if (shutdown_task_runner_->BelongsToCurrentThread()) {
107 PreShutdownInternal(nullptr);
108 } else {
109 base::WaitableEvent completion(false, false);
110 shutdown_task_runner_->PostTask(
111 FROM_HERE, base::Bind(&SchedulerHelper::PreShutdownInternal,
112 base::Unretained(this), &completion));
113 completion.Wait();
114 }
115 }
116
117 void SchedulerHelper::PreShutdownInternal(base::WaitableEvent* completion) {
118 TRACE_EVENT0(disabled_by_default_tracing_category_, "PreShutdownInternal");
119 CheckOnValidThread();
120 EndIdlePeriod();
Sami 2015/04/23 13:14:02 Do we actually need to end the idle period? The id
alex clarke (OOO till 29th) 2015/04/23 17:34:32 Yes I think so because enable_next_long_idle_perio
Sami 2015/04/23 18:47:49 We could just let those run. I don't think there s
alex clarke (OOO till 29th) 2015/04/24 09:32:35 The reason I wrote this patch in the first place i
Sami 2015/04/24 10:38:40 That sounds like an instance of the bug I was worr
alex clarke (OOO till 29th) 2015/04/24 14:10:04 Done.
121 task_queue_selector_->DisableQueue(QueueId::CONTROL_TASK_AFTER_WAKEUP_QUEUE);
122 task_queue_selector_->DisableQueue(QueueId::DEFAULT_TASK_QUEUE);
123 for (size_t i = TASK_QUEUE_COUNT; i < total_task_queue_count_; i++) {
Sami 2015/04/23 13:14:02 Can we get a policy update that undoes all of this
alex clarke (OOO till 29th) 2015/04/23 17:34:32 Yes, but only on the render thread where this isn'
Sami 2015/04/24 10:38:40 Looks like my reply here got lost somehow: I don't
alex clarke (OOO till 29th) 2015/04/24 14:10:04 Done.
124 task_queue_selector_->DisableQueue(i);
125 }
126 if (completion)
127 completion->Signal();
128 }
129
100 void SchedulerHelper::Shutdown() { 130 void SchedulerHelper::Shutdown() {
101 CheckOnValidThread(); 131 CheckOnValidThread();
102 task_queue_manager_.reset(); 132 task_queue_manager_.reset();
103 } 133 }
104 134
105 scoped_refptr<base::SingleThreadTaskRunner> 135 scoped_refptr<base::SingleThreadTaskRunner>
106 SchedulerHelper::DefaultTaskRunner() { 136 SchedulerHelper::DefaultTaskRunner() {
107 CheckOnValidThread(); 137 CheckOnValidThread();
108 return default_task_runner_; 138 return default_task_runner_;
109 } 139 }
110 140
111 scoped_refptr<SingleThreadIdleTaskRunner> SchedulerHelper::IdleTaskRunner() { 141 scoped_refptr<SingleThreadIdleTaskRunner> SchedulerHelper::IdleTaskRunner() {
112 CheckOnValidThread(); 142 CheckOnValidThread();
113 return idle_task_runner_; 143 return idle_task_runner_;
114 } 144 }
115 145
116 scoped_refptr<base::SingleThreadTaskRunner> 146 scoped_refptr<base::SingleThreadTaskRunner>
147 SchedulerHelper::ShutdownTaskRunner() {
148 CheckOnValidThread();
149 return shutdown_task_runner_;
150 }
151
152 scoped_refptr<base::SingleThreadTaskRunner>
117 SchedulerHelper::ControlTaskRunner() { 153 SchedulerHelper::ControlTaskRunner() {
118 return control_task_runner_; 154 return control_task_runner_;
119 } 155 }
120 156
121 void SchedulerHelper::CurrentIdleTaskDeadlineCallback( 157 void SchedulerHelper::CurrentIdleTaskDeadlineCallback(
122 base::TimeTicks* deadline_out) const { 158 base::TimeTicks* deadline_out) const {
123 CheckOnValidThread(); 159 CheckOnValidThread();
124 *deadline_out = idle_period_deadline_; 160 *deadline_out = idle_period_deadline_;
125 } 161 }
126 162
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 return task_queue_manager_->IsQueueEmpty(queue_index); 393 return task_queue_manager_->IsQueueEmpty(queue_index);
358 } 394 }
359 395
360 // static 396 // static
361 const char* SchedulerHelper::TaskQueueIdToString(QueueId queue_id) { 397 const char* SchedulerHelper::TaskQueueIdToString(QueueId queue_id) {
362 switch (queue_id) { 398 switch (queue_id) {
363 case DEFAULT_TASK_QUEUE: 399 case DEFAULT_TASK_QUEUE:
364 return "default_tq"; 400 return "default_tq";
365 case IDLE_TASK_QUEUE: 401 case IDLE_TASK_QUEUE:
366 return "idle_tq"; 402 return "idle_tq";
403 case SHUTDOWN_TASK_QUEUE:
404 return "shutdown_tq";
367 case CONTROL_TASK_QUEUE: 405 case CONTROL_TASK_QUEUE:
368 return "control_tq"; 406 return "control_tq";
369 case CONTROL_TASK_AFTER_WAKEUP_QUEUE: 407 case CONTROL_TASK_AFTER_WAKEUP_QUEUE:
370 return "control_after_wakeup_tq"; 408 return "control_after_wakeup_tq";
371 default: 409 default:
372 NOTREACHED(); 410 NOTREACHED();
373 return nullptr; 411 return nullptr;
374 } 412 }
375 } 413 }
376 414
(...skipping 25 matching lines...) Expand all
402 } 440 }
403 441
404 void SchedulerHelper::RemoveTaskObserver( 442 void SchedulerHelper::RemoveTaskObserver(
405 base::MessageLoop::TaskObserver* task_observer) { 443 base::MessageLoop::TaskObserver* task_observer) {
406 CheckOnValidThread(); 444 CheckOnValidThread();
407 if (task_queue_manager_) 445 if (task_queue_manager_)
408 task_queue_manager_->RemoveTaskObserver(task_observer); 446 task_queue_manager_->RemoveTaskObserver(task_observer);
409 } 447 }
410 448
411 } // namespace scheduler 449 } // namespace scheduler
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698