<!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>[210810] releases/WebKitGTK/webkit-2.14/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/210810">210810</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2017-01-17 05:36:04 -0800 (Tue, 17 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/208536">r208536</a> - [Linux] Memory values shown by memory pressure handler logger are not useful
https://bugs.webkit.org/show_bug.cgi?id=164589

Reviewed by Michael Catanzaro.

We are currently using the VmSize field from /proc/self/status which is the virtual memory size of the process
and doesn't normally change even when the memory pressure handler manages to release memory. So, most of the
time we see that there's no changes in memory usage in the logs.
We should use the actual memory used by the process, memory that the process can release and then it's relevant
for the memory pressure handler. Using other fields from /proc/self/status we could do something like VmRSS -
(RssFile + RssShme), but there's also /proc/self/statm that provides the same information in a single. The main
different is that statm provides both resident and shared memory directly, but in number of pages, so we need to
multiply by the size of the page.
This patch adds a method to parse /proc/self/statm in its given file, because I plan to use this for the linux
memory sampler that is incorrectly parsing /proc/self/statm.

* platform/Linux.cmake: Add new files to compilation.
* platform/linux/CurrentProcessMemoryStatus.cpp: Added.
(WebCore::systemPageSize): Return the page size.
(WebCore::currentProcessMemoryStatus): Parse /proc/self/statm and fill the given ProcessMemoryStatus.
* platform/linux/CurrentProcessMemoryStatus.h: Added.
* platform/linux/MemoryPressureHandlerLinux.cpp:
(WebCore::MemoryPressureHandler::processMemoryUsage(): Helper function to return the memory used by the process
in bytes.
(WebCore::MemoryPressureHandler::ReliefLogger::platformMemoryUsage): Use processMemoryUsage().</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformLinuxcmake">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/Linux.cmake</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformlinuxMemoryPressureHandlerLinuxcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/linux/MemoryPressureHandlerLinux.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformlinuxCurrentProcessMemoryStatuscpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/linux/CurrentProcessMemoryStatus.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformlinuxCurrentProcessMemoryStatush">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/linux/CurrentProcessMemoryStatus.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit214SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog (210809 => 210810)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog        2017-01-17 13:25:10 UTC (rev 210809)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog        2017-01-17 13:36:04 UTC (rev 210810)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2016-11-10  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [Linux] Memory values shown by memory pressure handler logger are not useful
+        https://bugs.webkit.org/show_bug.cgi?id=164589
+
+        Reviewed by Michael Catanzaro.
+
+        We are currently using the VmSize field from /proc/self/status which is the virtual memory size of the process
+        and doesn't normally change even when the memory pressure handler manages to release memory. So, most of the
+        time we see that there's no changes in memory usage in the logs.
+        We should use the actual memory used by the process, memory that the process can release and then it's relevant
+        for the memory pressure handler. Using other fields from /proc/self/status we could do something like VmRSS -
+        (RssFile + RssShme), but there's also /proc/self/statm that provides the same information in a single. The main
+        different is that statm provides both resident and shared memory directly, but in number of pages, so we need to
+        multiply by the size of the page.
+        This patch adds a method to parse /proc/self/statm in its given file, because I plan to use this for the linux
+        memory sampler that is incorrectly parsing /proc/self/statm.
+
+        * platform/Linux.cmake: Add new files to compilation.
+        * platform/linux/CurrentProcessMemoryStatus.cpp: Added.
+        (WebCore::systemPageSize): Return the page size.
+        (WebCore::currentProcessMemoryStatus): Parse /proc/self/statm and fill the given ProcessMemoryStatus.
+        * platform/linux/CurrentProcessMemoryStatus.h: Added.
+        * platform/linux/MemoryPressureHandlerLinux.cpp:
+        (WebCore::MemoryPressureHandler::processMemoryUsage(): Helper function to return the memory used by the process
+        in bytes.
+        (WebCore::MemoryPressureHandler::ReliefLogger::platformMemoryUsage): Use processMemoryUsage().
+
</ins><span class="cx"> 2017-01-11  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r182947.
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformLinuxcmake"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/Linux.cmake (210809 => 210810)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/Linux.cmake        2017-01-17 13:25:10 UTC (rev 210809)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/Linux.cmake        2017-01-17 13:36:04 UTC (rev 210810)
</span><span class="lines">@@ -5,5 +5,7 @@
</span><span class="cx"> 
</span><span class="cx"> list(APPEND WebCore_SOURCES
</span><span class="cx">     platform/gamepad/linux/GamepadDeviceLinux.cpp
</span><ins>+
+    platform/linux/CurrentProcessMemoryStatus.cpp
</ins><span class="cx">     platform/linux/MemoryPressureHandlerLinux.cpp
</span><span class="cx"> )
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformlinuxCurrentProcessMemoryStatuscpp"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/linux/CurrentProcessMemoryStatus.cpp (0 => 210810)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/linux/CurrentProcessMemoryStatus.cpp                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/linux/CurrentProcessMemoryStatus.cpp        2017-01-17 13:36:04 UTC (rev 210810)
</span><span class="lines">@@ -0,0 +1,77 @@
</span><ins>+/*
+ * Copyright (C) 2016 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;CurrentProcessMemoryStatus.h&quot;
+
+#if OS(LINUX)
+
+#include &lt;stdio.h&gt;
+#include &lt;stdlib.h&gt;
+#include &lt;unistd.h&gt;
+
+namespace WebCore {
+
+static inline size_t systemPageSize()
+{
+    static size_t pageSize = 0;
+    if (!pageSize)
+        pageSize = sysconf(_SC_PAGE_SIZE);
+    return pageSize;
+}
+
+void currentProcessMemoryStatus(ProcessMemoryStatus&amp; memoryStatus)
+{
+    FILE* file = fopen(&quot;/proc/self/statm&quot;, &quot;r&quot;);
+    if (!file)
+        return;
+
+    char buffer[128];
+    char* line = fgets(buffer, 128, file);
+    fclose(file);
+    if (!line)
+        return;
+
+    size_t pageSize = systemPageSize();
+    char* end = nullptr;
+    unsigned long long intValue = strtoull(line, &amp;end, 10);
+    memoryStatus.size = intValue * pageSize;
+    intValue = strtoull(end, &amp;end, 10);
+    memoryStatus.resident = intValue * pageSize;
+    intValue = strtoull(end, &amp;end, 10);
+    memoryStatus.shared = intValue * pageSize;
+    intValue = strtoull(end, &amp;end, 10);
+    memoryStatus.text = intValue * pageSize;
+    intValue = strtoull(end, &amp;end, 10);
+    memoryStatus.lib = intValue * pageSize;
+    intValue = strtoull(end, &amp;end, 10);
+    memoryStatus.data = intValue * pageSize;
+    intValue = strtoull(end, &amp;end, 10);
+    memoryStatus.dt = intValue * pageSize;
+}
+
+} // namespace WebCore
+
+#endif // OS(LINUX)
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformlinuxCurrentProcessMemoryStatush"></a>
<div class="addfile"><h4>Added: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/linux/CurrentProcessMemoryStatus.h (0 => 210810)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/linux/CurrentProcessMemoryStatus.h                                (rev 0)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/linux/CurrentProcessMemoryStatus.h        2017-01-17 13:36:04 UTC (rev 210810)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+/*
+ * Copyright (C) 2016 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if OS(LINUX)
+
+namespace WebCore {
+
+struct ProcessMemoryStatus {
+    size_t size { 0 };
+    size_t resident { 0 };
+    size_t shared { 0 };
+    size_t text { 0 };
+    size_t lib { 0 };
+    size_t data { 0 };
+    size_t dt { 0 };
+};
+
+void currentProcessMemoryStatus(ProcessMemoryStatus&amp;);
+
+} // namespace WebCore
+
+#endif // OS(LINUX)
</ins></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformlinuxMemoryPressureHandlerLinuxcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/linux/MemoryPressureHandlerLinux.cpp (210809 => 210810)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/linux/MemoryPressureHandlerLinux.cpp        2017-01-17 13:25:10 UTC (rev 210809)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/linux/MemoryPressureHandlerLinux.cpp        2017-01-17 13:36:04 UTC (rev 210810)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if OS(LINUX)
</span><span class="cx"> 
</span><ins>+#include &quot;CurrentProcessMemoryStatus.h&quot;
</ins><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &lt;errno.h&gt;
</span><span class="lines">@@ -59,7 +60,6 @@
</span><span class="cx"> 
</span><span class="cx"> static const char* s_cgroupMemoryPressureLevel = &quot;/sys/fs/cgroup/memory/memory.pressure_level&quot;;
</span><span class="cx"> static const char* s_cgroupEventControl = &quot;/sys/fs/cgroup/memory/cgroup.event_control&quot;;
</span><del>-static const char* s_processStatus = &quot;/proc/self/status&quot;;
</del><span class="cx"> 
</span><span class="cx"> #if USE(GLIB)
</span><span class="cx"> typedef struct {
</span><span class="lines">@@ -157,27 +157,6 @@
</span><span class="cx">     m_notifyHandler();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline String nextToken(FILE* file)
-{
-    if (!file)
-        return String();
-
-    static const unsigned bufferSize = 128;
-    char buffer[bufferSize] = {0, };
-    unsigned index = 0;
-    while (index &lt; bufferSize) {
-        int ch = fgetc(file);
-        if (ch == EOF || (isASCIISpace(ch) &amp;&amp; index)) // Break on non-initial ASCII space.
-            break;
-        if (!isASCIISpace(ch)) {
-            buffer[index] = ch;
-            index++;
-        }
-    }
-
-    return String(buffer);
-}
-
</del><span class="cx"> inline void MemoryPressureHandler::logErrorAndCloseFDs(const char* log)
</span><span class="cx"> {
</span><span class="cx">     if (log)
</span><span class="lines">@@ -293,6 +272,13 @@
</span><span class="cx">     m_holdOffTimer.startOneShot(seconds);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static size_t processMemoryUsage()
+{
+    ProcessMemoryStatus memoryStatus;
+    currentProcessMemoryStatus(memoryStatus);
+    return (memoryStatus.resident - memoryStatus.shared);
+}
+
</ins><span class="cx"> void MemoryPressureHandler::respondToMemoryPressure(Critical critical, Synchronous synchronous)
</span><span class="cx"> {
</span><span class="cx">     uninstall();
</span><span class="lines">@@ -313,22 +299,7 @@
</span><span class="cx"> 
</span><span class="cx"> size_t MemoryPressureHandler::ReliefLogger::platformMemoryUsage()
</span><span class="cx"> {
</span><del>-    FILE* file = fopen(s_processStatus, &quot;r&quot;);
-    if (!file)
-        return static_cast&lt;size_t&gt;(-1);
-
-    size_t vmSize = static_cast&lt;size_t&gt;(-1); // KB
-    String token = nextToken(file);
-    while (!token.isEmpty()) {
-        if (token == &quot;VmSize:&quot;) {
-            vmSize = nextToken(file).toInt() * KB;
-            break;
-        }
-        token = nextToken(file);
-    }
-    fclose(file);
-
-    return vmSize;
</del><ins>+    return processMemoryUsage();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MemoryPressureHandler::setMemoryPressureMonitorHandle(int fd)
</span></span></pre>
</div>
</div>

</body>
</html>