[Mac] Maximise timer slack for background tabs
When a tab not playing audio is sent to the background, set timer slack to its maximum value.
Support for setting timer slack is added at the MessageLoop level, the concrete implementation of this CL only affects CFMessagePump backed MessageLoops (which means just the main thread for backgrounded renderer processes at present).
The MessageLoop implementation is designed to support its use on Windows and Linux (the Windows API sets slack per-timer like the Mac one, while on Linux slack, is set per-thread via a call to prctl() using PR_SET_TIMERSLACK).
BUG=356804
Review URL: https://codereview.chromium.org/289863005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@275218 0039d316-1c4b-4281-b951-d872f2087c98
CrOS-Libchrome-Original-Commit: 57cd3d24748da3060fa42b70979a4c0390139ba1
diff --git a/base/message_loop/message_loop.h b/base/message_loop/message_loop.h
index 165299d..22d4f73 100644
--- a/base/message_loop/message_loop.h
+++ b/base/message_loop/message_loop.h
@@ -18,6 +18,7 @@
#include "base/message_loop/message_loop_proxy.h"
#include "base/message_loop/message_loop_proxy_impl.h"
#include "base/message_loop/message_pump.h"
+#include "base/message_loop/timer_slack.h"
#include "base/observer_list.h"
#include "base/pending_task.h"
#include "base/sequenced_task_runner_helpers.h"
@@ -274,6 +275,11 @@
// arbitrary MessageLoop to QuitWhenIdle.
static Closure QuitWhenIdleClosure();
+ // Set the timer slack for this message loop.
+ void SetTimerSlack(TimerSlack timer_slack) {
+ pump_->SetTimerSlack(timer_slack);
+ }
+
// Returns true if this loop is |type|. This allows subclasses (especially
// those in tests) to specialize how they are identified.
virtual bool IsType(Type type) const;
diff --git a/base/message_loop/message_pump.cc b/base/message_loop/message_pump.cc
index 7ffc2b1..3d85b9b 100644
--- a/base/message_loop/message_pump.cc
+++ b/base/message_loop/message_pump.cc
@@ -12,4 +12,7 @@
MessagePump::~MessagePump() {
}
+void MessagePump::SetTimerSlack(TimerSlack) {
+}
+
} // namespace base
diff --git a/base/message_loop/message_pump.h b/base/message_loop/message_pump.h
index 816bb3c..a795f31 100644
--- a/base/message_loop/message_pump.h
+++ b/base/message_loop/message_pump.h
@@ -7,6 +7,7 @@
#include "base/base_export.h"
#include "base/basictypes.h"
+#include "base/message_loop/timer_slack.h"
#include "base/threading/non_thread_safe.h"
namespace base {
@@ -134,6 +135,9 @@
// cancelling any pending DoDelayedWork callback. This method may only be
// used on the thread that called Run.
virtual void ScheduleDelayedWork(const TimeTicks& delayed_work_time) = 0;
+
+ // Sets the timer slack to the specified value.
+ virtual void SetTimerSlack(TimerSlack timer_slack);
};
} // namespace base
diff --git a/base/message_loop/timer_slack.h b/base/message_loop/timer_slack.h
new file mode 100644
index 0000000..1ad6ca9
--- /dev/null
+++ b/base/message_loop/timer_slack.h
@@ -0,0 +1,22 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BASE_MESSAGE_LOOP_TIMER_SLACK_H_
+#define BASE_MESSAGE_LOOP_TIMER_SLACK_H_
+
+namespace base {
+
+// Amount of timer slack to use for delayed timers. Increasing timer slack
+// allows the OS to coalesce timers more effectively.
+enum TimerSlack {
+ // Lowest value for timer slack allowed by OS.
+ TIMER_SLACK_NONE,
+
+ // Maximal value for timer slack allowed by OS.
+ TIMER_SLACK_MAXIMUM
+};
+
+} // namespace base
+
+#endif // BASE_MESSAGE_LOOP_TIMER_SLACK_H_