17770N/A--- libgtop-2.28.0/sysdeps/solaris/mem.c 2009-04-19 04:59:49.000000000 +0530
17770N/A+++ libgtop-2.28.0/sysdeps/solaris/mem.c.new 2009-11-24 14:42:33.575155966 +0530
17770N/A@@ -26,8 +26,42 @@
17770N/A #include <assert.h>
17770N/A #include <unistd.h>
17770N/A
17770N/A+#include <sys/vm_usage.h>
17770N/A+#include <sys/systeminfo.h>
17770N/A+#include <sys/types.h>
17770N/A+
17770N/A #include <glibtop_private.h>
17770N/A
17770N/A+unsigned int nrec; /* This is used in getvmusage to get the no of result structures */
17770N/A+char arch[10]; /* This is used in sysinfo to get kernel bitness */
17770N/A+
17770N/A+typedef struct vmusage32 {
17770N/A+ id_t vmu_zoneid;
17770N/A+ uint_t vmu_type;
17770N/A+ id_t vmu_id;
17770N/A+
17770N/A+ uint32_t vmu_rss_all;
17770N/A+ uint32_t vmu_rss_private;
17770N/A+ uint32_t vmu_rss_shared;
17770N/A+ uint32_t vmu_swap_all;
17770N/A+ uint32_t vmu_swap_private;
17770N/A+ uint32_t vmu_swap_shared;
17770N/A+} vmusage32_t;
17770N/A+
17770N/A+typedef struct vmusage64 {
17770N/A+ id_t vmu_zoneid;
17770N/A+ uint_t vmu_type;
17770N/A+ id_t vmu_id;
17770N/A+ int vmu_align_next_members_on_8_bytes;
17770N/A+
17770N/A+ uint64_t vmu_rss_all;
17770N/A+ uint64_t vmu_rss_private;
17770N/A+ uint64_t vmu_rss_shared;
17770N/A+ uint64_t vmu_swap_all;
17770N/A+ uint64_t vmu_swap_private;
17770N/A+ uint64_t vmu_swap_shared;
17770N/A+} vmusage64_t;
17770N/A+
17770N/A /* Init function. */
17770N/A
17770N/A void
17770N/A@@ -97,37 +131,28 @@
17770N/A }
17770N/A }
17770N/A
17770N/A- /* Bunyip module provides data in multiples of system page size */
17770N/A-
17770N/A- if((ksp = server->machine.bunyip) && kstat_read(kc, ksp, NULL) >= 0)
17770N/A- {
17770N/A- kn = kstat_data_lookup(ksp, "pages_exec");
17770N/A- if(kn)
17770N/A- {
17770N/A- buf->shared = (KN_VALUE << PAGESHIFT);
17770N/A- buf->flags |= (1 << GLIBTOP_MEM_SHARED);
17770N/A- }
17770N/A-
17770N/A- kn = kstat_data_lookup(ksp, "pages_vnode");
17770N/A- if(kn)
17770N/A- {
17770N/A- buf->buffer = (KN_VALUE << PAGESHIFT);
17770N/A- buf->flags |= (1 << GLIBTOP_MEM_BUFFER);
17770N/A- }
17770N/A-
17770N/A- kn = kstat_data_lookup(ksp, "pages_anon");
17770N/A- if(kn)
17770N/A- {
17770N/A- buf->user = (KN_VALUE << PAGESHIFT);
17770N/A- buf->flags |= (1 << GLIBTOP_MEM_USER);
17770N/A- }
17770N/A- else
17770N/A- goto user_old_way;
17770N/A- }
17770N/A- else /* Bunyip is not available, let's compute buf->user the old way */
17770N/A+ vmusage64_t *result = (vmusage64_t*) malloc(sizeof(vmusage64_t));
17770N/A+ vmusage32_t *vmu32;
17770N/A+ vmusage64_t *vmu64;
17770N/A+
17770N/A+ if(getvmusage(VMUSAGE_SYSTEM, 5, result, &nrec) != 0)
17770N/A {
17770N/A- user_old_way:
17770N/A- buf->user = buf->total - buf->free - buf->cached - buf->buffer;
17770N/A- buf->flags |= (1 << GLIBTOP_MEM_USER);
17770N/A+ buf->user = buf->total - buf->free - buf->cached - buf->buffer;
17770N/A+ buf->flags |= (1 << GLIBTOP_MEM_USER);
17770N/A+ free(result);
17770N/A+ return;
17770N/A }
17770N/A+ else {
17770N/A+ if(sysinfo(SI_ARCHITECTURE_64, arch, sizeof(arch)) < 0)
17770N/A+ {
17770N/A+ vmu32 = (vmusage32_t*) result;
17770N/A+ buf->user = vmu32->vmu_rss_all;
17770N/A+ }
17770N/A+ else {
17770N/A+ vmu64 = (vmusage64_t*) result;
17770N/A+ buf->user = vmu64->vmu_rss_all;
17770N/A+ }
17770N/A+ buf->flags |= (1 << GLIBTOP_MEM_USER);
17770N/A+ free(result);
17770N/A+ }
17770N/A }