[Libreoffice-commits] online.git: common/Util.cpp

Ashod Nakashian ashod.nakashian at collabora.co.uk
Thu Feb 9 04:35:45 UTC 2017


 common/Util.cpp |   51 +++++++++++++++++++++++++++++----------------------
 1 file changed, 29 insertions(+), 22 deletions(-)

New commits:
commit 1e42b530e688fb72c5ae152d22fa72cf11b2f8cb
Author: Ashod Nakashian <ashod.nakashian at collabora.co.uk>
Date:   Wed Feb 8 23:30:28 2017 -0500

    wsd: read memory RSS directly from /proc/pid/stat
    
    There is no need to use `ps` here as reading
    directly is trivial and has far less overhead.
    
    Change-Id: I27d0432c1f3a9d35763d67fc445d8bd828f1b27e
    Reviewed-on: https://gerrit.libreoffice.org/34052
    Reviewed-by: Ashod Nakashian <ashnakash at gmail.com>
    Tested-by: Ashod Nakashian <ashnakash at gmail.com>

diff --git a/common/Util.cpp b/common/Util.cpp
index b52ce8f..b959029 100644
--- a/common/Util.cpp
+++ b/common/Util.cpp
@@ -196,33 +196,40 @@ namespace Util
 
     size_t getMemoryUsageRSS(const Poco::Process::PID pid)
     {
-        if (pid <= 0)
-        {
-            return 0;
-        }
+        static const auto pageSizeBytes = getpagesize();
 
-        try
+        if (pid > 0)
         {
-            const auto cmd = "ps o rss= -p " + std::to_string(pid);
-            FILE* fp = popen(cmd.c_str(), "r");
-            if (fp == nullptr)
+            const auto cmd = "/proc/" + std::to_string(pid) + "/stat";
+            FILE* fp = fopen(cmd.c_str(), "r");
+            if (fp != nullptr)
             {
-                return 0;
-            }
+                size_t rss = 0;
+                char line[4096] = { 0 };
+                if (fgets(line, sizeof (line), fp))
+                {
+                    const std::string s(line);
+                    int index = 1;
+                    auto pos = s.find(' ');
+                    while (pos != std::string::npos)
+                    {
+                        if (index == 23)
+                        {
+                            // Convert from memory pages to KB.
+                            rss = strtol(&s[pos], nullptr, 10);
+                            rss *= pageSizeBytes;
+                            rss /= 1024;
+                            break;
+                        }
+
+                        ++index;
+                        pos = s.find(' ', pos + 1);
+                    }
+                }
 
-            std::string sResponse;
-            char cmdBuffer[1024];
-            while (fgets(cmdBuffer, sizeof(cmdBuffer) - 1, fp) != nullptr)
-            {
-                sResponse += cmdBuffer;
+                fclose(fp);
+                return rss;
             }
-            pclose(fp);
-
-            return std::stoi(sResponse);
-        }
-        catch (const std::exception&)
-        {
-            LOG_WRN("Trying to find memory of invalid/dead PID " << pid);
         }
 
         return 0;


More information about the Libreoffice-commits mailing list