diff options
-rw-r--r-- | sysdeps/linux/ChangeLog | 7 | ||||
-rw-r--r-- | sysdeps/linux/glibtop_server.h | 19 | ||||
-rw-r--r-- | sysdeps/linux/mem.c | 22 | ||||
-rw-r--r-- | sysdeps/linux/swap.c | 12 |
4 files changed, 40 insertions, 20 deletions
diff --git a/sysdeps/linux/ChangeLog b/sysdeps/linux/ChangeLog index df858368..d1d1b3bf 100644 --- a/sysdeps/linux/ChangeLog +++ b/sysdeps/linux/ChangeLog @@ -1,5 +1,12 @@ 2003-10-20 Bastien Nocera <hadess@hadess.net> + * glibtop_server.h: + * mem.c: (glibtop_get_mem_s): + * swap.c: (glibtop_get_swap_s): committing patch from Sebastien + Bacher <seb128@debian.org> for Linux 2.6 support (Closes: #104747) + +2003-10-20 Bastien Nocera <hadess@hadess.net> + * cpu.c: (glibtop_get_cpu_s): * procmap.c: (glibtop_get_proc_map_s): s/u_int64_t/guint64/ diff --git a/sysdeps/linux/glibtop_server.h b/sysdeps/linux/glibtop_server.h index 924747e7..4ff62746 100644 --- a/sysdeps/linux/glibtop_server.h +++ b/sysdeps/linux/glibtop_server.h @@ -57,6 +57,25 @@ skip_line (const char *p) return (char *) ++p; } +static inline unsigned long +get_scaled(const char *buffer, const char *key) +{ + const char *ptr; + char *next; + unsigned long value = 0; + + if ((ptr = strstr(buffer, key))) + { + ptr += strlen(key); + value = strtoul(ptr, &next, 0); + if (strchr(next, 'k')) + value *= 1024; + else if (strchr(next, 'M')) + value *= 1024 * 1024; + } + return value; +} + static inline int proc_file_to_buffer (char *buffer, const char *fmt, pid_t pid) { diff --git a/sysdeps/linux/mem.c b/sysdeps/linux/mem.c index 53b0f6a8..50062c32 100644 --- a/sysdeps/linux/mem.c +++ b/sysdeps/linux/mem.c @@ -65,17 +65,13 @@ glibtop_get_mem_s (glibtop *server, glibtop_mem *buf) buffer [len] = '\0'; - p = skip_line (buffer); - p = skip_token (p); /* "Mem:" */ - - buf->total = strtoul (p, &p, 0); - buf->used = strtoul (p, &p, 0); - buf->free = strtoul (p, &p, 0); - buf->shared = strtoul (p, &p, 0); - buf->buffer = strtoul (p, &p, 0); - buf->cached = strtoul (p, &p, 0); - - buf->user = buf->total - buf->free - buf->cached - buf->buffer; - - buf->flags = _glibtop_sysdeps_mem; + buf->total = get_scaled(buffer, "MemTotal:"); + buf->used = get_scaled(buffer, "Active:"); + buf->free = get_scaled(buffer, "MemFree:"); + buf->shared = get_scaled(buffer, "Mapped:"); + buf->buffer = get_scaled(buffer, "Buffers:"); + buf->cached = get_scaled(buffer, "Cached:"); + + buf->user = buf->total - buf->free - buf->cached - buf->buffer; + buf->flags = _glibtop_sysdeps_mem; } diff --git a/sysdeps/linux/swap.c b/sysdeps/linux/swap.c index 2a7d639b..70e5bb61 100644 --- a/sysdeps/linux/swap.c +++ b/sysdeps/linux/swap.c @@ -70,13 +70,11 @@ glibtop_get_swap_s (glibtop *server, glibtop_swap *buf) buffer [len] = '\0'; - p = skip_line (buffer); - p = skip_line (p); - p = skip_token (p); /* "Swap:" */ - - buf->total = strtoul (p, &p, 0); - buf->used = strtoul (p, &p, 0); - buf->free = strtoul (p, &p, 0); + /* Kernel 2.6 with multiple lines */ + + buf->total = get_scaled(buffer, "SwapTotal:"); + buf->free = get_scaled(buffer, "SwapFree:"); + buf->used = buf->total - buf->free; buf->flags = _glibtop_sysdeps_swap; |