summaryrefslogtreecommitdiff
path: root/x11/fbpanel/files/patch-cpu.c
blob: b5cff099833567cf70c4f871b1993fa6081cabf6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
--- 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;