diff options
author | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2013-07-31 19:02:56 +0000 |
---|---|---|
committer | Jakub Zawadzki <darkjames-ws@darkjames.pl> | 2013-07-31 19:02:56 +0000 |
commit | a9b8779fb92525eeeca8afb8a13c86f613d05ef5 (patch) | |
tree | 526dd2d51e76e0a4091013766d07aa729f4ca7d5 /epan/app_mem_usage.c | |
parent | 1cabad610b4a4497d5b17b5939e2798213bfa6da (diff) |
Linux: add support for getting total/rss from /proc/self/statm
svn path=/trunk/; revision=51070
Diffstat (limited to 'epan/app_mem_usage.c')
-rw-r--r-- | epan/app_mem_usage.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/epan/app_mem_usage.c b/epan/app_mem_usage.c index ba2a8cc431..f417684032 100644 --- a/epan/app_mem_usage.c +++ b/epan/app_mem_usage.c @@ -24,6 +24,8 @@ #include "config.h" +#include <stdio.h> + #include <glib.h> #ifdef _WIN32 @@ -31,6 +33,13 @@ #include <psapi.h> #endif /* _WIN32 */ +#if defined(__linux__) +# include <sys/types.h> +# include <sys/stat.h> +# include <unistd.h> +# include <fcntl.h> +#endif + #include "app_mem_usage.h" #define MAX_COMPONENTS 16 @@ -62,6 +71,83 @@ win32_get_total_mem_used_by_app(void) #endif /* (_WIN32) */ +#if defined(__linux__) + +static gboolean +linux_get_memory(gsize *ptotal, gsize *prss) +{ + static int fd = -1; + static intptr_t pagesize = 0; + + char buf[128]; + unsigned long total, rss; + ssize_t ret; + + if (!pagesize) + pagesize = sysconf(_SC_PAGESIZE); + + if (pagesize == -1) + return FALSE; + + if (fd < 0) { + char path[64]; + + g_snprintf(path, sizeof(path), "/proc/%d/statm", getpid()); + + fd = open(path, O_RDONLY); + + /* XXX, fallback to some other /proc file ? */ + } + + if (fd < 0) + return FALSE; + + ret = pread(fd, buf, sizeof(buf)-1, 0); + if (ret <= 0) + return FALSE; + + buf[ret] = '\0'; + + if (sscanf(buf, "%lu %lu", &total, &rss) != 2) + return FALSE; + + if (ptotal) + *ptotal = pagesize * (gsize) total; + if (prss) + *prss = pagesize * (gsize) rss; + + return TRUE; +} + +static gsize +linux_get_total_mem_used_by_app(void) +{ + gsize total; + + if (!linux_get_memory(&total, NULL)) + total = 0; + + return total; +} + +static gsize +linux_get_rss_mem_used_by_app(void) +{ + gsize rss; + + if (!linux_get_memory(NULL, &rss)) + rss = 0; + + return rss; +} + +#define get_total_mem_used_by_app linux_get_total_mem_used_by_app + +#define get_rss_mem_used_by_app linux_get_rss_mem_used_by_app + +#endif + +/* XXX, BSD 4.3: getrusage() -> ru_ixrss ? */ #ifdef get_total_mem_used_by_app static const ws_mem_usage_t total_usage = { "Total", get_total_mem_used_by_app, NULL }; |