xref: /csrg-svn/lib/libc/gen/getloadavg.c (revision 44571)
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