diff probes/memory.c @ 9:6f2e13f5fcfd

Add the memory probe
author Louis Opter <louis@dotcloud.com>
date Sun, 02 Jan 2011 01:50:27 +0100
parents
children 3a1977ecccc7
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/probes/memory.c	Sun Jan 02 01:50:27 2011 +0100
@@ -0,0 +1,48 @@
+#include <sys/types.h>
+
+#include <assert.h>
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "lxcstats.h"
+#include "_lxcstats.h"
+
+static int
+read_stat(struct lxcst *c)
+{
+    char    path[PATH_MAX];
+    char    *values;
+    char    *fields[12];
+    int     ret;
+
+    _lxcst_join_path(path, sizeof(path), c->cgroup_dir, "memory.stat");
+    ret = _lxcst_read_file(path, &values);
+    if (ret > 0) {
+        values[ret - 1] = '\0'; /* Replace the last \n by a \0 */
+        if (_lxcst_strsplit(values, fields, ARRAY_SIZE(fields)) == ARRAY_SIZE(fields)) {
+            errno = 0;
+            c->memory.cached = strtoull(fields[1], NULL, 10);
+            c->memory.used = strtoull(fields[3], NULL, 10);
+            c->memory.mapped = strtoull(fields[5], NULL, 10);
+            c->memory.swapped = strtoull(fields[11], NULL, 10);
+            if (!errno) {
+                free(values);
+                return (0);
+            }
+        }
+        free(values);
+    }
+
+    memset(&c->memory, 0, sizeof(c->memory));
+    return (-1);
+}
+
+int
+_lxcst_probe_memory(struct lxcst *c)
+{
+    assert(c);
+
+    return (read_stat(c));
+}