<!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>[180276] trunk/Source</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/180276">180276</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2015-02-18 11:32:00 -0800 (Wed, 18 Feb 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Evict dead resources in MemoryCache in MemoryPressureHandler::releaseNoncriticalMemory()
https://bugs.webkit.org/show_bug.cgi?id=141723

Reviewed by Andreas Kling.

Evict dead resources from the MemoryCache on non-critical memory
pressure. On critical memory pressure, we already evict ALL resources
from the MemoryCache. It is a good idea to start by evicting resources
we care less about on non-critical warning to decrease the chances of
getting a critical warning and thus having to clear the whole
MemoryCache.

* loader/cache/MemoryCache.h:
* platform/MemoryPressureHandler.cpp:
(WebCore::MemoryPressureHandler::releaseNoncriticalMemory):
(WebCore::MemoryPressureHandler::releaseCriticalMemory):
(WebCore::MemoryPressureHandler::releaseMemory):
Call releaseCriticalMemory() before releaseNoncriticalMemory()
as releaseCriticalMemory() is more aggressive. Doing it the
other way around would mean that on critical warning, we would
first evict dead resources, then evict all resources. It is
more efficient to evict all resources first, as it makes the
non-critical operation (evict dead resources) a no-op.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreloadercacheMemoryCacheh">trunk/Source/WebCore/loader/cache/MemoryCache.h</a></li>
<li><a href="#trunkSourceWebCoreplatformMemoryPressureHandlercpp">trunk/Source/WebCore/platform/MemoryPressureHandler.cpp</a></li>
<li><a href="#trunkSourceWebKitWebKitvcxprojWebKitExportGeneratorWebKitExportsdefin">trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (180275 => 180276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-02-18 19:29:41 UTC (rev 180275)
+++ trunk/Source/WebCore/ChangeLog        2015-02-18 19:32:00 UTC (rev 180276)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2015-02-18  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Evict dead resources in MemoryCache in MemoryPressureHandler::releaseNoncriticalMemory()
+        https://bugs.webkit.org/show_bug.cgi?id=141723
+
+        Reviewed by Andreas Kling.
+
+        Evict dead resources from the MemoryCache on non-critical memory
+        pressure. On critical memory pressure, we already evict ALL resources
+        from the MemoryCache. It is a good idea to start by evicting resources
+        we care less about on non-critical warning to decrease the chances of
+        getting a critical warning and thus having to clear the whole
+        MemoryCache.
+
+        * loader/cache/MemoryCache.h:
+        * platform/MemoryPressureHandler.cpp:
+        (WebCore::MemoryPressureHandler::releaseNoncriticalMemory):
+        (WebCore::MemoryPressureHandler::releaseCriticalMemory):
+        (WebCore::MemoryPressureHandler::releaseMemory):
+        Call releaseCriticalMemory() before releaseNoncriticalMemory()
+        as releaseCriticalMemory() is more aggressive. Doing it the
+        other way around would mean that on critical warning, we would
+        first evict dead resources, then evict all resources. It is
+        more efficient to evict all resources first, as it makes the
+        non-critical operation (evict dead resources) a no-op.
+
</ins><span class="cx"> 2015-02-18  Eric Carlson  &lt;eric.carlson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS] pause video when a tab moves to the background on some devices
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheMemoryCacheh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/MemoryCache.h (180275 => 180276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/MemoryCache.h        2015-02-18 19:29:41 UTC (rev 180275)
+++ trunk/Source/WebCore/loader/cache/MemoryCache.h        2015-02-18 19:32:00 UTC (rev 180276)
</span><span class="lines">@@ -161,6 +161,9 @@
</span><span class="cx">     WEBCORE_EXPORT void pruneDeadResources(); // Automatically decide how much to prune.
</span><span class="cx">     WEBCORE_EXPORT void pruneLiveResources(bool shouldDestroyDecodedDataForAllLiveResources = false);
</span><span class="cx"> 
</span><ins>+    WEBCORE_EXPORT void pruneDeadResourcesToSize(unsigned targetSize);
+    WEBCORE_EXPORT void pruneLiveResourcesToSize(unsigned targetSize, bool shouldDestroyDecodedDataForAllLiveResources = false);
+
</ins><span class="cx"> private:
</span><span class="cx"> #if ENABLE(CACHE_PARTITIONING)
</span><span class="cx">     typedef HashMap&lt;std::pair&lt;URL, String /* partitionName */&gt;, CachedResource*&gt; CachedResourceMap;
</span><span class="lines">@@ -169,9 +172,6 @@
</span><span class="cx"> #endif
</span><span class="cx">     typedef ListHashSet&lt;CachedResource*&gt; LRUList;
</span><span class="cx"> 
</span><del>-    WEBCORE_EXPORT void pruneDeadResourcesToSize(unsigned targetSize);
-    WEBCORE_EXPORT void pruneLiveResourcesToSize(unsigned targetSize, bool shouldDestroyDecodedDataForAllLiveResources = false);
-
</del><span class="cx">     MemoryCache();
</span><span class="cx">     ~MemoryCache(); // Not implemented to make sure nobody accidentally calls delete -- WebCore does not delete singletons.
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformMemoryPressureHandlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/MemoryPressureHandler.cpp (180275 => 180276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/MemoryPressureHandler.cpp        2015-02-18 19:29:41 UTC (rev 180275)
+++ trunk/Source/WebCore/platform/MemoryPressureHandler.cpp        2015-02-18 19:32:00 UTC (rev 180276)
</span><span class="lines">@@ -94,6 +94,11 @@
</span><span class="cx">         ReliefLogger log(&quot;Clearing JS string cache&quot;);
</span><span class="cx">         JSDOMWindow::commonVM().stringCache.clear();
</span><span class="cx">     }
</span><ins>+
+    {
+        ReliefLogger log(&quot;Evict MemoryCache dead resources&quot;);
+        MemoryCache::singleton().pruneDeadResourcesToSize(0);
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MemoryPressureHandler::releaseCriticalMemory()
</span><span class="lines">@@ -106,7 +111,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     {
</span><del>-        ReliefLogger log(&quot;Prune MemoryCache&quot;);
</del><ins>+        ReliefLogger log(&quot;Evict all MemoryCache resources&quot;);
</ins><span class="cx">         MemoryCache::singleton().evictResources();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -129,11 +134,11 @@
</span><span class="cx"> 
</span><span class="cx"> void MemoryPressureHandler::releaseMemory(bool critical)
</span><span class="cx"> {
</span><del>-    releaseNoncriticalMemory();
-
</del><span class="cx">     if (critical)
</span><span class="cx">         releaseCriticalMemory();
</span><span class="cx"> 
</span><ins>+    releaseNoncriticalMemory();
+
</ins><span class="cx">     platformReleaseMemory(critical);
</span><span class="cx"> 
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceWebKitWebKitvcxprojWebKitExportGeneratorWebKitExportsdefin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in (180275 => 180276)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in        2015-02-18 19:29:41 UTC (rev 180275)
+++ trunk/Source/WebKit/WebKit.vcxproj/WebKitExportGenerator/WebKitExports.def.in        2015-02-18 19:32:00 UTC (rev 180276)
</span><span class="lines">@@ -406,8 +406,8 @@
</span><span class="cx">         symbolWithPointer(?pauseTransitionAtTime@AnimationController@WebCore@@QAE_NPAVRenderElement@2@ABVString@WTF@@N@Z, ?pauseTransitionAtTime@AnimationController@WebCore@@QEAA_NPEAVRenderElement@2@AEBVString@WTF@@N@Z)
</span><span class="cx">         symbolWithPointer(?singleton@MemoryCache@WebCore@@SAAAV12@XZ, ?singleton@MemoryCache@WebCore@@SAAEAV12@XZ)
</span><span class="cx">         symbolWithPointer(?evictResources@MemoryCache@WebCore@@QAEXXZ, ?evictResources@MemoryCache@WebCore@@QEAAXXZ)
</span><del>-        symbolWithPointer(?pruneDeadResourcesToSize@MemoryCache@WebCore@@AAEXI@Z, ?pruneDeadResourcesToSize@MemoryCache@WebCore@@AEAAXI@Z)
-        symbolWithPointer(?pruneLiveResourcesToSize@MemoryCache@WebCore@@AAEXI_N@Z, ?pruneLiveResourcesToSize@MemoryCache@WebCore@@AEAAXI_N@Z)
</del><ins>+        symbolWithPointer(?pruneDeadResourcesToSize@MemoryCache@WebCore@@QAEXI@Z, ?pruneDeadResourcesToSize@MemoryCache@WebCore@@QAEXI@Z)
+        symbolWithPointer(?pruneLiveResourcesToSize@MemoryCache@WebCore@@QAEXI_N@Z, ?pruneLiveResourcesToSize@MemoryCache@WebCore@@QAEXI_N@Z)
</ins><span class="cx">         symbolWithPointer(?nonFastScrollableRects@Page@WebCore@@QAE?AV?$Ref@VClientRectList@WebCore@@@WTF@@PBVFrame@2@@Z, ?nonFastScrollableRects@Page@WebCore@@QEAA?AV?$Ref@VClientRectList@WebCore@@@WTF@@PEBVFrame@2@@Z)
</span><span class="cx">         symbolWithPointer(?numberOfActiveAnimations@AnimationController@WebCore@@QBEIPAVDocument@2@@Z, ?numberOfActiveAnimations@AnimationController@WebCore@@QEBAIPEAVDocument@2@@Z)
</span><span class="cx">         symbolWithPointer(?minDOMTimerInterval@Settings@WebCore@@QAENXZ, ?minDOMTimerInterval@Settings@WebCore@@QEAANXZ)
</span></span></pre>
</div>
</div>

</body>
</html>