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

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

Issue 1223163006: Implement PostDelayedTaskAt for guaranteed timer ordering (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add missing include to IdleHelperTest. Created 5 years, 5 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/task_queue_manager.h" 5 #include "components/scheduler/child/task_queue_manager.h"
6 6
7 #include <queue> 7 #include <queue>
8 #include <set> 8 #include <set>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/time/default_tick_clock.h" 11 #include "base/time/default_tick_clock.h"
12 #include "base/trace_event/trace_event.h" 12 #include "base/trace_event/trace_event.h"
13 #include "base/trace_event/trace_event_argument.h" 13 #include "base/trace_event/trace_event_argument.h"
14 #include "components/scheduler/child/nestable_single_thread_task_runner.h" 14 #include "components/scheduler/child/nestable_single_thread_task_runner.h"
15 #include "components/scheduler/child/task_queue.h"
15 #include "components/scheduler/child/task_queue_selector.h" 16 #include "components/scheduler/child/task_queue_selector.h"
16 17
17 namespace { 18 namespace {
18 const int64_t kMaxTimeTicks = std::numeric_limits<int64>::max(); 19 const int64_t kMaxTimeTicks = std::numeric_limits<int64>::max();
19 } 20 }
20 21
21 namespace scheduler { 22 namespace scheduler {
22 namespace internal { 23 namespace internal {
23 24
24 // Now() is somewhat expensive so it makes sense not to call Now() unless we 25 // Now() is somewhat expensive so it makes sense not to call Now() unless we
(...skipping 12 matching lines...) Expand all
37 if (now_.is_null()) 38 if (now_.is_null())
38 now_ = task_queue_manager_->Now(); 39 now_ = task_queue_manager_->Now();
39 return now_; 40 return now_;
40 } 41 }
41 42
42 private: 43 private:
43 TaskQueueManager* task_queue_manager_; // NOT OWNED 44 TaskQueueManager* task_queue_manager_; // NOT OWNED
44 base::TimeTicks now_; 45 base::TimeTicks now_;
45 }; 46 };
46 47
47 class TaskQueue : public base::SingleThreadTaskRunner { 48 class TaskQueueImpl : public TaskQueue {
48 public: 49 public:
49 TaskQueue(TaskQueueManager* task_queue_manager, 50 TaskQueueImpl(TaskQueueManager* task_queue_manager,
50 const char* disabled_by_default_tracing_category, 51 const char* disabled_by_default_tracing_category,
51 const char* disabled_by_default_verbose_tracing_category); 52 const char* disabled_by_default_verbose_tracing_category);
52 53
53 // base::SingleThreadTaskRunner implementation. 54 // TaskQueue :implementation.
54 bool RunsTasksOnCurrentThread() const override; 55 bool RunsTasksOnCurrentThread() const override;
55 bool PostDelayedTask(const tracked_objects::Location& from_here, 56 bool PostDelayedTask(const tracked_objects::Location& from_here,
56 const base::Closure& task, 57 const base::Closure& task,
57 base::TimeDelta delay) override { 58 base::TimeDelta delay) override {
58 return PostDelayedTaskImpl(from_here, task, delay, TaskType::NORMAL); 59 return PostDelayedTaskImpl(from_here, task, delay, TaskType::NORMAL);
59 } 60 }
60 61
61 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, 62 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
62 const base::Closure& task, 63 const base::Closure& task,
63 base::TimeDelta delay) override { 64 base::TimeDelta delay) override {
64 return PostDelayedTaskImpl(from_here, task, delay, TaskType::NON_NESTABLE); 65 return PostDelayedTaskImpl(from_here, task, delay, TaskType::NON_NESTABLE);
65 } 66 }
67 bool PostDelayedTaskAt(const tracked_objects::Location& from_here,
68 const base::Closure& task,
69 base::TimeTicks desired_run_time) override;
66 70
67 TaskQueueManager::QueueState GetQueueState() const; 71 TaskQueueManager::QueueState GetQueueState() const;
68 72
69 void SetPumpPolicy(TaskQueueManager::PumpPolicy pump_policy); 73 void SetPumpPolicy(TaskQueueManager::PumpPolicy pump_policy);
70 void PumpQueue(); 74 void PumpQueue();
71 75
72 bool NextPendingDelayedTaskRunTime( 76 bool NextPendingDelayedTaskRunTime(
73 base::TimeTicks* next_pending_delayed_task); 77 base::TimeTicks* next_pending_delayed_task);
74 78
75 bool UpdateWorkQueue(LazyNow* lazy_now, 79 bool UpdateWorkQueue(LazyNow* lazy_now,
(...skipping 18 matching lines...) Expand all
94 } 98 }
95 99
96 void AsValueInto(base::trace_event::TracedValue* state) const; 100 void AsValueInto(base::trace_event::TracedValue* state) const;
97 101
98 private: 102 private:
99 enum class TaskType { 103 enum class TaskType {
100 NORMAL, 104 NORMAL,
101 NON_NESTABLE, 105 NON_NESTABLE,
102 }; 106 };
103 107
104 ~TaskQueue() override; 108 ~TaskQueueImpl() override;
105 109
106 bool PostDelayedTaskImpl(const tracked_objects::Location& from_here, 110 bool PostDelayedTaskImpl(const tracked_objects::Location& from_here,
107 const base::Closure& task, 111 const base::Closure& task,
108 base::TimeDelta delay, 112 base::TimeDelta delay,
109 TaskType task_type); 113 TaskType task_type);
114 bool PostDelayedTaskLocked(LazyNow* lazy_now,
115 const tracked_objects::Location& from_here,
116 const base::Closure& task,
117 base::TimeTicks desired_run_time,
118 TaskType task_type);
110 119
111 // Delayed task posted to the underlying run loop, which locks |lock_| and 120 // Delayed task posted to the underlying run loop, which locks |lock_| and
112 // calls MoveReadyDelayedTasksToIncomingQueueLocked to process dealyed tasks 121 // calls MoveReadyDelayedTasksToIncomingQueueLocked to process dealyed tasks
113 // that need to be run now. 122 // that need to be run now.
114 void MoveReadyDelayedTasksToIncomingQueue(); 123 void MoveReadyDelayedTasksToIncomingQueue();
115 124
116 // Enqueues any delayed tasks which should be run now on the incoming_queue_ 125 // Enqueues any delayed tasks which should be run now on the incoming_queue_
117 // and calls ScheduleDelayedWorkLocked to ensure future tasks are scheduled. 126 // and calls ScheduleDelayedWorkLocked to ensure future tasks are scheduled.
118 // Must be called with |lock_| locked. 127 // Must be called with |lock_| locked.
119 void MoveReadyDelayedTasksToIncomingQueueLocked(LazyNow* lazy_now); 128 void MoveReadyDelayedTasksToIncomingQueueLocked(LazyNow* lazy_now);
(...skipping 22 matching lines...) Expand all
142 // This lock protects all members except the work queue, the 151 // This lock protects all members except the work queue, the
143 // main_thread_checker_ and wakeup_policy_. 152 // main_thread_checker_ and wakeup_policy_.
144 mutable base::Lock lock_; 153 mutable base::Lock lock_;
145 base::PlatformThreadId thread_id_; 154 base::PlatformThreadId thread_id_;
146 TaskQueueManager* task_queue_manager_; 155 TaskQueueManager* task_queue_manager_;
147 base::TaskQueue incoming_queue_; 156 base::TaskQueue incoming_queue_;
148 TaskQueueManager::PumpPolicy pump_policy_; 157 TaskQueueManager::PumpPolicy pump_policy_;
149 const char* name_; 158 const char* name_;
150 const char* disabled_by_default_tracing_category_; 159 const char* disabled_by_default_tracing_category_;
151 const char* disabled_by_default_verbose_tracing_category_; 160 const char* disabled_by_default_verbose_tracing_category_;
161
162 // Queue-local task sequence number for maintaining the order of delayed
163 // tasks which are posted for the exact same time. Note that this will be
164 // replaced by the global sequence number when the delay has elapsed.
165 int delayed_task_sequence_number_;
152 base::DelayedTaskQueue delayed_task_queue_; 166 base::DelayedTaskQueue delayed_task_queue_;
153 std::set<base::TimeTicks> in_flight_kick_delayed_tasks_; 167 std::set<base::TimeTicks> in_flight_kick_delayed_tasks_;
154 168
155 base::ThreadChecker main_thread_checker_; 169 base::ThreadChecker main_thread_checker_;
156 base::TaskQueue work_queue_; 170 base::TaskQueue work_queue_;
157 TaskQueueManager::WakeupPolicy wakeup_policy_; 171 TaskQueueManager::WakeupPolicy wakeup_policy_;
158 172
159 DISALLOW_COPY_AND_ASSIGN(TaskQueue); 173 DISALLOW_COPY_AND_ASSIGN(TaskQueueImpl);
160 }; 174 };
161 175
162 TaskQueue::TaskQueue(TaskQueueManager* task_queue_manager, 176 TaskQueueImpl::TaskQueueImpl(
163 const char* disabled_by_default_tracing_category, 177 TaskQueueManager* task_queue_manager,
164 const char* disabled_by_default_verbose_tracing_category) 178 const char* disabled_by_default_tracing_category,
179 const char* disabled_by_default_verbose_tracing_category)
165 : thread_id_(base::PlatformThread::CurrentId()), 180 : thread_id_(base::PlatformThread::CurrentId()),
166 task_queue_manager_(task_queue_manager), 181 task_queue_manager_(task_queue_manager),
167 pump_policy_(TaskQueueManager::PumpPolicy::AUTO), 182 pump_policy_(TaskQueueManager::PumpPolicy::AUTO),
168 name_(nullptr), 183 name_(nullptr),
169 disabled_by_default_tracing_category_( 184 disabled_by_default_tracing_category_(
170 disabled_by_default_tracing_category), 185 disabled_by_default_tracing_category),
171 disabled_by_default_verbose_tracing_category_( 186 disabled_by_default_verbose_tracing_category_(
172 disabled_by_default_verbose_tracing_category), 187 disabled_by_default_verbose_tracing_category),
173 wakeup_policy_(TaskQueueManager::WakeupPolicy::CAN_WAKE_OTHER_QUEUES) { 188 delayed_task_sequence_number_(0),
174 } 189 wakeup_policy_(TaskQueueManager::WakeupPolicy::CAN_WAKE_OTHER_QUEUES) {}
175 190
176 TaskQueue::~TaskQueue() { 191 TaskQueueImpl::~TaskQueueImpl() {}
177 }
178 192
179 void TaskQueue::WillDeleteTaskQueueManager() { 193 void TaskQueueImpl::WillDeleteTaskQueueManager() {
180 base::AutoLock lock(lock_); 194 base::AutoLock lock(lock_);
181 task_queue_manager_ = nullptr; 195 task_queue_manager_ = nullptr;
182 delayed_task_queue_ = base::DelayedTaskQueue(); 196 delayed_task_queue_ = base::DelayedTaskQueue();
183 incoming_queue_ = base::TaskQueue(); 197 incoming_queue_ = base::TaskQueue();
184 work_queue_ = base::TaskQueue(); 198 work_queue_ = base::TaskQueue();
185 } 199 }
186 200
187 bool TaskQueue::RunsTasksOnCurrentThread() const { 201 bool TaskQueueImpl::RunsTasksOnCurrentThread() const {
188 base::AutoLock lock(lock_); 202 base::AutoLock lock(lock_);
189 return base::PlatformThread::CurrentId() == thread_id_; 203 return base::PlatformThread::CurrentId() == thread_id_;
190 } 204 }
191 205
192 bool TaskQueue::PostDelayedTaskImpl(const tracked_objects::Location& from_here, 206 bool TaskQueueImpl::PostDelayedTaskAt(
193 const base::Closure& task, 207 const tracked_objects::Location& from_here,
194 base::TimeDelta delay, 208 const base::Closure& task,
195 TaskType task_type) { 209 base::TimeTicks desired_run_time) {
196 base::AutoLock lock(lock_); 210 base::AutoLock lock(lock_);
197 if (!task_queue_manager_) 211 if (!task_queue_manager_)
198 return false; 212 return false;
213 LazyNow lazy_now(task_queue_manager_);
214 return PostDelayedTaskLocked(&lazy_now, from_here, task, desired_run_time,
215 TaskType::NORMAL);
216 }
217
218 bool TaskQueueImpl::PostDelayedTaskImpl(
219 const tracked_objects::Location& from_here,
220 const base::Closure& task,
221 base::TimeDelta delay,
222 TaskType task_type) {
223 base::AutoLock lock(lock_);
224 if (!task_queue_manager_)
225 return false;
226 LazyNow lazy_now(task_queue_manager_);
227 base::TimeTicks desired_run_time;
228 if (delay > base::TimeDelta())
229 desired_run_time = lazy_now.Now() + delay;
230 return PostDelayedTaskLocked(&lazy_now, from_here, task, desired_run_time,
231 task_type);
232 }
233
234 bool TaskQueueImpl::PostDelayedTaskLocked(
235 LazyNow* lazy_now,
236 const tracked_objects::Location& from_here,
237 const base::Closure& task,
238 base::TimeTicks desired_run_time,
239 TaskType task_type) {
240 lock_.AssertAcquired();
241 DCHECK(task_queue_manager_);
199 242
200 base::PendingTask pending_task(from_here, task, base::TimeTicks(), 243 base::PendingTask pending_task(from_here, task, base::TimeTicks(),
201 task_type != TaskType::NON_NESTABLE); 244 task_type != TaskType::NON_NESTABLE);
202 task_queue_manager_->DidQueueTask(pending_task); 245 task_queue_manager_->DidQueueTask(pending_task);
203 246
204 if (delay > base::TimeDelta()) { 247 if (!desired_run_time.is_null()) {
205 base::TimeTicks now = task_queue_manager_->Now(); 248 pending_task.delayed_run_time = std::max(lazy_now->Now(), desired_run_time);
206 pending_task.delayed_run_time = now + delay; 249 pending_task.sequence_num = delayed_task_sequence_number_++;
207 delayed_task_queue_.push(pending_task); 250 delayed_task_queue_.push(pending_task);
208 TraceQueueSize(true); 251 TraceQueueSize(true);
209 // If we changed the topmost task, then it is time to reschedule. 252 // If we changed the topmost task, then it is time to reschedule.
210 if (delayed_task_queue_.top().task.Equals(pending_task.task)) { 253 if (delayed_task_queue_.top().task.Equals(pending_task.task))
211 LazyNow lazy_now(now); 254 ScheduleDelayedWorkLocked(lazy_now);
212 ScheduleDelayedWorkLocked(&lazy_now);
213 }
214 return true; 255 return true;
215 } 256 }
216 EnqueueTaskLocked(pending_task); 257 EnqueueTaskLocked(pending_task);
217 return true; 258 return true;
218 } 259 }
219 260
220 void TaskQueue::MoveReadyDelayedTasksToIncomingQueue() { 261 void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueue() {
221 DCHECK(main_thread_checker_.CalledOnValidThread()); 262 DCHECK(main_thread_checker_.CalledOnValidThread());
222 base::AutoLock lock(lock_); 263 base::AutoLock lock(lock_);
223 if (!task_queue_manager_) 264 if (!task_queue_manager_)
224 return; 265 return;
225 266
226 LazyNow lazy_now(task_queue_manager_); 267 LazyNow lazy_now(task_queue_manager_);
227 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now); 268 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now);
228 } 269 }
229 270
230 void TaskQueue::MoveReadyDelayedTasksToIncomingQueueLocked(LazyNow* lazy_now) { 271 void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueueLocked(
272 LazyNow* lazy_now) {
231 lock_.AssertAcquired(); 273 lock_.AssertAcquired();
232 // Enqueue all delayed tasks that should be running now. 274 // Enqueue all delayed tasks that should be running now.
233 while (!delayed_task_queue_.empty() && 275 while (!delayed_task_queue_.empty() &&
234 delayed_task_queue_.top().delayed_run_time <= lazy_now->Now()) { 276 delayed_task_queue_.top().delayed_run_time <= lazy_now->Now()) {
235 in_flight_kick_delayed_tasks_.erase( 277 in_flight_kick_delayed_tasks_.erase(
236 delayed_task_queue_.top().delayed_run_time); 278 delayed_task_queue_.top().delayed_run_time);
237 EnqueueTaskLocked(delayed_task_queue_.top()); 279 EnqueueTaskLocked(delayed_task_queue_.top());
238 delayed_task_queue_.pop(); 280 delayed_task_queue_.pop();
239 } 281 }
240 TraceQueueSize(true); 282 TraceQueueSize(true);
241 ScheduleDelayedWorkLocked(lazy_now); 283 ScheduleDelayedWorkLocked(lazy_now);
242 } 284 }
243 285
244 void TaskQueue::ScheduleDelayedWorkLocked(LazyNow* lazy_now) { 286 void TaskQueueImpl::ScheduleDelayedWorkLocked(LazyNow* lazy_now) {
245 lock_.AssertAcquired(); 287 lock_.AssertAcquired();
246 // Any remaining tasks are in the future, so queue a task to kick them. 288 // Any remaining tasks are in the future, so queue a task to kick them.
247 if (!delayed_task_queue_.empty()) { 289 if (!delayed_task_queue_.empty()) {
248 base::TimeTicks next_run_time = delayed_task_queue_.top().delayed_run_time; 290 base::TimeTicks next_run_time = delayed_task_queue_.top().delayed_run_time;
249 DCHECK_GT(next_run_time, lazy_now->Now()); 291 DCHECK_GE(next_run_time, lazy_now->Now());
250 // Make sure we don't have more than one 292 // Make sure we don't have more than one
251 // MoveReadyDelayedTasksToIncomingQueue posted for a particular scheduled 293 // MoveReadyDelayedTasksToIncomingQueue posted for a particular scheduled
252 // run time (note it's fine to have multiple ones in flight for distinct 294 // run time (note it's fine to have multiple ones in flight for distinct
253 // run times). 295 // run times).
254 if (in_flight_kick_delayed_tasks_.find(next_run_time) == 296 if (in_flight_kick_delayed_tasks_.find(next_run_time) ==
255 in_flight_kick_delayed_tasks_.end()) { 297 in_flight_kick_delayed_tasks_.end()) {
256 in_flight_kick_delayed_tasks_.insert(next_run_time); 298 in_flight_kick_delayed_tasks_.insert(next_run_time);
257 base::TimeDelta delay = next_run_time - lazy_now->Now(); 299 base::TimeDelta delay = next_run_time - lazy_now->Now();
258 task_queue_manager_->PostDelayedTask( 300 task_queue_manager_->PostDelayedTask(
259 FROM_HERE, 301 FROM_HERE,
260 Bind(&TaskQueue::MoveReadyDelayedTasksToIncomingQueue, this), delay); 302 Bind(&TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueue, this),
303 delay);
261 } 304 }
262 } 305 }
263 } 306 }
264 307
265 TaskQueueManager::QueueState TaskQueue::GetQueueState() const { 308 TaskQueueManager::QueueState TaskQueueImpl::GetQueueState() const {
266 DCHECK(main_thread_checker_.CalledOnValidThread()); 309 DCHECK(main_thread_checker_.CalledOnValidThread());
267 if (!work_queue_.empty()) 310 if (!work_queue_.empty())
268 return TaskQueueManager::QueueState::HAS_WORK; 311 return TaskQueueManager::QueueState::HAS_WORK;
269 312
270 { 313 {
271 base::AutoLock lock(lock_); 314 base::AutoLock lock(lock_);
272 if (incoming_queue_.empty()) { 315 if (incoming_queue_.empty()) {
273 return TaskQueueManager::QueueState::EMPTY; 316 return TaskQueueManager::QueueState::EMPTY;
274 } else { 317 } else {
275 return TaskQueueManager::QueueState::NEEDS_PUMPING; 318 return TaskQueueManager::QueueState::NEEDS_PUMPING;
276 } 319 }
277 } 320 }
278 } 321 }
279 322
280 bool TaskQueue::TaskIsOlderThanQueuedTasks(const base::PendingTask* task) { 323 bool TaskQueueImpl::TaskIsOlderThanQueuedTasks(const base::PendingTask* task) {
281 lock_.AssertAcquired(); 324 lock_.AssertAcquired();
282 // A null task is passed when UpdateQueue is called before any task is run. 325 // A null task is passed when UpdateQueue is called before any task is run.
283 // In this case we don't want to pump an after_wakeup queue, so return true 326 // In this case we don't want to pump an after_wakeup queue, so return true
284 // here. 327 // here.
285 if (!task) 328 if (!task)
286 return true; 329 return true;
287 330
288 // Return false if there are no task in the incoming queue. 331 // Return false if there are no task in the incoming queue.
289 if (incoming_queue_.empty()) 332 if (incoming_queue_.empty())
290 return false; 333 return false;
291 334
292 base::PendingTask oldest_queued_task = incoming_queue_.front(); 335 base::PendingTask oldest_queued_task = incoming_queue_.front();
293 DCHECK(oldest_queued_task.delayed_run_time.is_null()); 336 DCHECK(oldest_queued_task.delayed_run_time.is_null());
294 DCHECK(task->delayed_run_time.is_null()); 337 DCHECK(task->delayed_run_time.is_null());
295 338
296 // Note: the comparison is correct due to the fact that the PendingTask 339 // Note: the comparison is correct due to the fact that the PendingTask
297 // operator inverts its comparison operation in order to work well in a heap 340 // operator inverts its comparison operation in order to work well in a heap
298 // based priority queue. 341 // based priority queue.
299 return oldest_queued_task < *task; 342 return oldest_queued_task < *task;
300 } 343 }
301 344
302 bool TaskQueue::ShouldAutoPumpQueueLocked( 345 bool TaskQueueImpl::ShouldAutoPumpQueueLocked(
303 bool should_trigger_wakeup, 346 bool should_trigger_wakeup,
304 const base::PendingTask* previous_task) { 347 const base::PendingTask* previous_task) {
305 lock_.AssertAcquired(); 348 lock_.AssertAcquired();
306 if (pump_policy_ == TaskQueueManager::PumpPolicy::MANUAL) 349 if (pump_policy_ == TaskQueueManager::PumpPolicy::MANUAL)
307 return false; 350 return false;
308 if (pump_policy_ == TaskQueueManager::PumpPolicy::AFTER_WAKEUP && 351 if (pump_policy_ == TaskQueueManager::PumpPolicy::AFTER_WAKEUP &&
309 (!should_trigger_wakeup || TaskIsOlderThanQueuedTasks(previous_task))) 352 (!should_trigger_wakeup || TaskIsOlderThanQueuedTasks(previous_task)))
310 return false; 353 return false;
311 if (incoming_queue_.empty()) 354 if (incoming_queue_.empty())
312 return false; 355 return false;
313 return true; 356 return true;
314 } 357 }
315 358
316 bool TaskQueue::NextPendingDelayedTaskRunTime( 359 bool TaskQueueImpl::NextPendingDelayedTaskRunTime(
317 base::TimeTicks* next_pending_delayed_task) { 360 base::TimeTicks* next_pending_delayed_task) {
318 base::AutoLock lock(lock_); 361 base::AutoLock lock(lock_);
319 if (delayed_task_queue_.empty()) 362 if (delayed_task_queue_.empty())
320 return false; 363 return false;
321 *next_pending_delayed_task = delayed_task_queue_.top().delayed_run_time; 364 *next_pending_delayed_task = delayed_task_queue_.top().delayed_run_time;
322 return true; 365 return true;
323 } 366 }
324 367
325 bool TaskQueue::UpdateWorkQueue(LazyNow* lazy_now, 368 bool TaskQueueImpl::UpdateWorkQueue(LazyNow* lazy_now,
326 bool should_trigger_wakeup, 369 bool should_trigger_wakeup,
327 const base::PendingTask* previous_task) { 370 const base::PendingTask* previous_task) {
328 if (!work_queue_.empty()) 371 if (!work_queue_.empty())
329 return true; 372 return true;
330 373
331 { 374 {
332 base::AutoLock lock(lock_); 375 base::AutoLock lock(lock_);
333 if (!ShouldAutoPumpQueueLocked(should_trigger_wakeup, previous_task)) 376 if (!ShouldAutoPumpQueueLocked(should_trigger_wakeup, previous_task))
334 return false; 377 return false;
335 MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now); 378 MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now);
336 work_queue_.Swap(&incoming_queue_); 379 work_queue_.Swap(&incoming_queue_);
337 TraceQueueSize(true); 380 TraceQueueSize(true);
338 return true; 381 return true;
339 } 382 }
340 } 383 }
341 384
342 base::PendingTask TaskQueue::TakeTaskFromWorkQueue() { 385 base::PendingTask TaskQueueImpl::TakeTaskFromWorkQueue() {
343 base::PendingTask pending_task = work_queue_.front(); 386 base::PendingTask pending_task = work_queue_.front();
344 work_queue_.pop(); 387 work_queue_.pop();
345 TraceQueueSize(false); 388 TraceQueueSize(false);
346 return pending_task; 389 return pending_task;
347 } 390 }
348 391
349 void TaskQueue::TraceQueueSize(bool is_locked) const { 392 void TaskQueueImpl::TraceQueueSize(bool is_locked) const {
350 bool is_tracing; 393 bool is_tracing;
351 TRACE_EVENT_CATEGORY_GROUP_ENABLED(disabled_by_default_tracing_category_, 394 TRACE_EVENT_CATEGORY_GROUP_ENABLED(disabled_by_default_tracing_category_,
352 &is_tracing); 395 &is_tracing);
353 if (!is_tracing || !name_) 396 if (!is_tracing || !name_)
354 return; 397 return;
355 if (!is_locked) 398 if (!is_locked)
356 lock_.Acquire(); 399 lock_.Acquire();
357 else 400 else
358 lock_.AssertAcquired(); 401 lock_.AssertAcquired();
359 TRACE_COUNTER1( 402 TRACE_COUNTER1(
360 disabled_by_default_tracing_category_, name_, 403 disabled_by_default_tracing_category_, name_,
361 incoming_queue_.size() + work_queue_.size() + delayed_task_queue_.size()); 404 incoming_queue_.size() + work_queue_.size() + delayed_task_queue_.size());
362 if (!is_locked) 405 if (!is_locked)
363 lock_.Release(); 406 lock_.Release();
364 } 407 }
365 408
366 void TaskQueue::EnqueueTaskLocked(const base::PendingTask& pending_task) { 409 void TaskQueueImpl::EnqueueTaskLocked(const base::PendingTask& pending_task) {
367 lock_.AssertAcquired(); 410 lock_.AssertAcquired();
368 if (!task_queue_manager_) 411 if (!task_queue_manager_)
369 return; 412 return;
370 if (pump_policy_ == TaskQueueManager::PumpPolicy::AUTO && 413 if (pump_policy_ == TaskQueueManager::PumpPolicy::AUTO &&
371 incoming_queue_.empty()) 414 incoming_queue_.empty())
372 task_queue_manager_->MaybePostDoWorkOnMainRunner(); 415 task_queue_manager_->MaybePostDoWorkOnMainRunner();
373 incoming_queue_.push(pending_task); 416 incoming_queue_.push(pending_task);
374 incoming_queue_.back().sequence_num = 417 incoming_queue_.back().sequence_num =
375 task_queue_manager_->GetNextSequenceNumber(); 418 task_queue_manager_->GetNextSequenceNumber();
376 419
377 if (!pending_task.delayed_run_time.is_null()) { 420 if (!pending_task.delayed_run_time.is_null()) {
378 // Clear the delayed run time because we've already applied the delay 421 // Clear the delayed run time because we've already applied the delay
379 // before getting here. 422 // before getting here.
380 incoming_queue_.back().delayed_run_time = base::TimeTicks(); 423 incoming_queue_.back().delayed_run_time = base::TimeTicks();
381 } 424 }
382 TraceQueueSize(true); 425 TraceQueueSize(true);
383 } 426 }
384 427
385 void TaskQueue::SetPumpPolicy(TaskQueueManager::PumpPolicy pump_policy) { 428 void TaskQueueImpl::SetPumpPolicy(TaskQueueManager::PumpPolicy pump_policy) {
386 base::AutoLock lock(lock_); 429 base::AutoLock lock(lock_);
387 if (pump_policy == TaskQueueManager::PumpPolicy::AUTO && 430 if (pump_policy == TaskQueueManager::PumpPolicy::AUTO &&
388 pump_policy_ != TaskQueueManager::PumpPolicy::AUTO) { 431 pump_policy_ != TaskQueueManager::PumpPolicy::AUTO) {
389 PumpQueueLocked(); 432 PumpQueueLocked();
390 } 433 }
391 pump_policy_ = pump_policy; 434 pump_policy_ = pump_policy;
392 } 435 }
393 436
394 void TaskQueue::PumpQueueLocked() { 437 void TaskQueueImpl::PumpQueueLocked() {
395 lock_.AssertAcquired(); 438 lock_.AssertAcquired();
396 if (task_queue_manager_) { 439 if (task_queue_manager_) {
397 LazyNow lazy_now(task_queue_manager_); 440 LazyNow lazy_now(task_queue_manager_);
398 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now); 441 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now);
399 } 442 }
400 while (!incoming_queue_.empty()) { 443 while (!incoming_queue_.empty()) {
401 work_queue_.push(incoming_queue_.front()); 444 work_queue_.push(incoming_queue_.front());
402 incoming_queue_.pop(); 445 incoming_queue_.pop();
403 } 446 }
404 if (!work_queue_.empty()) 447 if (!work_queue_.empty())
405 task_queue_manager_->MaybePostDoWorkOnMainRunner(); 448 task_queue_manager_->MaybePostDoWorkOnMainRunner();
406 } 449 }
407 450
408 void TaskQueue::PumpQueue() { 451 void TaskQueueImpl::PumpQueue() {
409 base::AutoLock lock(lock_); 452 base::AutoLock lock(lock_);
410 PumpQueueLocked(); 453 PumpQueueLocked();
411 } 454 }
412 455
413 void TaskQueue::AsValueInto(base::trace_event::TracedValue* state) const { 456 void TaskQueueImpl::AsValueInto(base::trace_event::TracedValue* state) const {
414 base::AutoLock lock(lock_); 457 base::AutoLock lock(lock_);
415 state->BeginDictionary(); 458 state->BeginDictionary();
416 if (name_) 459 if (name_)
417 state->SetString("name", name_); 460 state->SetString("name", name_);
418 state->SetString("pump_policy", 461 state->SetString("pump_policy",
419 TaskQueueManager::PumpPolicyToString(pump_policy_)); 462 TaskQueueManager::PumpPolicyToString(pump_policy_));
420 state->SetString("wakeup_policy", 463 state->SetString("wakeup_policy",
421 TaskQueueManager::WakeupPolicyToString(wakeup_policy_)); 464 TaskQueueManager::WakeupPolicyToString(wakeup_policy_));
422 bool verbose_tracing_enabled = false; 465 bool verbose_tracing_enabled = false;
423 TRACE_EVENT_CATEGORY_GROUP_ENABLED( 466 TRACE_EVENT_CATEGORY_GROUP_ENABLED(
424 disabled_by_default_verbose_tracing_category_, &verbose_tracing_enabled); 467 disabled_by_default_verbose_tracing_category_, &verbose_tracing_enabled);
425 state->SetInteger("incoming_queue_size", incoming_queue_.size()); 468 state->SetInteger("incoming_queue_size", incoming_queue_.size());
426 state->SetInteger("work_queue_size", work_queue_.size()); 469 state->SetInteger("work_queue_size", work_queue_.size());
427 state->SetInteger("delayed_task_queue_size", delayed_task_queue_.size()); 470 state->SetInteger("delayed_task_queue_size", delayed_task_queue_.size());
428 if (verbose_tracing_enabled) { 471 if (verbose_tracing_enabled) {
429 state->BeginArray("incoming_queue"); 472 state->BeginArray("incoming_queue");
430 QueueAsValueInto(incoming_queue_, state); 473 QueueAsValueInto(incoming_queue_, state);
431 state->EndArray(); 474 state->EndArray();
432 state->BeginArray("work_queue"); 475 state->BeginArray("work_queue");
433 QueueAsValueInto(work_queue_, state); 476 QueueAsValueInto(work_queue_, state);
434 state->EndArray(); 477 state->EndArray();
435 state->BeginArray("delayed_task_queue"); 478 state->BeginArray("delayed_task_queue");
436 QueueAsValueInto(delayed_task_queue_, state); 479 QueueAsValueInto(delayed_task_queue_, state);
437 state->EndArray(); 480 state->EndArray();
438 } 481 }
439 state->EndDictionary(); 482 state->EndDictionary();
440 } 483 }
441 484
442 // static 485 // static
443 void TaskQueue::QueueAsValueInto(const base::TaskQueue& queue, 486 void TaskQueueImpl::QueueAsValueInto(const base::TaskQueue& queue,
444 base::trace_event::TracedValue* state) { 487 base::trace_event::TracedValue* state) {
445 base::TaskQueue queue_copy(queue); 488 base::TaskQueue queue_copy(queue);
446 while (!queue_copy.empty()) { 489 while (!queue_copy.empty()) {
447 TaskAsValueInto(queue_copy.front(), state); 490 TaskAsValueInto(queue_copy.front(), state);
448 queue_copy.pop(); 491 queue_copy.pop();
449 } 492 }
450 } 493 }
451 494
452 // static 495 // static
453 void TaskQueue::QueueAsValueInto(const base::DelayedTaskQueue& queue, 496 void TaskQueueImpl::QueueAsValueInto(const base::DelayedTaskQueue& queue,
454 base::trace_event::TracedValue* state) { 497 base::trace_event::TracedValue* state) {
455 base::DelayedTaskQueue queue_copy(queue); 498 base::DelayedTaskQueue queue_copy(queue);
456 while (!queue_copy.empty()) { 499 while (!queue_copy.empty()) {
457 TaskAsValueInto(queue_copy.top(), state); 500 TaskAsValueInto(queue_copy.top(), state);
458 queue_copy.pop(); 501 queue_copy.pop();
459 } 502 }
460 } 503 }
461 504
462 // static 505 // static
463 void TaskQueue::TaskAsValueInto(const base::PendingTask& task, 506 void TaskQueueImpl::TaskAsValueInto(const base::PendingTask& task,
464 base::trace_event::TracedValue* state) { 507 base::trace_event::TracedValue* state) {
465 state->BeginDictionary(); 508 state->BeginDictionary();
466 state->SetString("posted_from", task.posted_from.ToString()); 509 state->SetString("posted_from", task.posted_from.ToString());
467 state->SetInteger("sequence_num", task.sequence_num); 510 state->SetInteger("sequence_num", task.sequence_num);
468 state->SetBoolean("nestable", task.nestable); 511 state->SetBoolean("nestable", task.nestable);
469 state->SetBoolean("is_high_res", task.is_high_res); 512 state->SetBoolean("is_high_res", task.is_high_res);
470 state->SetDouble( 513 state->SetDouble(
471 "delayed_run_time", 514 "delayed_run_time",
472 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); 515 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L);
473 state->EndDictionary(); 516 state->EndDictionary();
474 } 517 }
(...skipping 16 matching lines...) Expand all
491 disabled_by_default_tracing_category), 534 disabled_by_default_tracing_category),
492 deletion_sentinel_(new DeletionSentinel()), 535 deletion_sentinel_(new DeletionSentinel()),
493 weak_factory_(this) { 536 weak_factory_(this) {
494 DCHECK(main_task_runner->RunsTasksOnCurrentThread()); 537 DCHECK(main_task_runner->RunsTasksOnCurrentThread());
495 DCHECK_LE(task_queue_count, sizeof(task_was_run_bitmap_) * CHAR_BIT) 538 DCHECK_LE(task_queue_count, sizeof(task_was_run_bitmap_) * CHAR_BIT)
496 << "You need a bigger int for task_was_run_bitmap_"; 539 << "You need a bigger int for task_was_run_bitmap_";
497 TRACE_EVENT_OBJECT_CREATED_WITH_ID(disabled_by_default_tracing_category, 540 TRACE_EVENT_OBJECT_CREATED_WITH_ID(disabled_by_default_tracing_category,
498 "TaskQueueManager", this); 541 "TaskQueueManager", this);
499 542
500 for (size_t i = 0; i < task_queue_count; i++) { 543 for (size_t i = 0; i < task_queue_count; i++) {
501 scoped_refptr<internal::TaskQueue> queue(make_scoped_refptr( 544 scoped_refptr<internal::TaskQueueImpl> queue(
502 new internal::TaskQueue(this, 545 make_scoped_refptr(new internal::TaskQueueImpl(
503 disabled_by_default_tracing_category, 546 this, disabled_by_default_tracing_category,
504 disabled_by_default_verbose_tracing_category))); 547 disabled_by_default_verbose_tracing_category)));
505 queues_.push_back(queue); 548 queues_.push_back(queue);
506 } 549 }
507 550
508 std::vector<const base::TaskQueue*> work_queues; 551 std::vector<const base::TaskQueue*> work_queues;
509 for (const auto& queue : queues_) 552 for (const auto& queue : queues_)
510 work_queues.push_back(&queue->work_queue()); 553 work_queues.push_back(&queue->work_queue());
511 selector_->RegisterWorkQueues(work_queues); 554 selector_->RegisterWorkQueues(work_queues);
512 selector_->SetTaskQueueSelectorObserver(this); 555 selector_->SetTaskQueueSelectorObserver(this);
513 556
514 do_work_from_main_thread_closure_ = 557 do_work_from_main_thread_closure_ =
515 base::Bind(&TaskQueueManager::DoWork, weak_factory_.GetWeakPtr(), true); 558 base::Bind(&TaskQueueManager::DoWork, weak_factory_.GetWeakPtr(), true);
516 do_work_from_other_thread_closure_ = 559 do_work_from_other_thread_closure_ =
517 base::Bind(&TaskQueueManager::DoWork, weak_factory_.GetWeakPtr(), false); 560 base::Bind(&TaskQueueManager::DoWork, weak_factory_.GetWeakPtr(), false);
518 } 561 }
519 562
520 TaskQueueManager::~TaskQueueManager() { 563 TaskQueueManager::~TaskQueueManager() {
521 TRACE_EVENT_OBJECT_DELETED_WITH_ID(disabled_by_default_tracing_category_, 564 TRACE_EVENT_OBJECT_DELETED_WITH_ID(disabled_by_default_tracing_category_,
522 "TaskQueueManager", this); 565 "TaskQueueManager", this);
523 for (auto& queue : queues_) 566 for (auto& queue : queues_)
524 queue->WillDeleteTaskQueueManager(); 567 queue->WillDeleteTaskQueueManager();
525 selector_->SetTaskQueueSelectorObserver(nullptr); 568 selector_->SetTaskQueueSelectorObserver(nullptr);
526 } 569 }
527 570
528 internal::TaskQueue* TaskQueueManager::Queue(size_t queue_index) const { 571 internal::TaskQueueImpl* TaskQueueManager::Queue(size_t queue_index) const {
529 DCHECK_LT(queue_index, queues_.size()); 572 DCHECK_LT(queue_index, queues_.size());
530 return queues_[queue_index].get(); 573 return queues_[queue_index].get();
531 } 574 }
532 575
533 scoped_refptr<base::SingleThreadTaskRunner> 576 scoped_refptr<TaskQueue> TaskQueueManager::TaskRunnerForQueue(
534 TaskQueueManager::TaskRunnerForQueue(size_t queue_index) const { 577 size_t queue_index) const {
535 return Queue(queue_index); 578 return Queue(queue_index);
536 } 579 }
537 580
538 bool TaskQueueManager::IsQueueEmpty(size_t queue_index) const { 581 bool TaskQueueManager::IsQueueEmpty(size_t queue_index) const {
539 return Queue(queue_index)->GetQueueState() == QueueState::EMPTY; 582 return Queue(queue_index)->GetQueueState() == QueueState::EMPTY;
540 } 583 }
541 584
542 TaskQueueManager::QueueState TaskQueueManager::GetQueueState(size_t queue_index) 585 TaskQueueManager::QueueState TaskQueueManager::GetQueueState(size_t queue_index)
543 const { 586 const {
544 return Queue(queue_index)->GetQueueState(); 587 return Queue(queue_index)->GetQueueState();
(...skipping 18 matching lines...) Expand all
563 return base::TimeTicks(); 606 return base::TimeTicks();
564 607
565 DCHECK_NE(next_pending_delayed_task, 608 DCHECK_NE(next_pending_delayed_task,
566 base::TimeTicks::FromInternalValue(kMaxTimeTicks)); 609 base::TimeTicks::FromInternalValue(kMaxTimeTicks));
567 return next_pending_delayed_task; 610 return next_pending_delayed_task;
568 } 611 }
569 612
570 void TaskQueueManager::SetPumpPolicy(size_t queue_index, 613 void TaskQueueManager::SetPumpPolicy(size_t queue_index,
571 PumpPolicy pump_policy) { 614 PumpPolicy pump_policy) {
572 DCHECK(main_thread_checker_.CalledOnValidThread()); 615 DCHECK(main_thread_checker_.CalledOnValidThread());
573 internal::TaskQueue* queue = Queue(queue_index); 616 internal::TaskQueueImpl* queue = Queue(queue_index);
574 queue->SetPumpPolicy(pump_policy); 617 queue->SetPumpPolicy(pump_policy);
575 } 618 }
576 619
577 void TaskQueueManager::SetWakeupPolicy(size_t queue_index, 620 void TaskQueueManager::SetWakeupPolicy(size_t queue_index,
578 WakeupPolicy wakeup_policy) { 621 WakeupPolicy wakeup_policy) {
579 DCHECK(main_thread_checker_.CalledOnValidThread()); 622 DCHECK(main_thread_checker_.CalledOnValidThread());
580 internal::TaskQueue* queue = Queue(queue_index); 623 internal::TaskQueueImpl* queue = Queue(queue_index);
581 queue->set_wakeup_policy(wakeup_policy); 624 queue->set_wakeup_policy(wakeup_policy);
582 } 625 }
583 626
584 void TaskQueueManager::PumpQueue(size_t queue_index) { 627 void TaskQueueManager::PumpQueue(size_t queue_index) {
585 DCHECK(main_thread_checker_.CalledOnValidThread()); 628 DCHECK(main_thread_checker_.CalledOnValidThread());
586 internal::TaskQueue* queue = Queue(queue_index); 629 internal::TaskQueueImpl* queue = Queue(queue_index);
587 queue->PumpQueue(); 630 queue->PumpQueue();
588 } 631 }
589 632
590 bool TaskQueueManager::UpdateWorkQueues( 633 bool TaskQueueManager::UpdateWorkQueues(
591 bool should_trigger_wakeup, 634 bool should_trigger_wakeup,
592 const base::PendingTask* previous_task) { 635 const base::PendingTask* previous_task) {
593 // TODO(skyostil): This is not efficient when the number of queues grows very 636 // TODO(skyostil): This is not efficient when the number of queues grows very
594 // large due to the number of locks taken. Consider optimizing when we get 637 // large due to the number of locks taken. Consider optimizing when we get
595 // there. 638 // there.
596 DCHECK(main_thread_checker_.CalledOnValidThread()); 639 DCHECK(main_thread_checker_.CalledOnValidThread());
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 void TaskQueueManager::DidQueueTask(const base::PendingTask& pending_task) { 709 void TaskQueueManager::DidQueueTask(const base::PendingTask& pending_task) {
667 task_annotator_.DidQueueTask("TaskQueueManager::PostTask", pending_task); 710 task_annotator_.DidQueueTask("TaskQueueManager::PostTask", pending_task);
668 } 711 }
669 712
670 bool TaskQueueManager::ProcessTaskFromWorkQueue( 713 bool TaskQueueManager::ProcessTaskFromWorkQueue(
671 size_t queue_index, 714 size_t queue_index,
672 bool has_previous_task, 715 bool has_previous_task,
673 base::PendingTask* previous_task) { 716 base::PendingTask* previous_task) {
674 DCHECK(main_thread_checker_.CalledOnValidThread()); 717 DCHECK(main_thread_checker_.CalledOnValidThread());
675 scoped_refptr<DeletionSentinel> protect(deletion_sentinel_); 718 scoped_refptr<DeletionSentinel> protect(deletion_sentinel_);
676 internal::TaskQueue* queue = Queue(queue_index); 719 internal::TaskQueueImpl* queue = Queue(queue_index);
677 base::PendingTask pending_task = queue->TakeTaskFromWorkQueue(); 720 base::PendingTask pending_task = queue->TakeTaskFromWorkQueue();
678 task_was_run_bitmap_ |= UINT64_C(1) << queue_index; 721 task_was_run_bitmap_ |= UINT64_C(1) << queue_index;
679 if (!pending_task.nestable && main_task_runner_->IsNested()) { 722 if (!pending_task.nestable && main_task_runner_->IsNested()) {
680 // Defer non-nestable work to the main task runner. NOTE these tasks can be 723 // Defer non-nestable work to the main task runner. NOTE these tasks can be
681 // arbitrarily delayed so the additional delay should not be a problem. 724 // arbitrarily delayed so the additional delay should not be a problem.
682 main_task_runner_->PostNonNestableTask(pending_task.posted_from, 725 main_task_runner_->PostNonNestableTask(pending_task.posted_from,
683 pending_task.task); 726 pending_task.task);
684 } else { 727 } else {
685 // Suppress "will" task observer notifications for the first and "did" 728 // Suppress "will" task observer notifications for the first and "did"
686 // notifications for the last task in the batch to avoid duplicate 729 // notifications for the last task in the batch to avoid duplicate
(...skipping 19 matching lines...) Expand all
706 } 749 }
707 750
708 bool TaskQueueManager::RunsTasksOnCurrentThread() const { 751 bool TaskQueueManager::RunsTasksOnCurrentThread() const {
709 return main_task_runner_->RunsTasksOnCurrentThread(); 752 return main_task_runner_->RunsTasksOnCurrentThread();
710 } 753 }
711 754
712 bool TaskQueueManager::PostDelayedTask( 755 bool TaskQueueManager::PostDelayedTask(
713 const tracked_objects::Location& from_here, 756 const tracked_objects::Location& from_here,
714 const base::Closure& task, 757 const base::Closure& task,
715 base::TimeDelta delay) { 758 base::TimeDelta delay) {
716 DCHECK(delay > base::TimeDelta()); 759 DCHECK_GE(delay, base::TimeDelta());
717 return main_task_runner_->PostDelayedTask(from_here, task, delay); 760 return main_task_runner_->PostDelayedTask(from_here, task, delay);
718 } 761 }
719 762
720 void TaskQueueManager::SetQueueName(size_t queue_index, const char* name) { 763 void TaskQueueManager::SetQueueName(size_t queue_index, const char* name) {
721 DCHECK(main_thread_checker_.CalledOnValidThread()); 764 DCHECK(main_thread_checker_.CalledOnValidThread());
722 internal::TaskQueue* queue = Queue(queue_index); 765 internal::TaskQueueImpl* queue = Queue(queue_index);
723 queue->set_name(name); 766 queue->set_name(name);
724 } 767 }
725 768
726 void TaskQueueManager::SetWorkBatchSize(int work_batch_size) { 769 void TaskQueueManager::SetWorkBatchSize(int work_batch_size) {
727 DCHECK(main_thread_checker_.CalledOnValidThread()); 770 DCHECK(main_thread_checker_.CalledOnValidThread());
728 DCHECK_GE(work_batch_size, 1); 771 DCHECK_GE(work_batch_size, 1);
729 work_batch_size_ = work_batch_size; 772 work_batch_size_ = work_batch_size;
730 } 773 }
731 774
732 void TaskQueueManager::AddTaskObserver( 775 void TaskQueueManager::AddTaskObserver(
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 return nullptr; 853 return nullptr;
811 } 854 }
812 } 855 }
813 856
814 void TaskQueueManager::OnTaskQueueEnabled() { 857 void TaskQueueManager::OnTaskQueueEnabled() {
815 DCHECK(main_thread_checker_.CalledOnValidThread()); 858 DCHECK(main_thread_checker_.CalledOnValidThread());
816 MaybePostDoWorkOnMainRunner(); 859 MaybePostDoWorkOnMainRunner();
817 } 860 }
818 861
819 } // namespace scheduler 862 } // namespace scheduler
OLDNEW
« no previous file with comments | « components/scheduler/child/task_queue_manager.h ('k') | components/scheduler/child/task_queue_manager_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698