[libgtop] Add SMP support for OpenBSD
- From: Jasper Lievisse Adriaanse <jasperla src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgtop] Add SMP support for OpenBSD
- Date: Mon, 1 Sep 2014 13:21:44 +0000 (UTC)
commit 7326f8816d025a31b9625e9b1776c1bf455f5793
Author: Jasper Lievisse Adriaanse <jasper humppa nl>
Date: Mon Sep 1 15:21:31 2014 +0200
Add SMP support for OpenBSD
sysdeps/openbsd/cpu.c | 73 +++++++++++++++++++++++++++++++++++++++--------
sysdeps/openbsd/open.c | 21 ++++++++++++++
2 files changed, 81 insertions(+), 13 deletions(-)
---
diff --git a/sysdeps/openbsd/cpu.c b/sysdeps/openbsd/cpu.c
index efc25c6..e15f7cb 100644
--- a/sysdeps/openbsd/cpu.c
+++ b/sysdeps/openbsd/cpu.c
@@ -26,18 +26,22 @@
#include <glibtop_suid.h>
-#include <sys/sched.h>
-
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_IRQ);
+static const unsigned long _glibtop_sysdeps_cpu_smp =
+(1L << GLIBTOP_XCPU_TOTAL) + (1L << GLIBTOP_XCPU_USER) +
+(1L << GLIBTOP_XCPU_NICE) + (1L << GLIBTOP_XCPU_SYS) +
+(1L << GLIBTOP_XCPU_IDLE) + (1L << GLIBTOP_XCPU_IRQ);
+
/* MIB array for sysctl */
static int mib_length=2;
-static int mib [] = { CTL_KERN, KERN_CLOCKRATE };
-static int mib2 [] = { CTL_KERN, KERN_CPTIME };
+static int mib_cr [] = { CTL_KERN, KERN_CLOCKRATE };
+static int mib_cptime [] = { CTL_KERN, KERN_CPTIME };
+static int mib_cptime_s [] = { CTL_KERN, KERN_CPTIME2, 0 };
/* Init function. */
@@ -45,6 +49,9 @@ void
_glibtop_init_cpu_s (glibtop *server)
{
server->sysdeps.cpu = _glibtop_sysdeps_cpu;
+
+ if (server->ncpu)
+ server->sysdeps.cpu |= _glibtop_sysdeps_cpu_smp;
}
/* Provides information about cpu usage. */
@@ -52,13 +59,13 @@ _glibtop_init_cpu_s (glibtop *server)
void
glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf)
{
- gulong cpts [CPUSTATES];
-
- /* sysctl vars*/
+ long cpts [CPUSTATES];
+ int64_t *cp_times = NULL;
struct clockinfo ci;
size_t length;
+ int ncpu, i;
- glibtop_init_p (server, (1L << GLIBTOP_SYSDEPS_CPU), 0);
+ glibtop_init_s (&server, GLIBTOP_SYSDEPS_CPU, 0);
memset (buf, 0, sizeof (glibtop_cpu));
@@ -67,14 +74,14 @@ glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf)
return;
length = sizeof (cpts);
- if (sysctl (mib2, mib_length, cpts, &length, NULL, 0)) {
+ if (sysctl (mib_cptime, mib_length, cpts, &length, NULL, 0)) {
glibtop_warn_io_r (server, "sysctl (kern.cptime)");
return;
}
/* Get the clockrate data */
length = sizeof (struct clockinfo);
- if (sysctl (mib, mib_length, &ci, &length, NULL, 0)) {
+ if (sysctl (mib_cr, mib_length, &ci, &length, NULL, 0)) {
glibtop_warn_io_r (server, "sysctl (kern.clockrate)");
return;
}
@@ -87,15 +94,55 @@ glibtop_get_cpu_s (glibtop *server, glibtop_cpu *buf)
buf->sys = cpts [CP_SYS];
/* set idle time */
buf->idle = cpts [CP_IDLE];
- /* set interrupt time */
+ /* set irq */
buf->irq = cpts [CP_INTR];
/* set frequency */
- buf->frequency = ci.hz;
+ buf->frequency = (ci.stathz ? ci.stathz : ci.hz);
/* set total */
- buf->total = cpts [CP_USER] + cpts [CP_NICE]
+ buf->total = cpts [CP_USER] + cpts [CP_NICE] \
+ cpts [CP_SYS] + cpts [CP_IDLE] + cpts [CP_INTR];
+ ncpu = server->ncpu + 1;
+
+ /*
+ if (!cp_times) {
+ if ((cp_times = calloc(sizeof(int64_t *), ncpu)) == NULL)
+ return;
+ }
+ */
+
+ length = CPUSTATES * sizeof(int64_t);
+ for (i = 0; i < ncpu; i++) {
+ mib_cptime_s[2] = i;
+ cp_times = g_malloc (length);
+ if (sysctl (mib_cptime_s, 3, cp_times, &length, NULL, 0) < 0)
+ free(cp_times);
+
+ if (cp_times) {
+ buf->xcpu_user[i] = cp_times[CP_USER];
+ buf->xcpu_nice[i] = cp_times[CP_NICE];
+ buf->xcpu_sys[i] = cp_times[CP_SYS];
+ buf->xcpu_idle[i] = cp_times[CP_IDLE];
+ buf->xcpu_irq[i] = cp_times[CP_INTR];
+ } else {
+ buf->xcpu_user[i] = cpts [CP_USER] / ncpu;
+ buf->xcpu_nice[i] = cpts [CP_NICE] / ncpu;
+ buf->xcpu_sys[i] = cpts [CP_SYS] / ncpu;
+ buf->xcpu_idle[i] = cpts [CP_IDLE] / ncpu;
+ buf->xcpu_irq[i] = cpts [CP_INTR] / ncpu;
+ }
+ buf->xcpu_total[i] = buf->xcpu_user[i] + buf->xcpu_nice[i] \
+ + buf->xcpu_sys[i] + buf->xcpu_idle[i] \
+ + buf->xcpu_irq[i];
+ }
+
+ g_free (cp_times);
+
/* Set the flags last. */
buf->flags = _glibtop_sysdeps_cpu;
+
+ if (ncpu > 1) {
+ buf->flags |= _glibtop_sysdeps_cpu_smp;
+ }
}
diff --git a/sysdeps/openbsd/open.c b/sysdeps/openbsd/open.c
index 53e3f83..ad945e9 100644
--- a/sysdeps/openbsd/open.c
+++ b/sysdeps/openbsd/open.c
@@ -23,6 +23,8 @@
#include <sys/types.h>
#include <glibtop.h>
#include <glibtop/open.h>
+#include <glibtop/cpu.h>
+#include <glibtop/error.h>
#include <glibtop_private.h>
@@ -32,5 +34,24 @@ glibtop_open_s (glibtop *server, const char *program_name,
const unsigned long features,
const unsigned flags)
{
+ int ncpus = 1;
+ int mib[2] = { CTL_HW, HW_NCPU };
+ size_t len;
+
+ len = sizeof(ncpus);
+ if (sysctl(mib, 2, &ncpus, &len, NULL, 0) != 0)
+ printf("Couldn't determine hw.ncpu.\n");
+
+ server->real_ncpu = ncpus - 1;
+ server->ncpu = MIN(GLIBTOP_NCPU - 1, server->real_ncpu);
+
server->os_version_code = OpenBSD;
+
+ if (server->real_ncpu != server->ncpu) {
+ glibtop_warn_r(server,
+ "This machine has %d CPUs, "
+ "%d are being monitored.",
+ server->real_ncpu + 1,
+ server->ncpu + 1);
+ }
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]