]> Zhao Yanbai Git Server - minix.git/commitdiff
dynamic HZ
authorBen Gras <ben@minix3.org>
Thu, 11 Dec 2008 14:37:18 +0000 (14:37 +0000)
committerBen Gras <ben@minix3.org>
Thu, 11 Dec 2008 14:37:18 +0000 (14:37 +0000)
lib/posix/getloadavg.c

index 82fceba1c4e5d96cd1d244076402eaba85895281..adca7d847a462e6bc3fb9addf9492317753dfad2 100755 (executable)
@@ -9,16 +9,25 @@
 int getloadavg(double *loadavg, int nelem)
 {
   struct loadinfo loadinfo;
+  static u32_t system_hz = 0;
   int h, p, unfilled_ticks;
 #define PERIODS 3
   int minutes[3] = { 1, 5, 15 };
   size_t loadsize;
   ssize_t l;
+
   if(nelem < 1) {
        errno = ENOSPC;
        return -1;
   }
 
+  if(system_hz == 0) {
+       if((getsysinfo_up(PM_PROC_NR, SIU_SYSTEMHZ,
+         sizeof(system_hz), &system_hz)) < 0) {
+               system_hz = DEFAULT_HZ;
+       }
+  }
+
   loadsize = sizeof(loadinfo);
   if((l=getsysinfo_up(PM_PROC_NR, SIU_LOADINFO, loadsize, &loadinfo)) < 0)
        return -1;
@@ -28,7 +37,7 @@ int getloadavg(double *loadavg, int nelem)
        nelem = PERIODS;
 
   /* How many ticks are missing from the newest-filled slot? */
-#define TICKSPERSLOT (_LOAD_UNIT_SECS * sys_hz())
+#define TICKSPERSLOT (_LOAD_UNIT_SECS * system_hz)
   unfilled_ticks = TICKSPERSLOT - (loadinfo.last_clock % TICKSPERSLOT);
 
   for(p = 0; p < nelem; p++) {