freebsd-ports/x11/fbpanel/files/patch-cpu.c
Thierry Thomas 1dc45df688 Integrate patch written by Andreas Wiese <bzimage (at) gmx.net> from
BSD Crew Dresden, which ports the previously linux-only CPU plugin
to FreeBSD.

PR:		ports/97575
Submitted by:	Tobias Roth <ports (at) fsck.ch> (maintainer)
2006-05-26 12:37:08 +00:00

92 lines
2 KiB
C

--- plugins/cpu.c~ Tue May 16 19:23:18 2006
+++ plugins/cpu.c Tue May 16 19:00:07 2006
@@ -18,14 +18,24 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
-/*A little bug fixed by Mykola <mykola@2ka.mipt.ru>:) */
+/*
+ * A little bug fixed by Mykola <mykola@2ka.mipt.ru> :)
+ * FreeBSD support added by Andreas Wiese <aw@instandbesetzt.net>
+ */
#include <string.h>
#include <sys/time.h>
#include <time.h>
-#include <sys/sysinfo.h>
+#ifdef __FreeBSD__
+# include <sys/types.h>
+# include <sys/resource.h>
+# include <sys/sysctl.h>
+#else
+# include <sys/sysinfo.h>
+#endif
#include <stdlib.h>
+#include <stdio.h>
#include "plugin.h"
#include "panel.h"
@@ -60,6 +70,37 @@
struct cpu_stat cpu_anterior;
} cpu_t;
+#ifdef __FreeBSD__
+static void
+get_procstat(unsigned long *u, unsigned long *n, unsigned long *s,
+ unsigned long *i)
+{
+ static int mib[2] = { -1, -1 }, init = 0, j, realhz;
+ long ct[CPUSTATES];
+
+
+ if(init == 0) {
+ struct clockinfo ci;
+ j = sizeof(ci);
+ sysctlbyname("kern.clockrate", &ci, &j, NULL, 0);
+ realhz = ci.stathz ? ci.stathz : ci.hz;
+
+ j = 2;
+ sysctlnametomib("kern.cp_time", mib, &j);
+
+ init = 1;
+ j = sizeof(ct);
+ }
+
+ sysctl(mib, 2, ct, &j, NULL, 0);
+ *u = ct[CP_USER] / realhz;
+ *n = ct[CP_NICE] / realhz;
+ *s = ct[CP_SYS] / realhz;
+ *i = ct[CP_IDLE] / realhz;
+
+ return;
+}
+#endif
static int
cpu_update(cpu_t *c)
@@ -67,18 +108,24 @@
int cpu_u=0, cpu_s=0, cpu_n=0, cpu_i=100;
unsigned int i;
struct cpu_stat cpu, cpu_r;
+#ifndef __FreeBSD__
FILE *stat;
+#endif
float total;
ENTER;
if(!c->pixmap)
RET(TRUE);
+#ifdef __FreeBSD__
+ get_procstat(&cpu.u, &cpu.n, &cpu.s, &cpu.i);
+#else
stat = fopen("/proc/stat", "r");
if(!stat)
RET(TRUE);
fscanf(stat, "cpu %lu %lu %lu %lu", &cpu.u, &cpu.n, &cpu.s, &cpu.i);
fclose(stat);
+#endif
cpu_r.u = cpu.u - c->cpu_anterior.u;
cpu_r.n = cpu.n - c->cpu_anterior.n;