diff --git a/lib/libc/other/sysconf.c b/lib/libc/other/sysconf.c index 51d00dd8d..f70b2f179 100644 --- a/lib/libc/other/sysconf.c +++ b/lib/libc/other/sysconf.c @@ -10,6 +10,27 @@ #include #include #include +#include +#include + +PRIVATE u32_t get_hz(void) +{ + FILE *fp; + u32_t hz; + int r; + + if ((fp = fopen(_PATH_PROC "/hz", "r")) != NULL) + { + r = fscanf(fp, "%lu", &hz); + + fclose(fp); + + if (r == 1) + return hz; + } + + return DEFAULT_HZ; +} PUBLIC long int sysconf(name) int name; /* property being inspected */ @@ -22,7 +43,7 @@ int name; /* property being inspected */ return (long) CHILD_MAX; case _SC_CLK_TCK: - return (long) CLOCKS_PER_SEC; + return (long) get_hz(); case _SC_NGROUPS_MAX: return (long) NGROUPS_MAX; diff --git a/lib/libc/posix/getloadavg.c b/lib/libc/posix/getloadavg.c index 70253473b..c19f3a4d5 100644 --- a/lib/libc/posix/getloadavg.c +++ b/lib/libc/posix/getloadavg.c @@ -1,71 +1,35 @@ #include -#include +#include #include +#include #include #include /* Retrieve system load average information. */ 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; + FILE *fp; + int i; 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; - } + if((fp = fopen(_PATH_PROC "/loadavg", "r")) == NULL) + return -1; + + for(i = 0; i < nelem; i++) + if(fscanf(fp, "%lf", &loadavg[i]) != 1) + break; + + fclose(fp); + + if (i == 0) { + errno = ENOENT; + return -1; } - loadsize = sizeof(loadinfo); - if((l=getsysinfo_up(PM_PROC_NR, SIU_LOADINFO, loadsize, &loadinfo)) < 0) - return -1; - if(l != sizeof(loadinfo)) - return -1; - if(nelem > PERIODS) - nelem = PERIODS; - - /* How many ticks are missing from the newest-filled slot? */ -#define TICKSPERSLOT (_LOAD_UNIT_SECS * system_hz) - unfilled_ticks = TICKSPERSLOT - (loadinfo.last_clock % TICKSPERSLOT); - - for(p = 0; p < nelem; p++) { - int h, 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; + return i; } -