patches/libgtop-03-getvmusage.diff
author yippi
Mon, 27 Sep 2010 21:07:51 +0000
changeset 20108 51df67ca9307
parent 17019 294f1481af90
permissions -rw-r--r--
I had these modules listed as being owned by me, but they are really owned by wangke, correcting.

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