<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[197588] trunk/Source/WebCore</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/197588">197588</a></dd>
<dt>Author</dt> <dd>barraclough@apple.com</dd>
<dt>Date</dt> <dd>2016-03-04 13:56:46 -0800 (Fri, 04 Mar 2016)</dd>
</dl>
<h3>Log Message</h3>
<pre>Max out timer throttling immediately for pre-render pages
https://bugs.webkit.org/show_bug.cgi?id=155038
Reviewed by Chris Dumez.
If a hidden page has never been visible, no need to gently ramp into throttling - treat it
the same as a page that has been viewed, but has been in the background for a long time.
Why? The throttling mechanism scales with the amount of background work by shifting the
limit - once all background pages have maxed out the limit, they should no longer be burden
of the system. However the mechanism doesn't currently do anything to accelerate towards
the limit based on the number of pages in the ramp up phase, and ramp up duration is
proportional to limit (so ramping up to a high limit takes a long time). So if you quickly
create a large number of hidden pages the system may be under excessive load for a while,
as we slowly ramp up to a limit that will adequately constrain resource consumption.
In cases where a large number of hidden pages are rapidly generated, many likely remain in
the pre-render state, so this mitigation should typically help.
* page/Page.cpp:
(WebCore::Page::updateDOMTimerAlignmentInterval):
- if m_isPrerender then m_timerAlignmentInterval is set to the limit.
(WebCore::Page::setIsPrerender):
- When this changes updateDOMTimerAlignmentInterval().</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepagePagecpp">trunk/Source/WebCore/page/Page.cpp</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (197587 => 197588)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-03-04 21:48:33 UTC (rev 197587)
+++ trunk/Source/WebCore/ChangeLog        2016-03-04 21:56:46 UTC (rev 197588)
</span><span class="lines">@@ -1,5 +1,31 @@
</span><span class="cx"> 2016-03-04 Gavin Barraclough <barraclough@apple.com>
</span><span class="cx">
</span><ins>+ Max out timer throttling immediately for pre-render pages
+ https://bugs.webkit.org/show_bug.cgi?id=155038
+
+ Reviewed by Chris Dumez.
+
+ If a hidden page has never been visible, no need to gently ramp into throttling - treat it
+ the same as a page that has been viewed, but has been in the background for a long time.
+
+ Why? The throttling mechanism scales with the amount of background work by shifting the
+ limit - once all background pages have maxed out the limit, they should no longer be burden
+ of the system. However the mechanism doesn't currently do anything to accelerate towards
+ the limit based on the number of pages in the ramp up phase, and ramp up duration is
+ proportional to limit (so ramping up to a high limit takes a long time). So if you quickly
+ create a large number of hidden pages the system may be under excessive load for a while,
+ as we slowly ramp up to a limit that will adequately constrain resource consumption.
+ In cases where a large number of hidden pages are rapidly generated, many likely remain in
+ the pre-render state, so this mitigation should typically help.
+
+ * page/Page.cpp:
+ (WebCore::Page::updateDOMTimerAlignmentInterval):
+ - if m_isPrerender then m_timerAlignmentInterval is set to the limit.
+ (WebCore::Page::setIsPrerender):
+ - When this changes updateDOMTimerAlignmentInterval().
+
+2016-03-04 Gavin Barraclough <barraclough@apple.com>
+
</ins><span class="cx"> Unify determination of page timer alignment
</span><span class="cx"> https://bugs.webkit.org/show_bug.cgi?id=155031
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorepagePagecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Page.cpp (197587 => 197588)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Page.cpp        2016-03-04 21:48:33 UTC (rev 197587)
+++ trunk/Source/WebCore/page/Page.cpp        2016-03-04 21:56:46 UTC (rev 197588)
</span><span class="lines">@@ -1244,11 +1244,20 @@
</span><span class="cx"> break;
</span><span class="cx">
</span><span class="cx"> case TimerThrottlingState::EnabledIncreasing:
</span><del>- ASSERT(m_timerThrottlingStateLastChangedTime);
- double throttledDuration = monotonicallyIncreasingTime() - m_timerThrottlingStateLastChangedTime;
- double minimumAlignmentInterval = std::max(DOMTimer::hiddenPageAlignmentInterval(), throttledDuration);
- m_timerAlignmentInterval = std::min(minimumAlignmentInterval, m_timerAlignmentIntervalIncreaseLimit);
- needsIncreaseTimer = m_timerAlignmentInterval < m_timerAlignmentIntervalIncreaseLimit;
</del><ins>+ // For pages in prerender state maximum throttling kicks in immediately.
+ if (m_isPrerender)
+ m_timerAlignmentInterval = m_timerAlignmentIntervalIncreaseLimit;
+ else {
+ ASSERT(m_timerThrottlingStateLastChangedTime);
+ m_timerAlignmentInterval = monotonicallyIncreasingTime() - m_timerThrottlingStateLastChangedTime;
+ // If we're below the limit, set the timer. If above, clamp to limit.
+ if (m_timerAlignmentInterval < m_timerAlignmentIntervalIncreaseLimit)
+ needsIncreaseTimer = true;
+ else
+ m_timerAlignmentInterval = m_timerAlignmentIntervalIncreaseLimit;
+ }
+ // Alignment interval should not be less than DOMTimer::hiddenPageAlignmentInterval().
+ m_timerAlignmentInterval = std::max(m_timerAlignmentInterval, DOMTimer::hiddenPageAlignmentInterval());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> // If throttling is enabled, auto-increasing of throttling is enabled, and the auto-increase
</span><span class="lines">@@ -1479,6 +1488,7 @@
</span><span class="cx"> void Page::setIsPrerender()
</span><span class="cx"> {
</span><span class="cx"> m_isPrerender = true;
</span><ins>+ updateDOMTimerAlignmentInterval();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> PageVisibilityState Page::visibilityState() const
</span></span></pre>
</div>
</div>
</body>
</html>