summaryrefslogtreecommitdiff
path: root/sysdeps/bsd/cpu.c
diff options
context:
space:
mode:
authorBenoît Dejean <benoit@placenet.org>2007-02-18 01:10:53 +0000
committerBenoît Dejean <bdejean@src.gnome.org>2007-02-18 01:10:53 +0000
commit5a15e409cf8ec0d66691aedfb403b25995d026b5 (patch)
tree18a73bee52f688b8fdd39f0db80fc7fbde595a15 /sysdeps/bsd/cpu.c
parent747438e3340c2eb7eddfa3f32aa2a176edb34b14 (diff)
downloadlibgtop-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.c144
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;
+}