getloadavg() interface
This commit is contained in:
parent
a894f5842f
commit
282e2f8e78
2 changed files with 57 additions and 0 deletions
|
@ -100,6 +100,7 @@ libc_OBJECTS = \
|
|||
_readlink.o \
|
||||
_symlink.o \
|
||||
usleep.o \
|
||||
getloadavg.o
|
||||
|
||||
include ../Makefile.inc
|
||||
|
||||
|
|
56
lib/posix/getloadavg.c
Executable file
56
lib/posix/getloadavg.c
Executable file
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in a new issue