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

Side by Side Diff: components/scheduler/base/task_queue_impl.cc

Issue 1461143003: Revert of Adds TimeDomains to the TaskQueueManager (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month 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/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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « components/scheduler/base/task_queue_impl.h ('k') | components/scheduler/base/task_queue_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698