<!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>[209744] 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/209744">209744</a></dd>
<dt>Author</dt> <dd>krollin@apple.com</dd>
<dt>Date</dt> <dd>2016-12-12 16:28:18 -0800 (Mon, 12 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Memory warning logging appears to capture resident footprint, missing compress/swap.
https://bugs.webkit.org/show_bug.cgi?id=165533
&lt;rdar://problem/29318410&gt;

Reviewed by Andreas Kling.

Have platformMemoryUsage return both resident and resident + swapped
values. This is now returned as a struct in a std::optional to better
support cases where values cannot or are not returned. Report these
values in logMemoryUsageChange.

Remove most of the ReliefLogger instances and their messages. We no
longer free up fastMalloc memory after each memory-release operation,
so there are no memory regions returned to the OS. Instead, we now
free up fastMalloc memory regions at the end of all memory-releasing
operations in one fell swoop and report a grand total of memory
returned.

No new tests -- no changes to user accessible functionality.

* page/MemoryRelease.cpp:
(WebCore::releaseNoncriticalMemory):
(WebCore::releaseCriticalMemory):
(WebCore::releaseMemory):
* page/cocoa/MemoryReleaseCocoa.mm:
(WebCore::platformReleaseMemory):
* platform/MemoryPressureHandler.cpp:
(WebCore::MemoryPressureHandler::releaseMemory):
(WebCore::MemoryPressureHandler::ReliefLogger::logMemoryUsageChange):
(WebCore::MemoryPressureHandler::ReliefLogger::platformMemoryUsage):
* platform/MemoryPressureHandler.h:
(WebCore::MemoryPressureHandler::ReliefLogger::ReliefLogger):
(WebCore::MemoryPressureHandler::ReliefLogger::~ReliefLogger):
(WebCore::MemoryPressureHandler::ReliefLogger::loggingEnabled):
* platform/cocoa/MemoryPressureHandlerCocoa.mm:
(WebCore::MemoryPressureHandler::platformReleaseMemory):
(WebCore::MemoryPressureHandler::ReliefLogger::platformMemoryUsage):
* platform/linux/MemoryPressureHandlerLinux.cpp:
* platform/win/MemoryPressureHandlerWin.cpp:
(WebCore::MemoryPressureHandler::ReliefLogger::platformMemoryUsage):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepageMemoryReleasecpp">trunk/Source/WebCore/page/MemoryRelease.cpp</a></li>
<li><a href="#trunkSourceWebCorepagecocoaMemoryReleaseCocoamm">trunk/Source/WebCore/page/cocoa/MemoryReleaseCocoa.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformMemoryPressureHandlercpp">trunk/Source/WebCore/platform/MemoryPressureHandler.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformMemoryPressureHandlerh">trunk/Source/WebCore/platform/MemoryPressureHandler.h</a></li>
<li><a href="#trunkSourceWebCoreplatformcocoaMemoryPressureHandlerCocoamm">trunk/Source/WebCore/platform/cocoa/MemoryPressureHandlerCocoa.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformlinuxMemoryPressureHandlerLinuxcpp">trunk/Source/WebCore/platform/linux/MemoryPressureHandlerLinux.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformwinMemoryPressureHandlerWincpp">trunk/Source/WebCore/platform/win/MemoryPressureHandlerWin.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (209743 => 209744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-12-13 00:23:42 UTC (rev 209743)
+++ trunk/Source/WebCore/ChangeLog        2016-12-13 00:28:18 UTC (rev 209744)
</span><span class="lines">@@ -1,3 +1,46 @@
</span><ins>+2016-12-12  Keith Rollin  &lt;krollin@apple.com&gt;
+
+        Memory warning logging appears to capture resident footprint, missing compress/swap.
+        https://bugs.webkit.org/show_bug.cgi?id=165533
+        &lt;rdar://problem/29318410&gt;
+
+        Reviewed by Andreas Kling.
+
+        Have platformMemoryUsage return both resident and resident + swapped
+        values. This is now returned as a struct in a std::optional to better
+        support cases where values cannot or are not returned. Report these
+        values in logMemoryUsageChange.
+
+        Remove most of the ReliefLogger instances and their messages. We no
+        longer free up fastMalloc memory after each memory-release operation,
+        so there are no memory regions returned to the OS. Instead, we now
+        free up fastMalloc memory regions at the end of all memory-releasing
+        operations in one fell swoop and report a grand total of memory
+        returned.
+
+        No new tests -- no changes to user accessible functionality.
+
+        * page/MemoryRelease.cpp:
+        (WebCore::releaseNoncriticalMemory):
+        (WebCore::releaseCriticalMemory):
+        (WebCore::releaseMemory):
+        * page/cocoa/MemoryReleaseCocoa.mm:
+        (WebCore::platformReleaseMemory):
+        * platform/MemoryPressureHandler.cpp:
+        (WebCore::MemoryPressureHandler::releaseMemory):
+        (WebCore::MemoryPressureHandler::ReliefLogger::logMemoryUsageChange):
+        (WebCore::MemoryPressureHandler::ReliefLogger::platformMemoryUsage):
+        * platform/MemoryPressureHandler.h:
+        (WebCore::MemoryPressureHandler::ReliefLogger::ReliefLogger):
+        (WebCore::MemoryPressureHandler::ReliefLogger::~ReliefLogger):
+        (WebCore::MemoryPressureHandler::ReliefLogger::loggingEnabled):
+        * platform/cocoa/MemoryPressureHandlerCocoa.mm:
+        (WebCore::MemoryPressureHandler::platformReleaseMemory):
+        (WebCore::MemoryPressureHandler::ReliefLogger::platformMemoryUsage):
+        * platform/linux/MemoryPressureHandlerLinux.cpp:
+        * platform/win/MemoryPressureHandlerWin.cpp:
+        (WebCore::MemoryPressureHandler::ReliefLogger::platformMemoryUsage):
+
</ins><span class="cx"> 2016-12-12  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Document.visibilityState should use an IDL string enumeration
</span></span></pre></div>
<a id="trunkSourceWebCorepageMemoryReleasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/MemoryRelease.cpp (209743 => 209744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/MemoryRelease.cpp        2016-12-13 00:23:42 UTC (rev 209743)
+++ trunk/Source/WebCore/page/MemoryRelease.cpp        2016-12-13 00:28:18 UTC (rev 209744)
</span><span class="lines">@@ -48,82 +48,45 @@
</span><span class="cx"> 
</span><span class="cx"> static void releaseNoncriticalMemory()
</span><span class="cx"> {
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Purge inactive FontData&quot;);
-        FontCache::singleton().purgeInactiveFontData();
-    }
</del><ins>+    FontCache::singleton().purgeInactiveFontData();
</ins><span class="cx"> 
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Clear WidthCaches&quot;);
-        clearWidthCaches();
-    }
</del><ins>+    clearWidthCaches();
</ins><span class="cx"> 
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Discard Selector Query Cache&quot;);
-        for (auto* document : Document::allDocuments())
-            document-&gt;clearSelectorQueryCache();
-    }
</del><ins>+    for (auto* document : Document::allDocuments())
+        document-&gt;clearSelectorQueryCache();
</ins><span class="cx"> 
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Prune MemoryCache dead resources&quot;);
-        MemoryCache::singleton().pruneDeadResourcesToSize(0);
-    }
</del><ins>+    MemoryCache::singleton().pruneDeadResourcesToSize(0);
</ins><span class="cx"> 
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Prune presentation attribute cache&quot;);
-        StyledElement::clearPresentationAttributeCache();
-    }
</del><ins>+    StyledElement::clearPresentationAttributeCache();
</ins><span class="cx"> 
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Clear inline stylesheet cache&quot;);
-        InlineStyleSheetOwner::clearCache();
-    }
</del><ins>+    InlineStyleSheetOwner::clearCache();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static void releaseCriticalMemory(Synchronous synchronous)
</span><span class="cx"> {
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Empty the PageCache&quot;);
-        // Right now, the only reason we call release critical memory while not under memory pressure is if the process is about to be suspended.
-        PruningReason pruningReason = MemoryPressureHandler::singleton().isUnderMemoryPressure() ? PruningReason::MemoryPressure : PruningReason::ProcessSuspended;
-        PageCache::singleton().pruneToSizeNow(0, pruningReason);
-    }
</del><ins>+    // Right now, the only reason we call release critical memory while not under memory pressure is if the process is about to be suspended.
+    PruningReason pruningReason = MemoryPressureHandler::singleton().isUnderMemoryPressure() ? PruningReason::MemoryPressure : PruningReason::ProcessSuspended;
+    PageCache::singleton().pruneToSizeNow(0, pruningReason);
</ins><span class="cx"> 
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Prune MemoryCache live resources&quot;);
-        MemoryCache::singleton().pruneLiveResourcesToSize(0, /*shouldDestroyDecodedDataForAllLiveResources*/ true);
-    }
</del><ins>+    MemoryCache::singleton().pruneLiveResourcesToSize(0, /*shouldDestroyDecodedDataForAllLiveResources*/ true);
</ins><span class="cx"> 
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Drain CSSValuePool&quot;);
-        CSSValuePool::singleton().drain();
-    }
</del><ins>+    CSSValuePool::singleton().drain();
</ins><span class="cx"> 
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Discard StyleResolvers&quot;);
-        Vector&lt;RefPtr&lt;Document&gt;&gt; documents;
-        copyToVector(Document::allDocuments(), documents);
-        for (auto&amp; document : documents)
-            document-&gt;styleScope().clearResolver();
-    }
</del><ins>+    Vector&lt;RefPtr&lt;Document&gt;&gt; documents;
+    copyToVector(Document::allDocuments(), documents);
+    for (auto&amp; document : documents)
+        document-&gt;styleScope().clearResolver();
</ins><span class="cx"> 
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Discard all JIT-compiled code&quot;);
-        GCController::singleton().deleteAllCode(JSC::DeleteAllCodeIfNotCollecting);
-    }
</del><ins>+    GCController::singleton().deleteAllCode(JSC::DeleteAllCodeIfNotCollecting);
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(VIDEO)
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Dropping buffered data from paused media elements&quot;);
-        for (auto* mediaElement : HTMLMediaElement::allMediaElements()) {
-            if (mediaElement-&gt;paused())
-                mediaElement-&gt;purgeBufferedDataIfPossible();
-        }
</del><ins>+    for (auto* mediaElement : HTMLMediaElement::allMediaElements()) {
+        if (mediaElement-&gt;paused())
+            mediaElement-&gt;purgeBufferedDataIfPossible();
</ins><span class="cx">     }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     if (synchronous == Synchronous::Yes) {
</span><del>-        MemoryPressureHandler::ReliefLogger log(&quot;Collecting JavaScript garbage&quot;);
</del><span class="cx">         GCController::singleton().garbageCollectNow();
</span><span class="cx">     } else {
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="lines">@@ -148,17 +111,14 @@
</span><span class="cx"> 
</span><span class="cx">     platformReleaseMemory(critical);
</span><span class="cx"> 
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Release free FastMalloc memory&quot;);
-        // FastMalloc has lock-free thread specific caches that can only be cleared from the thread itself.
-        WorkerThread::releaseFastMallocFreeMemoryInAllThreads();
</del><ins>+    // FastMalloc has lock-free thread specific caches that can only be cleared from the thread itself.
+    WorkerThread::releaseFastMallocFreeMemoryInAllThreads();
</ins><span class="cx"> #if ENABLE(ASYNC_SCROLLING) &amp;&amp; !PLATFORM(IOS)
</span><del>-        ScrollingThread::dispatch([]() {
-            WTF::releaseFastMallocFreeMemory();
-        });
</del><ins>+    ScrollingThread::dispatch([]() {
+        WTF::releaseFastMallocFreeMemory();
+    });
</ins><span class="cx"> #endif
</span><del>-        WTF::releaseFastMallocFreeMemory();
-    }
</del><ins>+    WTF::releaseFastMallocFreeMemory();
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(RESOURCE_USAGE)
</span><span class="cx">     Page::forEachPage([&amp;](Page&amp; page) {
</span></span></pre></div>
<a id="trunkSourceWebCorepagecocoaMemoryReleaseCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/cocoa/MemoryReleaseCocoa.mm (209743 => 209744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/cocoa/MemoryReleaseCocoa.mm        2016-12-13 00:23:42 UTC (rev 209743)
+++ trunk/Source/WebCore/page/cocoa/MemoryReleaseCocoa.mm        2016-12-13 00:28:18 UTC (rev 209744)
</span><span class="lines">@@ -37,21 +37,13 @@
</span><span class="cx"> 
</span><span class="cx"> void platformReleaseMemory(Critical)
</span><span class="cx"> {
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Purging SQLite caches&quot;);
-        _sqlite3_purgeEligiblePagerCacheMemory();
-    }
</del><ins>+    _sqlite3_purgeEligiblePagerCacheMemory();
</ins><span class="cx"> 
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Drain LayerPools&quot;);
-        for (auto&amp; pool : LayerPool::allLayerPools())
-            pool-&gt;drain();
-    }
</del><ins>+    for (auto&amp; pool : LayerPool::allLayerPools())
+        pool-&gt;drain();
+
</ins><span class="cx"> #if USE(IOSURFACE)
</span><del>-    {
-        MemoryPressureHandler::ReliefLogger log(&quot;Drain IOSurfacePool&quot;);
-        IOSurfacePool::sharedPool().discardAllSurfaces();
-    }
</del><ins>+    IOSurfacePool::sharedPool().discardAllSurfaces();
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformMemoryPressureHandlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/MemoryPressureHandler.cpp (209743 => 209744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/MemoryPressureHandler.cpp        2016-12-13 00:23:42 UTC (rev 209743)
+++ trunk/Source/WebCore/platform/MemoryPressureHandler.cpp        2016-12-13 00:28:18 UTC (rev 209744)
</span><span class="lines">@@ -61,6 +61,7 @@
</span><span class="cx">     if (!m_lowMemoryHandler)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    ReliefLogger log(&quot;Total&quot;);
</ins><span class="cx">     m_lowMemoryHandler(critical, synchronous);
</span><span class="cx">     platformReleaseMemory(critical);
</span><span class="cx"> }
</span><span class="lines">@@ -75,19 +76,19 @@
</span><span class="cx"> #define MEMORYPRESSURE_LOG(...) WTFLogAlways(__VA_ARGS__)
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    size_t currentMemory = platformMemoryUsage();
-    if (currentMemory == static_cast&lt;size_t&gt;(-1) || m_initialMemory == static_cast&lt;size_t&gt;(-1)) {
</del><ins>+    auto currentMemory = platformMemoryUsage();
+    if (!currentMemory || !m_initialMemory) {
</ins><span class="cx">         MEMORYPRESSURE_LOG(&quot;Memory pressure relief: &quot; STRING_SPECIFICATION &quot;: (Unable to get dirty memory information for process)&quot;, m_logString);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    long memoryDiff = currentMemory - m_initialMemory;
-    if (memoryDiff &lt; 0)
-        MEMORYPRESSURE_LOG(&quot;Memory pressure relief: &quot; STRING_SPECIFICATION &quot;: -dirty %ld bytes (from %zu to %zu)&quot;, m_logString, (memoryDiff * -1), m_initialMemory, currentMemory);
-    else if (memoryDiff &gt; 0)
-        MEMORYPRESSURE_LOG(&quot;Memory pressure relief: &quot; STRING_SPECIFICATION &quot;: +dirty %ld bytes (from %zu to %zu)&quot;, m_logString, memoryDiff, m_initialMemory, currentMemory);
-    else
-        MEMORYPRESSURE_LOG(&quot;Memory pressure relief: &quot; STRING_SPECIFICATION &quot;: =dirty (at %zu bytes)&quot;, m_logString, currentMemory);
</del><ins>+    long residentDiff = currentMemory-&gt;resident - m_initialMemory-&gt;resident;
+    long physicalDiff = currentMemory-&gt;physical - m_initialMemory-&gt;physical;
+
+    MEMORYPRESSURE_LOG(&quot;Memory pressure relief: &quot; STRING_SPECIFICATION &quot;: res = %zu/%zu/%ld, res+swap = %zu/%zu/%ld&quot;,
+        m_logString,
+        m_initialMemory-&gt;resident, currentMemory-&gt;resident, residentDiff,
+        m_initialMemory-&gt;physical, currentMemory-&gt;physical, physicalDiff);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if !PLATFORM(COCOA) &amp;&amp; !OS(LINUX) &amp;&amp; !PLATFORM(WIN)
</span><span class="lines">@@ -96,7 +97,7 @@
</span><span class="cx"> void MemoryPressureHandler::holdOff(unsigned) { }
</span><span class="cx"> void MemoryPressureHandler::respondToMemoryPressure(Critical, Synchronous) { }
</span><span class="cx"> void MemoryPressureHandler::platformReleaseMemory(Critical) { }
</span><del>-size_t MemoryPressureHandler::ReliefLogger::platformMemoryUsage() { return 0; }
</del><ins>+std::optional&lt;MemoryPressureHandler::ReliefLogger::MemoryUsage&gt; MemoryPressureHandler::ReliefLogger::platformMemoryUsage() { return std::nullopt; }
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformMemoryPressureHandlerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/MemoryPressureHandler.h (209743 => 209744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/MemoryPressureHandler.h        2016-12-13 00:23:42 UTC (rev 209743)
+++ trunk/Source/WebCore/platform/MemoryPressureHandler.h        2016-12-13 00:28:18 UTC (rev 209744)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include &lt;wtf/FastMalloc.h&gt;
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> #include &lt;wtf/NeverDestroyed.h&gt;
</span><ins>+#include &lt;wtf/Optional.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx"> #include &lt;wtf/Lock.h&gt;
</span><span class="lines">@@ -90,34 +91,38 @@
</span><span class="cx">     public:
</span><span class="cx">         explicit ReliefLogger(const char *log)
</span><span class="cx">             : m_logString(log)
</span><del>-#if !RELEASE_LOG_DISABLED
-            , m_initialMemory(platformMemoryUsage())
-#else
-            , m_initialMemory(s_loggingEnabled ? platformMemoryUsage() : 0)
-#endif
</del><ins>+            , m_initialMemory(loggingEnabled() ? platformMemoryUsage() : MemoryUsage { })
</ins><span class="cx">         {
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         ~ReliefLogger()
</span><span class="cx">         {
</span><del>-#if !RELEASE_LOG_DISABLED
-            logMemoryUsageChange();
-#else
-            if (s_loggingEnabled)
</del><ins>+            if (loggingEnabled())
</ins><span class="cx">                 logMemoryUsageChange();
</span><del>-#endif
</del><span class="cx">         }
</span><span class="cx"> 
</span><ins>+
</ins><span class="cx">         const char* logString() const { return m_logString; }
</span><span class="cx">         static void setLoggingEnabled(bool enabled) { s_loggingEnabled = enabled; }
</span><del>-        static bool loggingEnabled() { return s_loggingEnabled; }
</del><ins>+        static bool loggingEnabled()
+        {
+#if RELEASE_LOG_DISABLED
+            return s_loggingEnabled;
+#else
+            return true;
+#endif
+        }
</ins><span class="cx"> 
</span><span class="cx">     private:
</span><del>-        size_t platformMemoryUsage();
</del><ins>+        struct MemoryUsage {
+            size_t resident { 0 };
+            size_t physical { 0 };
+        };
+        std::optional&lt;MemoryUsage&gt; platformMemoryUsage();
</ins><span class="cx">         void logMemoryUsageChange();
</span><span class="cx"> 
</span><span class="cx">         const char* m_logString;
</span><del>-        size_t m_initialMemory;
</del><ins>+        std::optional&lt;MemoryUsage&gt; m_initialMemory;
</ins><span class="cx"> 
</span><span class="cx">         WEBCORE_EXPORT static bool s_loggingEnabled;
</span><span class="cx">     };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformcocoaMemoryPressureHandlerCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/cocoa/MemoryPressureHandlerCocoa.mm (209743 => 209744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/cocoa/MemoryPressureHandlerCocoa.mm        2016-12-13 00:23:42 UTC (rev 209743)
+++ trunk/Source/WebCore/platform/cocoa/MemoryPressureHandlerCocoa.mm        2016-12-13 00:28:18 UTC (rev 209744)
</span><span class="lines">@@ -49,7 +49,6 @@
</span><span class="cx">     if (critical == Critical::Yes &amp;&amp; (!isUnderMemoryPressure() || m_isSimulatingMemoryPressure)) {
</span><span class="cx">         // libcache listens to OS memory notifications, but for process suspension
</span><span class="cx">         // or memory pressure simulation, we need to prod it manually:
</span><del>-        ReliefLogger log(&quot;Purging libcache caches&quot;);
</del><span class="cx">         cache_simulate_memory_warning_event(DISPATCH_MEMORYPRESSURE_CRITICAL);
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="lines">@@ -186,15 +185,15 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-size_t MemoryPressureHandler::ReliefLogger::platformMemoryUsage()
</del><ins>+std::optional&lt;MemoryPressureHandler::ReliefLogger::MemoryUsage&gt; MemoryPressureHandler::ReliefLogger::platformMemoryUsage()
</ins><span class="cx"> {
</span><span class="cx">     task_vm_info_data_t vmInfo;
</span><span class="cx">     mach_msg_type_number_t count = TASK_VM_INFO_COUNT;
</span><span class="cx">     kern_return_t err = task_info(mach_task_self(), TASK_VM_INFO, (task_info_t) &amp;vmInfo, &amp;count);
</span><span class="cx">     if (err != KERN_SUCCESS)
</span><del>-        return static_cast&lt;size_t&gt;(-1);
</del><ins>+        return std::nullopt;
</ins><span class="cx"> 
</span><del>-    return static_cast&lt;size_t&gt;(vmInfo.internal);
</del><ins>+    return MemoryUsage {static_cast&lt;size_t&gt;(vmInfo.internal), static_cast&lt;size_t&gt;(vmInfo.phys_footprint)};
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformlinuxMemoryPressureHandlerLinuxcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/linux/MemoryPressureHandlerLinux.cpp (209743 => 209744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/linux/MemoryPressureHandlerLinux.cpp        2016-12-13 00:23:42 UTC (rev 209743)
+++ trunk/Source/WebCore/platform/linux/MemoryPressureHandlerLinux.cpp        2016-12-13 00:28:18 UTC (rev 209744)
</span><span class="lines">@@ -292,14 +292,13 @@
</span><span class="cx"> void MemoryPressureHandler::platformReleaseMemory(Critical)
</span><span class="cx"> {
</span><span class="cx"> #ifdef __GLIBC__
</span><del>-    ReliefLogger log(&quot;Run malloc_trim&quot;);
</del><span class="cx">     malloc_trim(0);
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-size_t MemoryPressureHandler::ReliefLogger::platformMemoryUsage()
</del><ins>+std::optional&lt;MemoryPressureHandler::ReliefLogger::MemoryUsage&gt; MemoryPressureHandler::ReliefLogger::platformMemoryUsage()
</ins><span class="cx"> {
</span><del>-    return processMemoryUsage();
</del><ins>+    return MemoryUsage {processMemoryUsage(), 0};
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MemoryPressureHandler::setMemoryPressureMonitorHandle(int fd)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformwinMemoryPressureHandlerWincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/win/MemoryPressureHandlerWin.cpp (209743 => 209744)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/win/MemoryPressureHandlerWin.cpp        2016-12-13 00:23:42 UTC (rev 209743)
+++ trunk/Source/WebCore/platform/win/MemoryPressureHandlerWin.cpp        2016-12-13 00:28:18 UTC (rev 209744)
</span><span class="lines">@@ -124,9 +124,9 @@
</span><span class="cx">     releaseMemory(critical, synchronous);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-size_t MemoryPressureHandler::ReliefLogger::platformMemoryUsage()
</del><ins>+std::optional&lt;MemoryPressureHandler::ReliefLogger::MemoryUsage&gt; MemoryPressureHandler::ReliefLogger::platformMemoryUsage()
</ins><span class="cx"> {
</span><del>-    return 0;
</del><ins>+    return std::nullopt;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre>
</div>
</div>

</body>
</html>