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

Unified Diff: content/renderer/scheduler/task_queue_manager.cc

Issue 968073003: [content]: Add support for long idle times in the Blink Scheduler. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@long_idle_4
Patch Set: Minor tweaks Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
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());

Powered by Google App Engine
This is Rietveld 408576698