diff --git a/bindings/SigarWrapper.pm b/bindings/SigarWrapper.pm index 52519a70..0cf2bbe3 100644 --- a/bindings/SigarWrapper.pm +++ b/bindings/SigarWrapper.pm @@ -312,6 +312,34 @@ our %classes = ( Win32 => 'taskman', }, }, + { + name => 'used_percent', type => 'Double', + desc => 'Percent total used system memory', + plat => '*', + cmd => { + AIX => '', + Darwin => '', + FreeBSD => '', + HPUX => '', + Linux => 'free', + Solaris => '', + Win32 => 'taskman', + }, + }, + { + name => 'free_percent', type => 'Double', + desc => 'Percent total free system memory', + plat => '*', + cmd => { + AIX => '', + Darwin => '', + FreeBSD => '', + HPUX => '', + Linux => 'free', + Solaris => '', + Win32 => 'taskman', + }, + }, ], Swap => [ { diff --git a/bindings/java/src/org/hyperic/sigar/test/TestMem.java b/bindings/java/src/org/hyperic/sigar/test/TestMem.java index 5c8e00ac..cdaf4f00 100644 --- a/bindings/java/src/org/hyperic/sigar/test/TestMem.java +++ b/bindings/java/src/org/hyperic/sigar/test/TestMem.java @@ -36,6 +36,10 @@ public class TestMem extends SigarTestCase { assertGtZeroTrace("Used", mem.getUsed()); + traceln("UsedPercent=" + mem.getUsedPercent()); + + traceln("FreePercent=" + mem.getFreePercent()); + assertGtZeroTrace("Free", mem.getFree()); assertGtZeroTrace("ActualUsed", mem.getUsed()); diff --git a/include/sigar.h b/include/sigar.h index 10b18da6..908827ee 100644 --- a/include/sigar.h +++ b/include/sigar.h @@ -141,6 +141,8 @@ typedef struct { free, actual_used, actual_free; + double used_percent; + double free_percent; } sigar_mem_t; SIGAR_DECLARE(int) sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem); diff --git a/src/os/darwin/darwin_sigar.c b/src/os/darwin/darwin_sigar.c index 56f52738..d4ef8786 100644 --- a/src/os/darwin/darwin_sigar.c +++ b/src/os/darwin/darwin_sigar.c @@ -457,11 +457,11 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem) mem->used = mem->total - mem->free; - sigar_mem_calc_ram(sigar, mem); - mem->actual_free = mem->free; mem->actual_used = mem->used; + sigar_mem_calc_ram(sigar, mem); + return SIGAR_OK; } diff --git a/src/os/hpux/hpux_sigar.c b/src/os/hpux/hpux_sigar.c index 6d7af50a..553e73de 100644 --- a/src/os/hpux/hpux_sigar.c +++ b/src/os/hpux/hpux_sigar.c @@ -79,8 +79,6 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem) mem->total = sigar->pstatic.physical_memory * pagesize; - sigar_mem_calc_ram(sigar, mem); - pstat_getdynamic(&stats, sizeof(stats), 1, 0); mem->free = stats.psd_free * pagesize; @@ -88,7 +86,9 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem) mem->actual_free = mem->free; mem->actual_used = mem->used; - + + sigar_mem_calc_ram(sigar, mem); + return SIGAR_OK; } diff --git a/src/os/linux/linux_sigar.c b/src/os/linux/linux_sigar.c index d5c4209b..235a81ad 100644 --- a/src/os/linux/linux_sigar.c +++ b/src/os/linux/linux_sigar.c @@ -441,9 +441,10 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem) mem->actual_free = mem->free + kern; mem->actual_used = mem->used - kern; + sigar_mem_calc_ram(sigar, mem); + if (get_ram(sigar, mem) != SIGAR_OK) { /* XXX other options on failure? */ - sigar_mem_calc_ram(sigar, mem); } return SIGAR_OK; diff --git a/src/os/osf1/osf1_sigar.c b/src/os/osf1/osf1_sigar.c index fdbca25b..5acb1d37 100644 --- a/src/os/osf1/osf1_sigar.c +++ b/src/os/osf1/osf1_sigar.c @@ -65,11 +65,11 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem) mem->free + mem->used + ((vmstats.inactive_count + vmstats.wire_count) * vmstats.pagesize); - sigar_mem_calc_ram(sigar, mem); - mem->actual_free = mem->free; mem->actual_used = mem->used; + sigar_mem_calc_ram(sigar, mem); + return SIGAR_OK; } diff --git a/src/os/solaris/solaris_sigar.c b/src/os/solaris/solaris_sigar.c index 728e4383..606ecf6e 100644 --- a/src/os/solaris/solaris_sigar.c +++ b/src/os/solaris/solaris_sigar.c @@ -172,8 +172,6 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem) mem->total = sysconf(_SC_PHYS_PAGES); mem->total <<= sigar->pagesize; - sigar_mem_calc_ram(sigar, mem); - if (sigar_kstat_update(sigar) == -1) { return errno; } @@ -194,6 +192,8 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem) mem->actual_free = mem->free; mem->actual_used = mem->used; + sigar_mem_calc_ram(sigar, mem); + return SIGAR_OK; } diff --git a/src/os/win32/win32_sigar.c b/src/os/win32/win32_sigar.c index a227e578..88130493 100644 --- a/src/os/win32/win32_sigar.c +++ b/src/os/win32/win32_sigar.c @@ -627,11 +627,11 @@ SIGAR_DECLARE(int) sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem) mem->used = mem->total - mem->free; - sigar_mem_calc_ram(sigar, mem); - mem->actual_free = mem->free; mem->actual_used = mem->used; + sigar_mem_calc_ram(sigar, mem); + return SIGAR_OK; } diff --git a/src/sigar_util.c b/src/sigar_util.c index 5626b3dd..fdb2b677 100644 --- a/src/sigar_util.c +++ b/src/sigar_util.c @@ -334,6 +334,12 @@ int sigar_mem_calc_ram(sigar_t *sigar, sigar_mem_t *mem) mem->ram = ram; + mem->used_percent = + ((double)(mem->total - mem->actual_free) * 100) / mem->total; + + mem->free_percent = + ((double)(mem->total - mem->actual_used) * 100) / mem->total; + return ram; }