1*44571Smarc /*- 238184Smckusick * Copyright (c) 1989 The Regents of the University of California. 338184Smckusick * All rights reserved. 438184Smckusick * 5*44571Smarc * %sccs.include.redist.c% 638184Smckusick */ 738184Smckusick 838184Smckusick #if defined(LIBC_SCCS) && !defined(lint) 9*44571Smarc static char sccsid[] = "@(#)getloadavg.c 6.2 (Berkeley) 06/29/90"; 10*44571Smarc #endif /* LIBC_SCCS and not lint */ 1138184Smckusick 1238184Smckusick #include <sys/param.h> 1338184Smckusick #include <sys/types.h> 1438184Smckusick #include <sys/file.h> 1538184Smckusick #include <nlist.h> 1638184Smckusick 1738184Smckusick static struct nlist nl[] = { 1838184Smckusick { "_averunnable" }, 1938184Smckusick #define X_AVERUNNABLE 0 2038184Smckusick { "_fscale" }, 2138184Smckusick #define X_FSCALE 1 2238184Smckusick { "" }, 2338184Smckusick }; 2438184Smckusick 2538184Smckusick /* 2638184Smckusick * getloadavg() -- Get system load averages. 2738184Smckusick * 2838184Smckusick * Put `nelem' samples into `loadavg' array. 2938184Smckusick * Return number of samples retrieved, or -1 on error. 3038184Smckusick */ 3138184Smckusick getloadavg(loadavg, nelem) 3238184Smckusick double loadavg[]; 3338184Smckusick int nelem; 3438184Smckusick { 3538184Smckusick static int need_nlist = 1; 3638184Smckusick fixpt_t averunnable[3]; 3738184Smckusick int fscale, kmemfd, i; 38*44571Smarc int alreadyopen; 3938184Smckusick 40*44571Smarc if ((alreadyopen = kvm_openfiles(NULL, NULL, NULL)) == -1) 41*44571Smarc return (-1); 42*44571Smarc /* 43*44571Smarc * cache nlist 44*44571Smarc */ 4538184Smckusick if (need_nlist) { 46*44571Smarc if (kvm_nlist(nl) != 0) 47*44571Smarc goto bad; 4838184Smckusick need_nlist = 0; 4938184Smckusick } 50*44571Smarc if (kvm_read((off_t)nl[X_AVERUNNABLE].n_value, (char *)averunnable, 51*44571Smarc sizeof(averunnable)) != sizeof(averunnable)) 5238184Smckusick goto bad; 53*44571Smarc if (kvm_read( (off_t)nl[X_FSCALE].n_value, (char *)&fscale, 54*44571Smarc sizeof(fscale)) != sizeof(fscale)) 5538184Smckusick goto bad; 5638184Smckusick nelem = MIN(nelem, sizeof(averunnable) / sizeof(averunnable[0])); 5738184Smckusick for (i = 0; i < nelem; i++) 5838184Smckusick loadavg[i] = (double) averunnable[i] / fscale; 59*44571Smarc if (!alreadyopen) 60*44571Smarc kvm_close(); 6138184Smckusick return (nelem); 6238184Smckusick 6338184Smckusick bad: 64*44571Smarc if (!alreadyopen) 65*44571Smarc kvm_close(); 6638184Smckusick return (-1); 6738184Smckusick } 68