diff --git a/sysdeps/solaris/glibtop_machine.h b/sysdeps/solaris/glibtop_machine.h index dc0e66fb..c38f3c41 100644 --- a/sysdeps/solaris/glibtop_machine.h +++ b/sysdeps/solaris/glibtop_machine.h @@ -55,7 +55,7 @@ struct _glibtop_machine kstat_t *syspages; /* memory usage */ kstat_t *bunyip; /* more memory usage */ - int pagesize; /* in kilobytes */ + int pagesize; /* in bits to shift, ie. 2^pagesize gives Kb */ int ticks; /* clock ticks, as returned by sysconf() */ unsigned long long boot; /* boot time, it's ui32 in kstat */ }; diff --git a/sysdeps/solaris/mem.c b/sysdeps/solaris/mem.c index ac21f0cb..7c7edc18 100644 --- a/sysdeps/solaris/mem.c +++ b/sysdeps/solaris/mem.c @@ -59,7 +59,7 @@ glibtop_get_mem_s (glibtop *server, glibtop_mem *buf) memset (buf, 0, sizeof (glibtop_mem)); - buf->total = (u_int64_t)sysconf(_SC_PHYS_PAGES) * pagesize; + buf->total = (u_int64_t)sysconf(_SC_PHYS_PAGES) << pagesize; buf->flags = _glibtop_sysdeps_mem_os_sysconf; if(!kc) @@ -77,18 +77,18 @@ glibtop_get_mem_s (glibtop *server, glibtop_mem *buf) if(kn) { #ifdef _LP64 - buf->free = kn->value.ui64 * pagesize; + buf->free = kn->value.ui64 << pagesize; #else - buf->free = kn->value.ui32 * pagesize; + buf->free = kn->value.ui32 << pagesize; #endif buf->used = buf->total - buf->free; } kn = (kstat_named_t *)kstat_data_lookup(ksp, "pageslocked"); if(kn) #ifdef _LP64 - buf->locked = kn->value.ui64 * pagesize; + buf->locked = kn->value.ui64 << pagesize; #else - buf->locked = kn->value.ui32 * pagesize; + buf->locked = kn->value.ui32 << pagesize; #endif buf->flags += _glibtop_sysdeps_mem_os_kstat; } @@ -100,23 +100,23 @@ glibtop_get_mem_s (glibtop *server, glibtop_mem *buf) kn = (kstat_named_t *)kstat_data_lookup(ksp, "pages_anon"); if(kn) #ifdef _LP64 - buf->user = kn->value.ui64 * pagesize; + buf->user = kn->value.ui64 << pagesize; #else - buf->user = kn->value.ui32 * pagesize; + buf->user = kn->value.ui32 << pagesize; #endif kn = (kstat_named_t *)kstat_data_lookup(ksp, "pages_exec"); if(kn) #ifdef _LP64 - buf->shared = kn->value.ui64 * pagesize; + buf->shared = kn->value.ui64 << pagesize; #else - buf->shared = kn->value.ui32 * pagesize; + buf->shared = kn->value.ui32 << pagesize; #endif kn = (kstat_named_t *)kstat_data_lookup(ksp, "pages_vnode"); if(kn) #ifdef _LP64 - buf->buffer = kn->value.ui64 * pagesize; + buf->buffer = kn->value.ui64 << pagesize; #else - buf->buffer = kn->value.ui32 * pagesize; + buf->buffer = kn->value.ui32 << pagesize; #endif buf->flags += _glibtop_sysdeps_mem_bunyip; } diff --git a/sysdeps/solaris/open.c b/sysdeps/solaris/open.c index 78d1f59a..ac8b6822 100644 --- a/sysdeps/solaris/open.c +++ b/sysdeps/solaris/open.c @@ -130,10 +130,13 @@ glibtop_open_s (glibtop *server, const char *program_name, kstat_ctl_t *kc; kstat_t *ksp; kstat_named_t *kn; + int i, page; server->name = program_name; - server->machine.pagesize = sysconf(_SC_PAGESIZE) >> 10; + page = sysconf(_SC_PAGESIZE) >> 10; + for(i = 0; page; ++i, page >>= 1); + server->machine.pagesize = i; server->machine.ticks = sysconf(_SC_CLK_TCK); server->machine.kc = kc = kstat_open (); diff --git a/sysdeps/solaris/procmem.c b/sysdeps/solaris/procmem.c index b44e9cca..1e593df5 100644 --- a/sysdeps/solaris/procmem.c +++ b/sysdeps/solaris/procmem.c @@ -42,6 +42,7 @@ void glibtop_get_proc_mem_s (glibtop *server, glibtop_proc_mem *buf, pid_t pid) { + int pagesize = server->machine.pagesize; struct psinfo psinfo; memset (buf, 0, sizeof (glibtop_proc_mem)); @@ -49,8 +50,8 @@ glibtop_get_proc_mem_s (glibtop *server, glibtop_proc_mem *buf, if(glibtop_get_proc_data_psinfo_s(server, &psinfo, pid)) return; - buf->size = buf->vsize = psinfo.pr_size; - buf->resident = buf->rss = psinfo.pr_rssize; + buf->size = buf->vsize = psinfo.pr_size >> pagesize; + buf->resident = buf->rss = psinfo.pr_rssize >> pagesize; buf->flags = _glibtop_sysdeps_proc_mem; }