]> Zhao Yanbai Git Server - minix.git/commitdiff
getloadavg() interface
authorBen Gras <ben@minix3.org>
Mon, 14 Nov 2005 15:48:12 +0000 (15:48 +0000)
committerBen Gras <ben@minix3.org>
Mon, 14 Nov 2005 15:48:12 +0000 (15:48 +0000)
lib/posix/Makefile
lib/posix/getloadavg.c [new file with mode: 0755]

index d8ba7dfd92f398fc9f14b159c8e01f6d8ba2388c..94bf96f7f7b21dbfc760dd389b775909dcefbd08 100755 (executable)
@@ -100,6 +100,7 @@ libc_OBJECTS        = \
        _readlink.o \
        _symlink.o \
        usleep.o \
+       getloadavg.o
 
 include ../Makefile.inc
 
diff --git a/lib/posix/getloadavg.c b/lib/posix/getloadavg.c
new file mode 100755 (executable)
index 0000000..a2e4f2c
--- /dev/null
@@ -0,0 +1,56 @@
+
+#include <sys/types.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <lib.h>
+
+/* Retrieve system load average information. */
+int getloadavg(double *loadavg, int nelem)
+{
+  struct loadinfo loadinfo;
+  int h, p, unfilled_ticks;
+#define PERIODS 3
+  int minutes[3] = { 1, 5, 15 };
+  if(nelem < 1) {
+       errno = ENOSPC;
+       return -1;
+  }
+
+  if(getsysinfo(PM_PROC_NR, SI_LOADINFO, &loadinfo) < 0)
+       return -1;
+  if(nelem > PERIODS)
+       nelem = PERIODS;
+
+  /* How many ticks are missing from the newest-filled slot? */
+#define TICKSPERSLOT (_LOAD_UNIT_SECS * HZ)
+  unfilled_ticks = TICKSPERSLOT - (loadinfo.last_clock % TICKSPERSLOT);
+
+  for(p = 0; p < nelem; p++) {
+    int h, offset, slots;
+    double l = 0.0;
+    int latest = loadinfo.proc_last_slot;
+    slots = minutes[p] * 60 / _LOAD_UNIT_SECS;
+
+    /* Add up the total number of process ticks for this number
+     * of minutes (minutes[p]). Start with the newest slot, which
+     * is latest, and count back for the number of slots that 
+     * correspond to the right number of minutes. Take wraparound
+     * into account by calculating the index modulo _LOAD_HISTORY,
+     * which is the number of slots of history kept.
+     */
+    for(h = 0; h < slots; h++) {
+       int slot;
+       slot = (latest - h + _LOAD_HISTORY) % _LOAD_HISTORY;
+       l += (double) loadinfo.proc_load_history[slot];
+    }
+
+    /* The load average over this number of minutes is the number of
+     * process-ticks divided by the number of ticks, not counting the
+     * number of ticks the last slot hasn't been around yet.
+     */
+    loadavg[p] = l / (slots * TICKSPERSLOT - unfilled_ticks);
+  }
+
+  return nelem;
+}
+