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 0b88d5a2f3791534dc5ac0c0f3a36014d1bbb9a5..68dd8f80f2d4433b841efd686acdfc24d52b130a 100644 |
--- a/content/renderer/scheduler/task_queue_manager.cc |
+++ b/content/renderer/scheduler/task_queue_manager.cc |
@@ -42,6 +42,9 @@ class TaskQueue : public base::SingleThreadTaskRunner { |
void SetPumpPolicy(TaskQueueManager::PumpPolicy pump_policy); |
void PumpQueue(); |
+ bool NextPendingDelayedTaskRunTime( |
+ base::TimeTicks* next_pending_delayed_task); |
+ |
bool UpdateWorkQueue(base::TimeTicks* next_pending_delayed_task, |
const base::PendingTask* previous_task); |
base::PendingTask TakeTaskFromWorkQueue(); |
@@ -76,6 +79,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); |
+ bool NextPendingDelayedTaskRunTimeLocked( |
+ base::TimeTicks* next_pending_delayed_task); |
void TraceQueueSize(bool is_locked) const; |
static const char* PumpPolicyToString( |
@@ -188,6 +193,23 @@ bool TaskQueue::ShouldAutoPumpQueueLocked( |
return true; |
} |
+bool TaskQueue::NextPendingDelayedTaskRunTime( |
+ base::TimeTicks* next_pending_delayed_task) { |
+ base::AutoLock lock(lock_); |
+ return NextPendingDelayedTaskRunTimeLocked(next_pending_delayed_task); |
+} |
+ |
+bool TaskQueue::NextPendingDelayedTaskRunTimeLocked( |
+ 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()); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
bool TaskQueue::UpdateWorkQueue( |
base::TimeTicks* next_pending_delayed_task, |
const base::PendingTask* previous_task) { |
@@ -196,10 +218,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()); |
- } |
+ NextPendingDelayedTaskRunTimeLocked(next_pending_delayed_task); |
if (!ShouldAutoPumpQueueLocked(previous_task)) |
return false; |
work_queue_.Swap(&incoming_queue_); |
@@ -390,6 +409,24 @@ bool TaskQueueManager::IsQueueEmpty(size_t queue_index) const { |
return queue->IsQueueEmpty(); |
} |
+base::TimeTicks TaskQueueManager::NextPendingDelayedTaskRunTime() { |
+ DCHECK(main_thread_checker_.CalledOnValidThread()); |
+ bool found_pending_task = false; |
+ base::TimeTicks next_pending_delayed_task( |
+ base::TimeTicks::FromInternalValue(kMaxTimeTicks)); |
+ for (auto& queue : queues_) { |
+ found_pending_task |= |
+ queue->NextPendingDelayedTaskRunTime(&next_pending_delayed_task); |
+ } |
+ |
+ if (!found_pending_task) |
+ return base::TimeTicks(); |
+ |
+ DCHECK_NE(next_pending_delayed_task, |
+ base::TimeTicks::FromInternalValue(kMaxTimeTicks)); |
+ return next_pending_delayed_task; |
+} |
+ |
void TaskQueueManager::SetPumpPolicy(size_t queue_index, |
PumpPolicy pump_policy) { |
DCHECK(main_thread_checker_.CalledOnValidThread()); |