Add support for MemAvailable (!10)

MemAvailable is in /proc/meminfo since Linux 3.14.

This aligns the reported memory usage with the memory usage
reported by xfce4-systemload-plugin.

Closes !10
This commit is contained in:
Jan Ziak
2020-09-14 16:07:24 +02:00
committed by Andre Miranda
parent e3ba69c187
commit bed04577a5
7 changed files with 50 additions and 35 deletions

View File

@@ -219,7 +219,8 @@ gboolean get_cpu_usage (gushort *cpu_count, gfloat *cpu_user, gfloat *cpu_system
/* vmtotal values in #pg */ /* vmtotal values in #pg */
#define pagetok(nb) ((nb) * (getpagesize())) #define pagetok(nb) ((nb) * (getpagesize()))
gboolean get_memory_usage (guint64 *memory_total, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free) gboolean
get_memory_usage (guint64 *memory_total, guint64 *memory_available, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free)
{ {
#ifdef __OpenBSD__ #ifdef __OpenBSD__
int mib[] = {CTL_VM, VM_UVMEXP}; int mib[] = {CTL_VM, VM_UVMEXP};
@@ -250,6 +251,7 @@ gboolean get_memory_usage (guint64 *memory_total, guint64 *memory_free, guint64
*memory_cache = 0; *memory_cache = 0;
*memory_buffers = pagetok(vmtotal.t_rm - vmtotal.t_arm); *memory_buffers = pagetok(vmtotal.t_rm - vmtotal.t_arm);
#endif #endif
*memory_available = *memory_free + *memory_cache + *memory_buffers;
/* get swap stats */ /* get swap stats */
if ((nswap = swapctl(SWAP_NSWAP, 0, 0)) == 0) if ((nswap = swapctl(SWAP_NSWAP, 0, 0)) == 0)

View File

@@ -64,7 +64,7 @@ get_mem_by_pages (const gchar *name)
} }
gboolean gboolean
get_memory_usage (guint64 *memory_total, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free) get_memory_usage (guint64 *memory_total, guint64 *memory_available, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free)
{ {
/* Get memory usage */ /* Get memory usage */
{ {
@@ -72,6 +72,7 @@ get_memory_usage (guint64 *memory_total, guint64 *memory_free, guint64 *memory_c
*memory_free = get_mem_by_pages ("vm.stats.vm.v_free_count"); *memory_free = get_mem_by_pages ("vm.stats.vm.v_free_count");
*memory_cache = get_mem_by_pages ("vm.stats.vm.v_inactive_count"); *memory_cache = get_mem_by_pages ("vm.stats.vm.v_inactive_count");
*memory_buffers = get_mem_by_bytes ("vfs.bufspace"); *memory_buffers = get_mem_by_bytes ("vfs.bufspace");
*memory_available = *memory_free + *memory_cache + *memory_buffers;
} }
/* Get swap usage */ /* Get swap usage */

View File

@@ -22,42 +22,49 @@ static gushort _cpu_count = 0;
static gulong jiffies_total_delta = 0; static gulong jiffies_total_delta = 0;
gboolean gboolean
get_memory_usage (guint64 *memory_total, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free) get_memory_usage (guint64 *memory_total, guint64 *memory_available, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free)
{ {
FILE *file; FILE *file;
gchar buffer[1024];
gchar *filename = "/proc/meminfo"; gchar *filename = "/proc/meminfo";
gushort found = 0; gulong mem_total = 0,
mem_free = 0,
mem_avail = 0,
mem_cached = 0,
mem_buffers = 0,
swp_total = 0,
swp_free = 0;
if ((file = fopen (filename, "r")) == NULL) if ((file = fopen (filename, "r")) != NULL)
return FALSE;
*memory_total = 0;
*memory_free = 0;
*memory_cache = 0;
*memory_buffers = 0;
*swap_total = 0;
*swap_free = 0;
while (found < 6 && fgets (buffer, sizeof(buffer), file) != NULL)
{ {
found += sscanf (buffer, "MemTotal:\t%llu kB", (unsigned long long*)memory_total); gint found = 0;
found += sscanf (buffer, "MemFree:\t%llu kB", (unsigned long long*)memory_free); gchar buffer[256];
found += sscanf (buffer, "Cached:\t%llu kB", (unsigned long long*)memory_cache); while (found < 7 && fgets (buffer, sizeof(buffer), file) != NULL)
found += sscanf (buffer, "Buffers:\t%llu kB", (unsigned long long*)memory_buffers); {
found += sscanf (buffer, "SwapTotal:\t%llu kB", (unsigned long long*)swap_total); found += !mem_total ? sscanf (buffer, "MemTotal:\t%lu kB", &mem_total) : 0;
found += sscanf (buffer, "SwapFree:\t%llu kB", (unsigned long long*)swap_free); found += !mem_free ? sscanf (buffer, "MemFree:\t%lu kB", &mem_free) : 0;
found += !mem_avail ? sscanf (buffer, "MemAvailable:\t%lu kB", &mem_avail) : 0; /* Since Linux 3.14 */
found += !mem_cached ? sscanf (buffer, "Cached:\t%lu kB", &mem_cached) : 0;
found += !mem_buffers ? sscanf (buffer, "Buffers:\t%lu kB", &mem_buffers) : 0;
found += !swp_total ? sscanf (buffer, "SwapTotal:\t%lu kB", &swp_total) : 0;
found += !swp_free ? sscanf (buffer, "SwapFree:\t%lu kB", &swp_free) : 0;
}
fclose (file);
} }
fclose (file);
*memory_total *= 1024; if (mem_avail == 0)
*memory_free *= 1024; {
*memory_cache *= 1024; mem_avail = mem_free + mem_cached + mem_buffers;
*memory_buffers *= 1024; }
*swap_total *= 1024;
*swap_free *= 1024;
return TRUE; *memory_total = mem_total * 1024;
*memory_available = mem_avail * 1024;
*memory_free = mem_free * 1024;
*memory_cache = mem_cached * 1024;
*memory_buffers = mem_buffers * 1024;
*swap_total = swp_total * 1024;
*swap_free = swp_free * 1024;
return file ? TRUE : FALSE;
} }
gboolean gboolean

View File

@@ -25,12 +25,13 @@ static gushort _cpu_count = 0;
*/ */
gboolean gboolean
get_memory_usage (guint64 *memory_total, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free) get_memory_usage (guint64 *memory_total, guint64 *memory_available, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free)
{ {
*memory_total = 0; *memory_total = 0;
*memory_free = 0; *memory_free = 0;
*memory_cache = 0; *memory_cache = 0;
*memory_buffers = 0; *memory_buffers = 0;
*memory_available = 0;
*swap_total = 0; *swap_total = 0;
*swap_free = 0; *swap_free = 0;

View File

@@ -34,7 +34,7 @@ init_stats (void)
} }
gboolean gboolean
get_memory_usage (guint64 *memory_total, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free) get_memory_usage (guint64 *memory_total, guint64 *memory_available, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free)
{ {
kstat_t *ksp; kstat_t *ksp;
kstat_named_t *knp; kstat_named_t *knp;
@@ -52,6 +52,7 @@ get_memory_usage (guint64 *memory_total, guint64 *memory_free, guint64 *memory_c
*memory_free = getpagesize () * knp->value.ui64; *memory_free = getpagesize () * knp->value.ui64;
*memory_cache = 0; *memory_cache = 0;
*memory_buffers = 0; *memory_buffers = 0;
*memory_available = *memory_free + *memory_cache + *memory_buffers;
*swap_total = *swap_free = 0; *swap_total = *swap_free = 0;
if ((n = swapctl (SC_GETNSWP, NULL)) > 0) if ((n = swapctl (SC_GETNSWP, NULL)) > 0)

View File

@@ -60,6 +60,7 @@ struct _XtmTaskManager
gfloat cpu_user; gfloat cpu_user;
gfloat cpu_system; gfloat cpu_system;
guint64 memory_total; guint64 memory_total;
guint64 memory_available; /* free + cache + buffers + an-OS-specific-value */
guint64 memory_free; guint64 memory_free;
guint64 memory_cache; guint64 memory_cache;
guint64 memory_buffers; guint64 memory_buffers;
@@ -367,10 +368,10 @@ xtm_task_manager_get_system_info (XtmTaskManager *manager, guint *num_processes,
*num_processes = manager->tasks->len; *num_processes = manager->tasks->len;
/* Set memory and swap usage */ /* Set memory and swap usage */
get_memory_usage (&manager->memory_total, &manager->memory_free, &manager->memory_cache, &manager->memory_buffers, get_memory_usage (&manager->memory_total, &manager->memory_available, &manager->memory_free, &manager->memory_cache, &manager->memory_buffers,
&manager->swap_total, &manager->swap_free); &manager->swap_total, &manager->swap_free);
*memory_used = manager->memory_total - manager->memory_free - manager->memory_cache - manager->memory_buffers; *memory_used = manager->memory_total - manager->memory_available;
*memory_total = manager->memory_total; *memory_total = manager->memory_total;
*swap_used = manager->swap_total - manager->swap_free; *swap_used = manager->swap_total - manager->swap_free;
*swap_total = manager->swap_total; *swap_total = manager->swap_total;

View File

@@ -39,9 +39,11 @@ struct _Task
/** /**
* OS specific implementation. * OS specific implementation.
*
* memory_available = free + cache + buffers + an-OS-specific-value
*/ */
gboolean get_memory_usage (guint64 *memory_total, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free); gboolean get_memory_usage (guint64 *memory_total, guint64 *memory_available, guint64 *memory_free, guint64 *memory_cache, guint64 *memory_buffers, guint64 *swap_total, guint64 *swap_free);
gboolean get_cpu_usage (gushort *cpu_count, gfloat *cpu_user, gfloat *cpu_system); gboolean get_cpu_usage (gushort *cpu_count, gfloat *cpu_user, gfloat *cpu_system);
gboolean get_task_list (GArray *task_list); gboolean get_task_list (GArray *task_list);
gboolean pid_is_sleeping (GPid pid); gboolean pid_is_sleeping (GPid pid);