diff options
author | Benoît Dejean <benoit@placenet.org> | 2007-02-18 01:10:53 +0000 |
---|---|---|
committer | Benoît Dejean <bdejean@src.gnome.org> | 2007-02-18 01:10:53 +0000 |
commit | 5a15e409cf8ec0d66691aedfb403b25995d026b5 (patch) | |
tree | 18a73bee52f688b8fdd39f0db80fc7fbde595a15 /sysdeps/bsd/cpu.c | |
parent | 747438e3340c2eb7eddfa3f32aa2a176edb34b14 (diff) | |
download | libgtop-5a15e409cf8ec0d66691aedfb403b25995d026b5.tar.gz |
Huge (k)FreeBSD update. (k)FreeBSD support is freebsd/ Other BSD are in
2007-02-18 Benoît Dejean <benoit@placenet.org>
* configure.in:
* libgtop-sysdeps.m4:
* sysdeps/Makefile.am:
Huge (k)FreeBSD update.
(k)FreeBSD support is freebsd/
Other BSD are in bsd/
Patch by Joe Marcus Clarke <marcus@freebsd.org>
Alexander Nedotsukov <bland@FreeBSD.org>
Closes #407693.
svn path=/trunk/; revision=2557
Diffstat (limited to 'sysdeps/bsd/cpu.c')
-rw-r--r-- | sysdeps/bsd/cpu.c | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/sysdeps/bsd/cpu.c b/sysdeps/bsd/cpu.c new file mode 100644 index 00000000..9334529d --- /dev/null +++ b/sysdeps/bsd/cpu.c @@ -0,0 +1,144 @@ +/* $Id: cpu.c 2422 2005-12-12 09:38:15Z jamesh $ */ + +/* Copyright (C) 1998 Joshua Sled + This file is part of LibGTop 1.0. + + Contributed by Joshua Sled <jsled@xcf.berkeley.edu>, July 1998. + + LibGTop is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, + or (at your option) any later version. + + LibGTop is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with LibGTop; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include <config.h> +#include <glibtop.h> +#include <glibtop/error.h> +#include <glibtop/cpu.h> + +#include <glibtop_suid.h> + +#ifdef __NetBSD__ +#include <sys/sched.h> +#endif + +static const unsigned long _glibtop_sysdeps_cpu = +(1L << GLIBTOP_CPU_TOTAL) + (1L << GLIBTOP_CPU_USER) + +(1L << GLIBTOP_CPU_NICE) + (1L << GLIBTOP_CPU_SYS) + +(1L << GLIBTOP_CPU_IDLE) + (1L << GLIBTOP_CPU_FREQUENCY) + +(1L << GLIBTOP_CPU_IOWAIT); + +#ifndef KERN_CP_TIME +/* nlist structure for kernel access */ +static struct nlist nlst [] = { +#ifdef __bsdi__ + { "_cpustats" }, +#else + { "_cp_time" }, +#endif + { 0 } +}; +#endif + +/* MIB array for sysctl */ +static int mib_length=2; +static int mib [] = { CTL_KERN, KERN_CLOCKRATE }; +#ifdef KERN_CP_TIME +static int mib2 [] = { CTL_KERN, KERN_CP_TIME }; +#endif + +/* Init function. */ + +void +glibtop_init_cpu_p (glibtop *server) +{ +#ifndef KERN_CP_TIME + if (kvm_nlist (server->machine.kd, nlst) < 0) { + glibtop_warn_io_r (server, "kvm_nlist (cpu)"); + return; + } +#endif + + /* Set this only if kvm_nlist () succeeded. */ + server->sysdeps.cpu = _glibtop_sysdeps_cpu; +} + +/* Provides information about cpu usage. */ + +void +glibtop_get_cpu_p (glibtop *server, glibtop_cpu *buf) +{ +#ifdef KERN_CP_TIME + guint64 cpts [CPUSTATES]; +#else + long cpts [CPUSTATES]; +#endif + /* sysctl vars*/ + struct clockinfo ci; + size_t length; + + glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_CPU), 0); + + memset (buf, 0, sizeof (glibtop_cpu)); + + /* If this fails, the nlist may not be valid. */ + if (server->sysdeps.cpu == 0) + return; + +#ifdef KERN_CP_TIME + length = sizeof (cpts); + if (sysctl (mib2, mib_length, cpts, &length, NULL, 0)) { + glibtop_warn_io_r (server, "sysctl"); + return; + } +#else + if (kvm_read (server->machine.kd, nlst [0].n_value, + &cpts, sizeof (cpts)) != sizeof (cpts)) { + glibtop_warn_io_r (server, "kvm_read (cp_time)"); + return; + } +#endif + + /* Get the clockrate data */ + length = sizeof (struct clockinfo); + if (sysctl (mib, mib_length, &ci, &length, NULL, 0)) { + glibtop_warn_io_r (server, "sysctl"); + return; + } + + /* set user time */ + buf->user = cpts [CP_USER]; + /* set nice time */ + buf->nice = cpts [CP_NICE]; + /* set sys time */ + buf->sys = cpts [CP_SYS]; + /* set idle time */ + buf->idle = cpts [CP_IDLE]; + /* set iowait (really just interrupt) time */ + buf->iowait = cpts [CP_INTR]; + + /* set frequency */ + /* + FIXME -- is hz, tick, profhz or stathz wanted? + buf->frequency = sysctl("kern.clockrate", ...); + + struct clockinfo + */ + buf->frequency = ci.hz; + /* set total */ + buf->total = cpts [CP_USER] + cpts [CP_NICE] + + cpts [CP_SYS] + cpts [CP_IDLE]; + + /* Set the flags last. */ + buf->flags = _glibtop_sysdeps_cpu; +} |