OLD | NEW |
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/base/task_queue_impl.h" | 5 #include "components/scheduler/base/task_queue_impl.h" |
6 | 6 |
7 #include "components/scheduler/base/task_queue_manager.h" | 7 #include "components/scheduler/base/task_queue_manager.h" |
8 #include "components/scheduler/base/task_queue_manager_delegate.h" | 8 #include "components/scheduler/base/task_queue_manager_delegate.h" |
9 #include "components/scheduler/base/time_domain.h" | |
10 | 9 |
11 namespace scheduler { | 10 namespace scheduler { |
12 namespace internal { | 11 namespace internal { |
13 | 12 |
14 TaskQueueImpl::TaskQueueImpl( | 13 TaskQueueImpl::TaskQueueImpl( |
15 TaskQueueManager* task_queue_manager, | 14 TaskQueueManager* task_queue_manager, |
16 const scoped_refptr<TimeDomain>& time_domain, | |
17 const Spec& spec, | 15 const Spec& spec, |
18 const char* disabled_by_default_tracing_category, | 16 const char* disabled_by_default_tracing_category, |
19 const char* disabled_by_default_verbose_tracing_category) | 17 const char* disabled_by_default_verbose_tracing_category) |
20 : thread_id_(base::PlatformThread::CurrentId()), | 18 : thread_id_(base::PlatformThread::CurrentId()), |
21 any_thread_(task_queue_manager, spec.pump_policy, time_domain), | 19 any_thread_(task_queue_manager, spec.pump_policy), |
22 name_(spec.name), | 20 name_(spec.name), |
23 disabled_by_default_tracing_category_( | 21 disabled_by_default_tracing_category_( |
24 disabled_by_default_tracing_category), | 22 disabled_by_default_tracing_category), |
25 disabled_by_default_verbose_tracing_category_( | 23 disabled_by_default_verbose_tracing_category_( |
26 disabled_by_default_verbose_tracing_category), | 24 disabled_by_default_verbose_tracing_category), |
27 main_thread_only_(task_queue_manager), | 25 main_thread_only_(task_queue_manager), |
28 wakeup_policy_(spec.wakeup_policy), | 26 wakeup_policy_(spec.wakeup_policy), |
29 should_monitor_quiescence_(spec.should_monitor_quiescence), | 27 should_monitor_quiescence_(spec.should_monitor_quiescence), |
30 should_notify_observers_(spec.should_notify_observers) { | 28 should_notify_observers_(spec.should_notify_observers) {} |
31 DCHECK(time_domain.get()); | |
32 } | |
33 | 29 |
34 TaskQueueImpl::~TaskQueueImpl() {} | 30 TaskQueueImpl::~TaskQueueImpl() {} |
35 | 31 |
36 TaskQueueImpl::Task::Task() | 32 TaskQueueImpl::Task::Task() |
37 : PendingTask(tracked_objects::Location(), | 33 : PendingTask(tracked_objects::Location(), |
38 base::Closure(), | 34 base::Closure(), |
39 base::TimeTicks(), | 35 base::TimeTicks(), |
40 true), | 36 true), |
41 #ifndef NDEBUG | 37 #ifndef NDEBUG |
42 enqueue_order_set_(false), | 38 enqueue_order_set_(false), |
43 #endif | 39 #endif |
44 enqueue_order_(0) { | 40 enqueue_order_(0) { |
45 sequence_num = 0; | 41 sequence_num = 0; |
46 } | 42 } |
47 | 43 |
48 TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from, | 44 TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from, |
49 const base::Closure& task, | 45 const base::Closure& task, |
50 int sequence_number, | 46 int sequence_number, |
51 bool nestable) | 47 bool nestable) |
52 : PendingTask(posted_from, task, base::TimeTicks(), nestable), | 48 : PendingTask(posted_from, task, base::TimeTicks(), nestable), |
53 #ifndef NDEBUG | 49 #ifndef NDEBUG |
54 enqueue_order_set_(false), | 50 enqueue_order_set_(false), |
55 #endif | 51 #endif |
56 enqueue_order_(0) { | 52 enqueue_order_(0) { |
57 sequence_num = sequence_number; | 53 sequence_num = sequence_number; |
58 } | 54 } |
59 | 55 |
60 TaskQueueImpl::AnyThread::AnyThread( | 56 TaskQueueImpl::AnyThread::AnyThread(TaskQueueManager* task_queue_manager, |
61 TaskQueueManager* task_queue_manager, | 57 PumpPolicy pump_policy) |
62 PumpPolicy pump_policy, | 58 : task_queue_manager(task_queue_manager), pump_policy(pump_policy) {} |
63 const scoped_refptr<TimeDomain>& time_domain) | |
64 : task_queue_manager(task_queue_manager), | |
65 pump_policy(pump_policy), | |
66 time_domain(time_domain) {} | |
67 | 59 |
68 TaskQueueImpl::AnyThread::~AnyThread() {} | 60 TaskQueueImpl::AnyThread::~AnyThread() {} |
69 | 61 |
70 TaskQueueImpl::MainThreadOnly::MainThreadOnly( | 62 TaskQueueImpl::MainThreadOnly::MainThreadOnly( |
71 TaskQueueManager* task_queue_manager) | 63 TaskQueueManager* task_queue_manager) |
72 : task_queue_manager(task_queue_manager), | 64 : task_queue_manager(task_queue_manager), |
73 set_index(0) {} | 65 set_index(0) {} |
74 | 66 |
75 TaskQueueImpl::MainThreadOnly::~MainThreadOnly() {} | 67 TaskQueueImpl::MainThreadOnly::~MainThreadOnly() {} |
76 | 68 |
77 void TaskQueueImpl::UnregisterTaskQueue() { | 69 void TaskQueueImpl::UnregisterTaskQueue() { |
78 base::AutoLock lock(any_thread_lock_); | 70 base::AutoLock lock(any_thread_lock_); |
79 if (!any_thread().task_queue_manager) | 71 if (!any_thread().task_queue_manager) |
80 return; | 72 return; |
81 any_thread().time_domain->UnregisterQueue(this); | |
82 any_thread().time_domain = nullptr; | |
83 any_thread().task_queue_manager->UnregisterTaskQueue(this); | 73 any_thread().task_queue_manager->UnregisterTaskQueue(this); |
84 | 74 |
85 any_thread().task_queue_manager = nullptr; | 75 any_thread().task_queue_manager = nullptr; |
86 main_thread_only().task_queue_manager = nullptr; | 76 main_thread_only().task_queue_manager = nullptr; |
87 any_thread().delayed_task_queue = std::priority_queue<Task>(); | 77 any_thread().delayed_task_queue = std::priority_queue<Task>(); |
88 any_thread().incoming_queue = std::queue<Task>(); | 78 any_thread().incoming_queue = std::queue<Task>(); |
89 main_thread_only().work_queue = std::queue<Task>(); | 79 main_thread_only().work_queue = std::queue<Task>(); |
90 } | 80 } |
91 | 81 |
92 bool TaskQueueImpl::RunsTasksOnCurrentThread() const { | 82 bool TaskQueueImpl::RunsTasksOnCurrentThread() const { |
(...skipping 14 matching lines...) Expand all Loading... |
107 return PostDelayedTaskImpl(from_here, task, delay, TaskType::NON_NESTABLE); | 97 return PostDelayedTaskImpl(from_here, task, delay, TaskType::NON_NESTABLE); |
108 } | 98 } |
109 | 99 |
110 bool TaskQueueImpl::PostDelayedTaskAt( | 100 bool TaskQueueImpl::PostDelayedTaskAt( |
111 const tracked_objects::Location& from_here, | 101 const tracked_objects::Location& from_here, |
112 const base::Closure& task, | 102 const base::Closure& task, |
113 base::TimeTicks desired_run_time) { | 103 base::TimeTicks desired_run_time) { |
114 base::AutoLock lock(any_thread_lock_); | 104 base::AutoLock lock(any_thread_lock_); |
115 if (!any_thread().task_queue_manager) | 105 if (!any_thread().task_queue_manager) |
116 return false; | 106 return false; |
117 LazyNow lazy_now(any_thread().time_domain->CreateLazyNow()); | 107 LazyNow lazy_now(any_thread().task_queue_manager->delegate().get()); |
118 return PostDelayedTaskLocked(&lazy_now, from_here, task, desired_run_time, | 108 return PostDelayedTaskLocked(&lazy_now, from_here, task, desired_run_time, |
119 TaskType::NORMAL); | 109 TaskType::NORMAL); |
120 } | 110 } |
121 | 111 |
122 bool TaskQueueImpl::PostDelayedTaskImpl( | 112 bool TaskQueueImpl::PostDelayedTaskImpl( |
123 const tracked_objects::Location& from_here, | 113 const tracked_objects::Location& from_here, |
124 const base::Closure& task, | 114 const base::Closure& task, |
125 base::TimeDelta delay, | 115 base::TimeDelta delay, |
126 TaskType task_type) { | 116 TaskType task_type) { |
127 base::AutoLock lock(any_thread_lock_); | 117 base::AutoLock lock(any_thread_lock_); |
128 if (!any_thread().task_queue_manager) | 118 if (!any_thread().task_queue_manager) |
129 return false; | 119 return false; |
130 LazyNow lazy_now(any_thread().time_domain->CreateLazyNow()); | 120 LazyNow lazy_now(any_thread().task_queue_manager->delegate().get()); |
131 base::TimeTicks desired_run_time; | 121 base::TimeTicks desired_run_time; |
132 if (delay > base::TimeDelta()) | 122 if (delay > base::TimeDelta()) |
133 desired_run_time = lazy_now.Now() + delay; | 123 desired_run_time = lazy_now.Now() + delay; |
134 return PostDelayedTaskLocked(&lazy_now, from_here, task, desired_run_time, | 124 return PostDelayedTaskLocked(&lazy_now, from_here, task, desired_run_time, |
135 task_type); | 125 task_type); |
136 } | 126 } |
137 | 127 |
138 bool TaskQueueImpl::PostDelayedTaskLocked( | 128 bool TaskQueueImpl::PostDelayedTaskLocked( |
139 LazyNow* lazy_now, | 129 LazyNow* lazy_now, |
140 const tracked_objects::Location& from_here, | 130 const tracked_objects::Location& from_here, |
141 const base::Closure& task, | 131 const base::Closure& task, |
142 base::TimeTicks desired_run_time, | 132 base::TimeTicks desired_run_time, |
143 TaskType task_type) { | 133 TaskType task_type) { |
144 DCHECK(any_thread().task_queue_manager); | 134 DCHECK(any_thread().task_queue_manager); |
145 Task pending_task(from_here, task, | 135 Task pending_task(from_here, task, |
146 any_thread().task_queue_manager->GetNextSequenceNumber(), | 136 any_thread().task_queue_manager->GetNextSequenceNumber(), |
147 task_type != TaskType::NON_NESTABLE); | 137 task_type != TaskType::NON_NESTABLE); |
148 any_thread().task_queue_manager->DidQueueTask(pending_task); | 138 any_thread().task_queue_manager->DidQueueTask(pending_task); |
149 | 139 |
150 if (!desired_run_time.is_null()) { | 140 if (!desired_run_time.is_null()) { |
151 pending_task.delayed_run_time = std::max(lazy_now->Now(), desired_run_time); | 141 pending_task.delayed_run_time = std::max(lazy_now->Now(), desired_run_time); |
152 // TODO(alexclarke): consider emplace() when C++11 library features allowed. | 142 // TODO(alexclarke): consider emplace() when C++11 library features allowed. |
153 any_thread().delayed_task_queue.push(pending_task); | 143 any_thread().delayed_task_queue.push(pending_task); |
154 TraceQueueSize(true); | 144 TraceQueueSize(true); |
155 // Schedule a later call to MoveReadyDelayedTasksToIncomingQueue. | 145 // Schedule a later call to MoveReadyDelayedTasksToIncomingQueue. |
156 if (base::PlatformThread::CurrentId() == thread_id_) { | 146 any_thread().task_queue_manager->ScheduleDelayedWork(this, desired_run_time, |
157 any_thread().time_domain->ScheduleDelayedWork(this, desired_run_time, | 147 lazy_now); |
158 lazy_now); | |
159 } else { | |
160 // NOTE posting a delayed task from a different thread is not expected to | |
161 // be common. This pathway is less optimal than perhaps it could be | |
162 // because it causes two main thread tasks to be run. Should this | |
163 // assumption prove to be false in future, we may need to revisit this. | |
164 Task thread_hop_task( | |
165 FROM_HERE, base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this, | |
166 any_thread().time_domain, desired_run_time), | |
167 any_thread().task_queue_manager->GetNextSequenceNumber(), true); | |
168 any_thread().task_queue_manager->DidQueueTask(thread_hop_task); | |
169 pending_task.set_enqueue_order(thread_hop_task.sequence_num); | |
170 EnqueueTaskLocked(thread_hop_task); | |
171 } | |
172 return true; | 148 return true; |
173 } | 149 } |
174 pending_task.set_enqueue_order(pending_task.sequence_num); | 150 pending_task.set_enqueue_order(pending_task.sequence_num); |
175 EnqueueTaskLocked(pending_task); | 151 EnqueueTaskLocked(pending_task); |
176 return true; | 152 return true; |
177 } | 153 } |
178 | 154 |
179 void TaskQueueImpl::ScheduleDelayedWorkTask( | |
180 const scoped_refptr<TimeDomain> time_domain, | |
181 base::TimeTicks desired_run_time) { | |
182 DCHECK(main_thread_checker_.CalledOnValidThread()); | |
183 LazyNow lazy_now(time_domain->CreateLazyNow()); | |
184 time_domain->ScheduleDelayedWork(this, desired_run_time, &lazy_now); | |
185 } | |
186 | |
187 void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueue(LazyNow* lazy_now) { | 155 void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueue(LazyNow* lazy_now) { |
188 base::AutoLock lock(any_thread_lock_); | 156 base::AutoLock lock(any_thread_lock_); |
189 if (!any_thread().task_queue_manager) | 157 if (!any_thread().task_queue_manager) |
190 return; | 158 return; |
191 | 159 |
192 MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now); | 160 MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now); |
193 } | 161 } |
194 | 162 |
195 void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueueLocked( | 163 void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueueLocked( |
196 LazyNow* lazy_now) { | 164 LazyNow* lazy_now) { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 if (any_thread().pump_policy == PumpPolicy::MANUAL) | 215 if (any_thread().pump_policy == PumpPolicy::MANUAL) |
248 return false; | 216 return false; |
249 if (any_thread().pump_policy == PumpPolicy::AFTER_WAKEUP && | 217 if (any_thread().pump_policy == PumpPolicy::AFTER_WAKEUP && |
250 (!should_trigger_wakeup || TaskIsOlderThanQueuedTasks(previous_task))) | 218 (!should_trigger_wakeup || TaskIsOlderThanQueuedTasks(previous_task))) |
251 return false; | 219 return false; |
252 if (any_thread().incoming_queue.empty()) | 220 if (any_thread().incoming_queue.empty()) |
253 return false; | 221 return false; |
254 return true; | 222 return true; |
255 } | 223 } |
256 | 224 |
| 225 bool TaskQueueImpl::NextPendingDelayedTaskRunTime( |
| 226 base::TimeTicks* next_pending_delayed_task) { |
| 227 base::AutoLock lock(any_thread_lock_); |
| 228 if (any_thread().delayed_task_queue.empty()) |
| 229 return false; |
| 230 *next_pending_delayed_task = |
| 231 any_thread().delayed_task_queue.top().delayed_run_time; |
| 232 return true; |
| 233 } |
| 234 |
257 void TaskQueueImpl::UpdateWorkQueue(LazyNow* lazy_now, | 235 void TaskQueueImpl::UpdateWorkQueue(LazyNow* lazy_now, |
258 bool should_trigger_wakeup, | 236 bool should_trigger_wakeup, |
259 const Task* previous_task) { | 237 const Task* previous_task) { |
260 DCHECK(main_thread_only().work_queue.empty()); | 238 DCHECK(main_thread_only().work_queue.empty()); |
261 base::AutoLock lock(any_thread_lock_); | 239 base::AutoLock lock(any_thread_lock_); |
262 if (!ShouldAutoPumpQueueLocked(should_trigger_wakeup, previous_task)) | 240 if (!ShouldAutoPumpQueueLocked(should_trigger_wakeup, previous_task)) |
263 return; | 241 return; |
264 MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now); | 242 MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now); |
265 std::swap(main_thread_only().work_queue, any_thread().incoming_queue); | 243 std::swap(main_thread_only().work_queue, any_thread().incoming_queue); |
266 // |any_thread().incoming_queue| is now empty so TimeDomain::UpdateQueues | 244 // |any_thread().incoming_queue| is now empty so |
267 // no longer needs to consider this queue for reloading. | 245 // TaskQueueManager::UpdateQueues no longer needs to consider |
268 any_thread().time_domain->UnregisterAsUpdatableTaskQueue(this); | 246 // this queue for reloading. |
| 247 any_thread().task_queue_manager->UnregisterAsUpdatableTaskQueue(this); |
269 if (!main_thread_only().work_queue.empty()) { | 248 if (!main_thread_only().work_queue.empty()) { |
270 DCHECK(any_thread().task_queue_manager); | 249 DCHECK(any_thread().task_queue_manager); |
271 any_thread().task_queue_manager->selector_.GetTaskQueueSets()->OnPushQueue( | 250 any_thread().task_queue_manager->selector_.GetTaskQueueSets()->OnPushQueue( |
272 this); | 251 this); |
273 TraceQueueSize(true); | 252 TraceQueueSize(true); |
274 } | 253 } |
275 } | 254 } |
276 | 255 |
277 TaskQueueImpl::Task TaskQueueImpl::TakeTaskFromWorkQueue() { | 256 TaskQueueImpl::Task TaskQueueImpl::TakeTaskFromWorkQueue() { |
278 // TODO(alexclarke): consider std::move() when allowed. | 257 // TODO(alexclarke): consider std::move() when allowed. |
(...skipping 22 matching lines...) Expand all Loading... |
301 main_thread_only().work_queue.size() + | 280 main_thread_only().work_queue.size() + |
302 any_thread().delayed_task_queue.size()); | 281 any_thread().delayed_task_queue.size()); |
303 if (!is_locked) | 282 if (!is_locked) |
304 any_thread_lock_.Release(); | 283 any_thread_lock_.Release(); |
305 } | 284 } |
306 | 285 |
307 void TaskQueueImpl::EnqueueTaskLocked(const Task& pending_task) { | 286 void TaskQueueImpl::EnqueueTaskLocked(const Task& pending_task) { |
308 if (!any_thread().task_queue_manager) | 287 if (!any_thread().task_queue_manager) |
309 return; | 288 return; |
310 if (any_thread().incoming_queue.empty()) | 289 if (any_thread().incoming_queue.empty()) |
311 any_thread().time_domain->RegisterAsUpdatableTaskQueue(this); | 290 any_thread().task_queue_manager->RegisterAsUpdatableTaskQueue(this); |
312 if (any_thread().pump_policy == PumpPolicy::AUTO && | 291 if (any_thread().pump_policy == PumpPolicy::AUTO && |
313 any_thread().incoming_queue.empty()) { | 292 any_thread().incoming_queue.empty()) { |
314 any_thread().task_queue_manager->MaybePostDoWorkOnMainRunner(); | 293 any_thread().task_queue_manager->MaybePostDoWorkOnMainRunner(); |
315 } | 294 } |
316 // TODO(alexclarke): consider std::move() when allowed. | 295 // TODO(alexclarke): consider std::move() when allowed. |
317 any_thread().incoming_queue.push(pending_task); | 296 any_thread().incoming_queue.push(pending_task); |
318 TraceQueueSize(true); | 297 TraceQueueSize(true); |
319 } | 298 } |
320 | 299 |
321 // TODO(alexclarke): Consider merging EnqueueTaskLocked & | |
322 // EnqueueDelayedTaskLocked. | |
323 void TaskQueueImpl::EnqueueDelayedTaskLocked(const Task& pending_task) { | 300 void TaskQueueImpl::EnqueueDelayedTaskLocked(const Task& pending_task) { |
324 if (!any_thread().task_queue_manager) | 301 if (!any_thread().task_queue_manager) |
325 return; | 302 return; |
326 if (any_thread().incoming_queue.empty()) | 303 if (any_thread().incoming_queue.empty()) |
327 any_thread().time_domain->RegisterAsUpdatableTaskQueue(this); | 304 any_thread().task_queue_manager->RegisterAsUpdatableTaskQueue(this); |
328 if (any_thread().pump_policy == PumpPolicy::AUTO && | |
329 any_thread().incoming_queue.empty()) { | |
330 any_thread().task_queue_manager->MaybePostDoWorkOnMainRunner(); | |
331 } | |
332 // TODO(alexclarke): consider std::move() when allowed. | 305 // TODO(alexclarke): consider std::move() when allowed. |
333 any_thread().incoming_queue.push(pending_task); | 306 any_thread().incoming_queue.push(pending_task); |
334 any_thread().incoming_queue.back().set_enqueue_order( | 307 any_thread().incoming_queue.back().set_enqueue_order( |
335 any_thread().task_queue_manager->GetNextSequenceNumber()); | 308 any_thread().task_queue_manager->GetNextSequenceNumber()); |
336 TraceQueueSize(true); | 309 TraceQueueSize(true); |
337 } | 310 } |
338 | 311 |
339 void TaskQueueImpl::SetPumpPolicy(PumpPolicy pump_policy) { | 312 void TaskQueueImpl::SetPumpPolicy(PumpPolicy pump_policy) { |
340 base::AutoLock lock(any_thread_lock_); | 313 base::AutoLock lock(any_thread_lock_); |
341 if (pump_policy == PumpPolicy::AUTO && | 314 if (pump_policy == PumpPolicy::AUTO && |
342 any_thread().pump_policy != PumpPolicy::AUTO) { | 315 any_thread().pump_policy != PumpPolicy::AUTO) { |
343 PumpQueueLocked(); | 316 PumpQueueLocked(); |
344 } | 317 } |
345 any_thread().pump_policy = pump_policy; | 318 any_thread().pump_policy = pump_policy; |
346 } | 319 } |
347 | 320 |
348 void TaskQueueImpl::PumpQueueLocked() { | 321 void TaskQueueImpl::PumpQueueLocked() { |
349 if (!any_thread().task_queue_manager) | 322 if (!any_thread().task_queue_manager) |
350 return; | 323 return; |
351 | 324 |
352 LazyNow lazy_now(any_thread().time_domain->CreateLazyNow()); | 325 LazyNow lazy_now(any_thread().task_queue_manager->delegate().get()); |
353 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now); | 326 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now); |
354 | 327 |
355 bool was_empty = main_thread_only().work_queue.empty(); | 328 bool was_empty = main_thread_only().work_queue.empty(); |
356 while (!any_thread().incoming_queue.empty()) { | 329 while (!any_thread().incoming_queue.empty()) { |
357 // TODO(alexclarke): consider std::move() when allowed. | 330 // TODO(alexclarke): consider std::move() when allowed. |
358 main_thread_only().work_queue.push(any_thread().incoming_queue.front()); | 331 main_thread_only().work_queue.push(any_thread().incoming_queue.front()); |
359 any_thread().incoming_queue.pop(); | 332 any_thread().incoming_queue.pop(); |
360 } | 333 } |
361 // |incoming_queue| is now empty so TimeDomain::UpdateQueues no longer needs | 334 // |incoming_queue| is now empty so TaskQueueManager::UpdateQueues no longer |
362 // to consider this queue for reloading. | 335 // needs to consider this queue for reloading. |
363 any_thread().time_domain->UnregisterAsUpdatableTaskQueue(this); | 336 any_thread().task_queue_manager->UnregisterAsUpdatableTaskQueue(this); |
364 if (!main_thread_only().work_queue.empty()) { | 337 if (!main_thread_only().work_queue.empty()) { |
365 if (was_empty) { | 338 if (was_empty) { |
366 any_thread() | 339 any_thread() |
367 .task_queue_manager->selector_.GetTaskQueueSets() | 340 .task_queue_manager->selector_.GetTaskQueueSets() |
368 ->OnPushQueue(this); | 341 ->OnPushQueue(this); |
369 } | 342 } |
370 any_thread().task_queue_manager->MaybePostDoWorkOnMainRunner(); | 343 any_thread().task_queue_manager->MaybePostDoWorkOnMainRunner(); |
371 } | 344 } |
372 } | 345 } |
373 | 346 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 default: | 423 default: |
451 NOTREACHED(); | 424 NOTREACHED(); |
452 return nullptr; | 425 return nullptr; |
453 } | 426 } |
454 } | 427 } |
455 | 428 |
456 void TaskQueueImpl::AsValueInto(base::trace_event::TracedValue* state) const { | 429 void TaskQueueImpl::AsValueInto(base::trace_event::TracedValue* state) const { |
457 base::AutoLock lock(any_thread_lock_); | 430 base::AutoLock lock(any_thread_lock_); |
458 state->BeginDictionary(); | 431 state->BeginDictionary(); |
459 state->SetString("name", GetName()); | 432 state->SetString("name", GetName()); |
460 state->SetString("time_domain_name", any_thread().time_domain->GetName()); | |
461 state->SetString("pump_policy", PumpPolicyToString(any_thread().pump_policy)); | 433 state->SetString("pump_policy", PumpPolicyToString(any_thread().pump_policy)); |
462 state->SetString("wakeup_policy", WakeupPolicyToString(wakeup_policy_)); | 434 state->SetString("wakeup_policy", WakeupPolicyToString(wakeup_policy_)); |
463 bool verbose_tracing_enabled = false; | 435 bool verbose_tracing_enabled = false; |
464 TRACE_EVENT_CATEGORY_GROUP_ENABLED( | 436 TRACE_EVENT_CATEGORY_GROUP_ENABLED( |
465 disabled_by_default_verbose_tracing_category_, &verbose_tracing_enabled); | 437 disabled_by_default_verbose_tracing_category_, &verbose_tracing_enabled); |
466 state->SetInteger("incoming_queue_size", any_thread().incoming_queue.size()); | 438 state->SetInteger("incoming_queue_size", any_thread().incoming_queue.size()); |
467 state->SetInteger("work_queue_size", main_thread_only().work_queue.size()); | 439 state->SetInteger("work_queue_size", main_thread_only().work_queue.size()); |
468 state->SetInteger("delayed_task_queue_size", | 440 state->SetInteger("delayed_task_queue_size", |
469 any_thread().delayed_task_queue.size()); | 441 any_thread().delayed_task_queue.size()); |
470 if (verbose_tracing_enabled) { | 442 if (verbose_tracing_enabled) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 } | 474 } |
503 | 475 |
504 void TaskQueueImpl::NotifyDidProcessTask( | 476 void TaskQueueImpl::NotifyDidProcessTask( |
505 const base::PendingTask& pending_task) { | 477 const base::PendingTask& pending_task) { |
506 DCHECK(should_notify_observers_); | 478 DCHECK(should_notify_observers_); |
507 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, | 479 FOR_EACH_OBSERVER(base::MessageLoop::TaskObserver, |
508 main_thread_only().task_observers, | 480 main_thread_only().task_observers, |
509 DidProcessTask(pending_task)); | 481 DidProcessTask(pending_task)); |
510 } | 482 } |
511 | 483 |
512 void TaskQueueImpl::SetTimeDomain( | |
513 const scoped_refptr<TimeDomain>& time_domain) { | |
514 base::AutoLock lock(any_thread_lock_); | |
515 DCHECK(main_thread_checker_.CalledOnValidThread()); | |
516 if (time_domain == any_thread().time_domain) | |
517 return; | |
518 | |
519 any_thread().time_domain->MigrateQueue(this, time_domain.get()); | |
520 any_thread().time_domain = time_domain; | |
521 } | |
522 | |
523 // static | 484 // static |
524 void TaskQueueImpl::QueueAsValueInto(const std::queue<Task>& queue, | 485 void TaskQueueImpl::QueueAsValueInto(const std::queue<Task>& queue, |
525 base::trace_event::TracedValue* state) { | 486 base::trace_event::TracedValue* state) { |
526 std::queue<Task> queue_copy(queue); | 487 std::queue<Task> queue_copy(queue); |
527 while (!queue_copy.empty()) { | 488 while (!queue_copy.empty()) { |
528 TaskAsValueInto(queue_copy.front(), state); | 489 TaskAsValueInto(queue_copy.front(), state); |
529 queue_copy.pop(); | 490 queue_copy.pop(); |
530 } | 491 } |
531 } | 492 } |
532 | 493 |
(...skipping 15 matching lines...) Expand all Loading... |
548 state->SetInteger("enqueue_order", task.enqueue_order()); | 509 state->SetInteger("enqueue_order", task.enqueue_order()); |
549 state->SetInteger("sequence_num", task.sequence_num); | 510 state->SetInteger("sequence_num", task.sequence_num); |
550 state->SetBoolean("nestable", task.nestable); | 511 state->SetBoolean("nestable", task.nestable); |
551 state->SetBoolean("is_high_res", task.is_high_res); | 512 state->SetBoolean("is_high_res", task.is_high_res); |
552 state->SetDouble( | 513 state->SetDouble( |
553 "delayed_run_time", | 514 "delayed_run_time", |
554 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); | 515 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); |
555 state->EndDictionary(); | 516 state->EndDictionary(); |
556 } | 517 } |
557 | 518 |
558 size_t TaskQueueImpl::IncomingQueueSizeForTest() const { | |
559 base::AutoLock lock(any_thread_lock_); | |
560 return any_thread().incoming_queue.size(); | |
561 } | |
562 | |
563 } // namespace internal | 519 } // namespace internal |
564 } // namespace scheduler | 520 } // namespace scheduler |
OLD | NEW |