Annotation of src/lib/libkvm/kvm_getloadavg.c, Revision 1.11
1.11 ! matt 1: /* $NetBSD: kvm_getloadavg.c,v 1.10 2010/09/26 22:28:05 jym Exp $ */
1.2 thorpej 2:
1.1 cgd 3: /*-
4: * Copyright (c) 1993
5: * The Regents of the University of California. All rights reserved.
6: *
7: * Redistribution and use in source and binary forms, with or without
8: * modification, are permitted provided that the following conditions
9: * are met:
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. Redistributions in binary form must reproduce the above copyright
13: * notice, this list of conditions and the following disclaimer in the
14: * documentation and/or other materials provided with the distribution.
1.8 agc 15: * 3. Neither the name of the University nor the names of its contributors
1.1 cgd 16: * may be used to endorse or promote products derived from this software
17: * without specific prior written permission.
18: *
19: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29: * SUCH DAMAGE.
30: */
31:
1.4 mikel 32: #include <sys/cdefs.h>
1.1 cgd 33: #if defined(LIBC_SCCS) && !defined(lint)
1.2 thorpej 34: #if 0
1.1 cgd 35: static char sccsid[] = "@(#)kvm_getloadavg.c 8.1 (Berkeley) 6/4/93";
1.2 thorpej 36: #else
1.11 ! matt 37: __RCSID("$NetBSD: kvm_getloadavg.c,v 1.10 2010/09/26 22:28:05 jym Exp $");
1.2 thorpej 38: #endif
1.1 cgd 39: #endif /* LIBC_SCCS and not lint */
40:
41: #include <sys/param.h>
42: #include <sys/time.h>
43: #include <sys/resource.h>
1.7 thorpej 44: #include <sys/lwp.h>
1.1 cgd 45: #include <sys/proc.h>
46: #include <sys/sysctl.h>
1.6 mrg 47: #include <uvm/uvm_param.h>
1.1 cgd 48:
49: #include <db.h>
50: #include <fcntl.h>
51: #include <limits.h>
52: #include <nlist.h>
53: #include <kvm.h>
1.3 mikel 54: #include <stdlib.h>
1.1 cgd 55:
56: #include "kvm_private.h"
57:
58: static struct nlist nl[] = {
1.11 ! matt 59: { .n_name = "_averunnable" },
1.1 cgd 60: #define X_AVERUNNABLE 0
1.11 ! matt 61: { .n_name = "_fscale" },
1.1 cgd 62: #define X_FSCALE 1
1.11 ! matt 63: { .n_name = "" },
1.1 cgd 64: };
65:
66: /*
67: * kvm_getloadavg() -- Get system load averages, from live or dead kernels.
68: *
69: * Put `nelem' samples into `loadavg' array.
70: * Return number of samples retrieved, or -1 on error.
71: */
72: int
1.9 jym 73: kvm_getloadavg(kvm_t *kd, double loadavg[], int nelem)
1.1 cgd 74: {
75: struct loadavg loadinfo;
76: struct nlist *p;
77: int fscale, i;
78:
79: if (ISALIVE(kd))
80: return (getloadavg(loadavg, nelem));
81:
82: if (kvm_nlist(kd, nl) != 0) {
83: for (p = nl; p->n_type != 0; ++p);
84: _kvm_err(kd, kd->program,
85: "%s: no such symbol", p->n_name);
86: return (-1);
87: }
88:
89: if (KREAD(kd, nl[X_AVERUNNABLE].n_value, &loadinfo)) {
90: _kvm_err(kd, kd->program, "can't read averunnable");
91: return (-1);
92: }
93:
94: /*
95: * Old kernels have fscale separately; if not found assume
96: * running new format.
97: */
98: if (!KREAD(kd, nl[X_FSCALE].n_value, &fscale))
99: loadinfo.fscale = fscale;
100:
101: nelem = MIN(nelem, sizeof(loadinfo.ldavg) / sizeof(fixpt_t));
102: for (i = 0; i < nelem; i++)
103: loadavg[i] = (double) loadinfo.ldavg[i] / loadinfo.fscale;
104: return (nelem);
105: }
CVSweb <webmaster@jp.NetBSD.org>