Aligns used memory in lxpanel monitor with free command line utility.
authorCarles Pina i Estany <carles@pina.cat>
Sat, 5 Jan 2019 23:03:18 +0000 (23:03 +0000)
committerAndriy Grytsenko <andrej@rep.kiev.ua>
Sun, 13 Jan 2019 21:45:12 +0000 (23:45 +0200)
It counts SReclaimable as free.

This is consistent with "free -m" output.

Note that "man free" says:
used   Used memory (calculated as total - free - buffers - cache)

Which is similar to what plugins/monitors.c used to do. But this didn't
match the output of "free -m" (which is confusing) and the source code
of free is counting SReclaimable as "free" (see
procps-3.3.12/proc/sysinfo.c around line 707:
kb_main_cached = kb_page_cache + kb_slab_reclaimable;

And calcuating the mem_used like:
mem_used = kb_main_total - kb_main_free - kb_main_cached - kb_main_buffers;

With this patch lxpanel monitor is consistent with free.

procps "free" suggests that SReclaimable was added in the Kernel 2.6.19.
It was released in 2006, if this field doesn't exist the memory monitor
displays "0" (and a warning by lxpanel is displayed on the console).

AUTHORS
ChangeLog
plugins/monitors/monitors.c

diff --git a/AUTHORS b/AUTHORS
index 87b6655..f216672 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -21,6 +21,7 @@ LXPanel - Lightweight X11 desktop panel
     Stanislav Kozina, Ersin <xersin@users.sf.net>
     Mamoru TASAKA <mtasaka@fedoraproject.org>
     number Zero <numzero@users.sf.net>
+    Carles Pina i Estany <carles@pina.cat>
 
 [History]
 LXPanel is a derivative work from fbpanel [1] written by Anatoly Asviyan,
index 105e5e1..9e95b45 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -5,6 +5,8 @@
 * Fixed crash on right-click task button after some task was killed using menu
     on another task button.
 * Fixed crash after color was removed from monitor plugin configuration.
+* Aligned used memory calculation in lxpanel monitor with 'free' command line
+    utility.
 
 0.9.3
 -------------------------------------------------------------------------
index 9e6ae75..524b526 100644 (file)
@@ -12,6 +12,7 @@
  *               2014-2016 Andriy Grytsenko <andrej@rep.kiev.ua>
  *               2015 Rafał Mużyło <galtgendo@gmail.com>
  *               2018 Mamoru TASAKA <mtasaka@fedoraproject.org>
+ *               2019 Carles Pina i Estany <carles@pina.cat>
  *
  * <terms>
  * Copyright (c) 2008-2014 LxDE Developers, see the file AUTHORS for details.
@@ -306,7 +307,8 @@ mem_update(Monitor * m)
     long int mem_free  = 0;
     long int mem_buffers = 0;
     long int mem_cached = 0;
-    unsigned int readmask = 0x8 | 0x4 | 0x2 | 0x1;
+    long int mem_sreclaimable = 0;
+    unsigned int readmask = 0x10 | 0x8 | 0x4 | 0x2 | 0x1;
 
     if (!m->stats || !m->pixmap)
         RET(TRUE);
@@ -335,6 +337,10 @@ mem_update(Monitor * m)
             readmask ^= 0x8;
             continue;
         }
+        if (sscanf(buf, "SReclaimable: %ld kB\n", &mem_sreclaimable) == 1) {
+            readmask ^= 0x10;
+            continue;
+        }
     }
 
     fclose(meminfo);
@@ -352,13 +358,13 @@ mem_update(Monitor * m)
      * 'free', because it can be flushed fairly quickly, and generally
      * isn't necessary to keep in memory.
      * It is hard to draw the line, which caches should be counted as free,
-     * and which not. Pagecaches, dentry, and inode caches are quickly
-     * filled up again for almost any use case. Hence I would not count
-     * them as 'free'.
+     * and which not. 'free' command line utility from procps counts
+     * SReclaimable as free so it's counted it here as well (note that
+     * 'man free' doesn't specify this)
      * 'mem_cached' definitely counts as 'free' because it is immediately
      * released should any application need it. */
     m->stats[m->ring_cursor] = (mem_total - mem_buffers - mem_free -
-            mem_cached) / (float)mem_total;
+            mem_cached - mem_sreclaimable) / (float)mem_total;
 
     m->ring_cursor++;
     if (m->ring_cursor >= m->pixmap_width)