You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/x11-plugins/wmload/files/wmload-0.9.6-solaris.patch

133 lines
3.0 KiB

* original: http://www.rampant.org/~dp/software/wmload.solaris.patch
--- a/wmload.c
+++ b/wmload.c
@@ -6,6 +6,11 @@
#include <math.h>
#include <fcntl.h>
#include <X11/Xatom.h>
+#ifdef sun
+#include <sys/types.h>
+#include <sys/sysinfo.h>
+#include <kstat.h>
+#endif
#include "back.xpm"
#include "mask2.xbm"
@@ -410,6 +415,107 @@
return (char *)p;
}
+#ifdef sun
+
+static kstat_ctl_t *kc;
+static kstat_t **cpu_ksp_list;
+static int ncpus;
+
+void
+cpu_stats_init()
+{
+ int i = 0;
+ kstat_t *ksp;
+ static int kstats_ready = 0;
+
+ if (!kstats_ready) {
+ if ((kc = kstat_open()) == NULL) {
+ fprintf(stderr,"wmload: can't open /dev/kstat\n");
+ exit (1);
+ }
+ kstats_ready = 1;
+ }
+
+ for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) {
+ if (strcmp(ksp->ks_module, "cpu_stat") == 0)
+ i++;
+ }
+
+ if (cpu_ksp_list) {
+ free(cpu_ksp_list);
+ }
+ cpu_ksp_list = (kstat_t **) calloc(i * sizeof (kstat_t *), 1);
+ ncpus = i;
+
+ /*
+ * stash the ksp for each CPU.
+ */
+ i = 0;
+ for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next) {
+ if (strcmp(ksp->ks_module, "cpu_stat") == 0) {
+ cpu_ksp_list[i] = ksp;
+ i++;
+ }
+ }
+}
+
+int
+get_cpu_stats()
+{
+ int i;
+ cpu_stat_t stat;
+ static int firsttime = 1;
+
+ if (firsttime) {
+ firsttime = 0;
+ return (1); /* force code to go initialize kstat stuff */
+ }
+
+ /*
+ * Read each cpu's data. If the chain has changed (a state change
+ * has happened, maybe a new cpu was added to the system), then
+ * return 1. This will cause the code to reinitialize the cpu_ksp_list
+ * array. word.
+ */
+ cp_time[0] = cp_time[1] = cp_time[2] = cp_time[3] = 0;
+ for (i = 0; i < ncpus; i++) {
+ if (kstat_read(kc, cpu_ksp_list[i], (void *) &stat) == -1)
+ return (1);
+ cp_time[0] += stat.cpu_sysinfo.cpu[CPU_USER]; /* user */
+ cp_time[1] += stat.cpu_sysinfo.cpu[CPU_WAIT]; /* "nice" */
+ cp_time[2] += stat.cpu_sysinfo.cpu[CPU_KERNEL]; /* sys */
+ cp_time[3] += stat.cpu_sysinfo.cpu[CPU_IDLE]; /* idle ("free")*/
+ }
+ return (0);
+}
+
+void GetLoad(int Maximum, int *usr, int *nice, int *sys, int *free)
+{
+ int total;
+
+ while (get_cpu_stats() != 0) {
+ cpu_stats_init();
+ }
+
+ *usr = cp_time[0] - last[0];
+ *nice = cp_time[1] - last[1];
+ *sys = cp_time[2] - last[2];
+ *free = cp_time[3] - last[3];
+
+ /* printf("[%d %d %d %d]\n", *usr, *nice, *sys, *free); */
+
+ total = *usr + *nice + *sys + *free;
+ last[0] = cp_time[0];
+ last[1] = cp_time[1];
+ last[2] = cp_time[2];
+ last[3] = cp_time[3];
+
+ *usr = rint(Maximum * (float)(*usr) /total);
+ *nice =rint(Maximum * (float)(*nice) /total);
+ *sys = rint(Maximum * (float)(*sys) /total);
+ *free = rint(Maximum * (float)(*free) /total);
+}
+#else /* sun */
void GetLoad(int Maximum, int *usr, int *nice, int *sys, int *free)
{
char buffer[100];/*[4096+1];*/
@@ -445,6 +551,7 @@
*sys = rint(Maximum * (float)(*sys) /total);
*free = rint(Maximum * (float)(*free) /total);
}
+#endif
void InsertLoad()
{