Chromium Code Reviews| Index: content/renderer/scheduler/task_queue_manager.cc |
| diff --git a/content/renderer/scheduler/task_queue_manager.cc b/content/renderer/scheduler/task_queue_manager.cc |
| index 0b460d4bad831870d8d50a02151e0e6ba7cbd441..71f350e026307b1313648d47fb1e8fa882f8225c 100644 |
| --- a/content/renderer/scheduler/task_queue_manager.cc |
| +++ b/content/renderer/scheduler/task_queue_manager.cc |
| @@ -42,6 +42,8 @@ class TaskQueue : public base::SingleThreadTaskRunner { |
| void SetPumpPolicy(TaskQueueManager::PumpPolicy pump_policy); |
| void PumpQueue(); |
| + void GetNextPendingDelayedTask(base::TimeTicks* next_pending_delayed_task); |
| + |
| bool UpdateWorkQueue(base::TimeTicks* next_pending_delayed_task, |
| const base::PendingTask* previous_task); |
| base::PendingTask TakeTaskFromWorkQueue(); |
| @@ -76,6 +78,8 @@ class TaskQueue : public base::SingleThreadTaskRunner { |
| bool TaskIsOlderThanQueuedTasks(const base::PendingTask* task); |
| bool ShouldAutoPumpQueueLocked(const base::PendingTask* previous_task); |
| void EnqueueTaskLocked(const base::PendingTask& pending_task); |
| + void GetNextPendingDelayedTaskLocked( |
| + base::TimeTicks* next_pending_delayed_task); |
| void TraceQueueSize(bool is_locked) const; |
| static const char* PumpPolicyToString( |
| @@ -186,6 +190,21 @@ bool TaskQueue::ShouldAutoPumpQueueLocked( |
| return true; |
| } |
| +void TaskQueue::GetNextPendingDelayedTask( |
| + base::TimeTicks* next_pending_delayed_task) { |
| + base::AutoLock lock(lock_); |
| + GetNextPendingDelayedTaskLocked(next_pending_delayed_task); |
| +} |
| + |
| +void TaskQueue::GetNextPendingDelayedTaskLocked( |
|
picksi
2015/03/04 10:43:23
Can this deal better with the delayed_task_run_tim
rmcilroy
2015/03/04 14:23:12
Done.
|
| + base::TimeTicks* next_pending_delayed_task) { |
| + lock_.AssertAcquired(); |
| + if (!delayed_task_run_times_.empty()) { |
| + *next_pending_delayed_task = |
| + std::min(*next_pending_delayed_task, delayed_task_run_times_.top()); |
| + } |
| +} |
| + |
| bool TaskQueue::UpdateWorkQueue( |
| base::TimeTicks* next_pending_delayed_task, |
| const base::PendingTask* previous_task) { |
| @@ -194,10 +213,7 @@ bool TaskQueue::UpdateWorkQueue( |
| { |
| base::AutoLock lock(lock_); |
| - if (!delayed_task_run_times_.empty()) { |
| - *next_pending_delayed_task = |
| - std::min(*next_pending_delayed_task, delayed_task_run_times_.top()); |
| - } |
| + GetNextPendingDelayedTaskLocked(next_pending_delayed_task); |
| if (!ShouldAutoPumpQueueLocked(previous_task)) |
| return false; |
| work_queue_.Swap(&incoming_queue_); |
| @@ -388,6 +404,21 @@ bool TaskQueueManager::IsQueueEmpty(size_t queue_index) const { |
| return queue->IsQueueEmpty(); |
| } |
| +base::TimeTicks TaskQueueManager::NextPendingDelayedTask() { |
| + DCHECK(main_thread_checker_.CalledOnValidThread()); |
| + base::TimeTicks next_pending_delayed_task( |
| + base::TimeTicks::FromInternalValue(kMaxTimeTicks)); |
| + for (auto& queue : queues_) { |
| + queue->GetNextPendingDelayedTask(&next_pending_delayed_task); |
| + } |
| + |
| + if (next_pending_delayed_task == |
|
picksi
2015/03/04 10:43:22
If I understand the code, this check for unchanged
rmcilroy
2015/03/04 14:23:12
Done (although we don't really need to worry about
picksi
2015/03/04 16:29:05
I suppose the heat death of the universe will be a
|
| + base::TimeTicks::FromInternalValue(kMaxTimeTicks)) |
| + return base::TimeTicks(); |
| + |
| + return next_pending_delayed_task; |
| +} |
| + |
| void TaskQueueManager::SetPumpPolicy(size_t queue_index, |
| PumpPolicy pump_policy) { |
| DCHECK(main_thread_checker_.CalledOnValidThread()); |