File procinfo-hz of Package procinfo

--- Makefile
+++ Makefile	2006-11-17 11:57:53.000000000 +0100
@@ -10,7 +10,7 @@ LDFLAGS = -s
 # If you get lots of `undefined references', you probably need -lncurses
 # instead:
 
-LDLIBS = -lncurses
+LDLIBS = -lncurses -lrt
 
 ### Add to taste:
 
--- procinfo.c
+++ procinfo.c	2006-11-27 11:53:42.000000000 +0100
@@ -83,6 +83,33 @@ float rate = 1.0;		/* per interval or pe
 struct info new, old, base;
 struct utsname ut;
 
+unsigned long sys_hz, usr_hz;
+
+void get_HZ(void)
+{
+    FILE* hzfp;
+
+    if (!access (PROC_DIR "sys/kernel/HZ", R_OK)) {
+	hzfp = myfopen (PROC_DIR "sys/kernel/HZ");
+	fscanf (hzfp, "%li", &sys_hz);
+	fclose (hzfp);
+    } else if (linux_version_code >= 0x20560) {
+	struct timespec ts;
+	if (clock_getres(CLOCK_REALTIME, &ts) < 0)
+	    sys_hz = 1000;
+	else {
+	    double res = ts.tv_sec+(((double)ts.tv_nsec)/1.0e9);
+	    sys_hz = (unsigned long)((1.0/res)+0.5);
+	}
+    } else
+	sys_hz = 100;
+    if ((long)(usr_hz = (unsigned long)sysconf(_SC_CLK_TCK)) == -1)
+#ifdef HZ
+	usr_hz = HZ;
+#else
+	usr_hz = 100;
+#endif
+}
 
 static void
 first_page (long sl)
@@ -100,7 +127,7 @@ first_page (long sl)
 
     fgets (line, sizeof (line), uptimefp);
     new.uptime =
-	(unsigned long) (atof (strtok (line, " ")) * (unsigned long) HZ);
+	(unsigned long) (atof (strtok (line, " ")) * (unsigned long) usr_hz);
 
 
 /**** /proc/meminfo ****/
@@ -333,15 +359,15 @@ first_page (long sl)
 /* XXX Is this stuff still relevant/true? */
 
 #ifdef __i386__		/* IRQ 0 is timer tick on i386's... */
-    if (nr_irqs) {
+    if (nr_irqs && new.intr[0]) {
 	if (fs && old.uptime)
-	    elapsed = DIFF (intr[0]);
+	    elapsed = (DIFF(intr[0]) * usr_hz) / sys_hz;
     } else
 #endif
 #ifdef __sparc__	/* IRQ 10 is timer tick on sparc's... */
-    if (nr_irqs) {
+    if (nr_irqs && new.intr[10]) {
 	if (fs && old.uptime)
-	    elapsed = DIFF (intr[10]);
+	    elapsed = (DIFF(intr[10]) * usr_hz) / sys_hz;
     } else
 #endif
     {
@@ -703,6 +729,7 @@ main (int ac, char **av)
     linux_version_code = (atol(strtok(ut.release, ".")) * 0x10000) +
 	(atol(strtok(NULL, ".")) * 0x100) +
 	atol(strtok(NULL, ""));
+    get_HZ();
 
     while ((getoptopt = getopt (ac, av, "sfn:madirDSF:bChv")) != EOF) {
 	switch (getoptopt) {
--- procinfo.h
+++ procinfo.h	2006-07-17 14:27:06.000000000 +0200
@@ -27,6 +27,8 @@
 
 #define ISSTR(s)	(!strcmp(s, type))
 
+extern unsigned long sys_hz, usr_hz;
+
 #if 0
 #define VAL		(strtoul(strtok(NULL, "\t "), NULL, 10))
 #else
--- routines.c
+++ routines.c	2006-07-17 14:32:21.000000000 +0200
@@ -390,7 +390,7 @@ hms (unsigned long t)
     unsigned int d, h, m, s;
     static char buf[22];
 
-    t = (t*100) / HZ;
+    t = (t*100ULL) / usr_hz;
     d = (unsigned int) (t / 8640000);
     t = t - (unsigned long) (d * 8640000);
     h = (unsigned int) (t / 360000);
@@ -413,6 +413,7 @@ perc (unsigned long i, unsigned long t, 
     unsigned int v;
     static char buf[16];
 
+    t = (t*100ULL) / usr_hz;
     if ((signed long) i == -1 || t == 0)
 	return "---.-%";
 
openSUSE Build Service is sponsored by