This doesnt appy on 8.0 assume prob OK for 7.2 & maybe 7.1 probably been applied by now. comes from gary or someone else not me. Index: src/sysdeps/freebsd.c diff -u -p src/sysdeps/freebsd.c.orig src/sysdeps/freebsd.c --- src/sysdeps/freebsd.c.orig 2008-10-28 13:56:41.488450003 +0900 +++ src/sysdeps/freebsd.c 2008-10-28 21:53:17.499730207 +0900 @@ -102,14 +102,20 @@ gk_sysctlnametomib(const char *name, int #endif static int oid_cp_time[CTL_MAXNAME + 2]; +static int oid_cp_times[CTL_MAXNAME + 2]; static size_t oid_cp_time_len = sizeof(oid_cp_time); +static size_t oid_cp_times_len = sizeof(oid_cp_times); static gint have_cp_time; +static gint maxid; +static gint ncpus; +static u_long cpumask; +static long *cp_times; void gkrellm_sys_cpu_read_data(void) { - long cp_time[CPUSTATES]; - size_t len = sizeof(cp_time); + long cp_time[CPUSTATES], *cp_timep; + size_t len; #if __FreeBSD_version < 500000 static struct nlist nl[] = { #define N_CP_TIME 0 @@ -120,8 +126,9 @@ gkrellm_sys_cpu_read_data(void) if (have_cp_time) { - if (sysctl(oid_cp_time, oid_cp_time_len, - cp_time, &len, 0, 0) < 0) + len = sizeof(cp_time); + if (sysctl(oid_cp_time, oid_cp_time_len, cp_time, &len, + NULL, 0) < 0) return; } #if __FreeBSD_version < 500000 @@ -138,21 +145,90 @@ gkrellm_sys_cpu_read_data(void) } #endif - /* Currently, SMP is not supported */ - gkrellm_cpu_assign_data(0, cp_time[CP_USER], cp_time[CP_NICE], - cp_time[CP_SYS], cp_time[CP_IDLE]); + if (ncpus > 1) + { + gint i, j; + + gkrellm_cpu_assign_composite_data(cp_time[CP_USER], + cp_time[CP_NICE], + cp_time[CP_SYS], + cp_time[CP_IDLE]); + + len = (maxid + 1) * sizeof(long) * CPUSTATES; + if (sysctl(oid_cp_times, oid_cp_times_len, cp_times, &len, + NULL, 0) < 0) + return; + for (i = j = 0; i <= maxid; ++i) + { + if ((cpumask & (1ul << i)) == 0) + continue; + cp_timep = &cp_times[i * CPUSTATES]; + gkrellm_cpu_assign_data(j, cp_timep[CP_USER], + cp_timep[CP_NICE], + cp_timep[CP_SYS], + cp_timep[CP_IDLE]); + ++j; + } + } + else + gkrellm_cpu_assign_data(0, cp_time[CP_USER], cp_time[CP_NICE], + cp_time[CP_SYS], cp_time[CP_IDLE]); } gboolean gkrellm_sys_cpu_init(void) { - static char *name = "kern.cp_time"; - - gkrellm_cpu_set_number_of_cpus(1); + gint have_cp_times = FALSE; + gint maxcpus; + size_t len; + long *p; + + if (gk_sysctlnametomib("kern.cp_time", oid_cp_time, + &oid_cp_time_len) >= 0) + have_cp_time = TRUE; + + len = sizeof(maxcpus); + if (sysctlbyname("kern.smp.maxcpus", &maxcpus, &len, NULL, 0) >= 0) + { + gint empty, i, j; + + if (gk_sysctlnametomib("kern.cp_times", oid_cp_times, + &oid_cp_times_len) < 0) + goto pcpu_probe_done; + len = maxcpus * sizeof(long) * CPUSTATES; + if ((cp_times = malloc(len)) == NULL) + goto pcpu_probe_done; + if (sysctl(oid_cp_times, oid_cp_times_len, cp_times, &len, + NULL, 0) < 0) + { + free(cp_times); + cp_times = NULL; + goto pcpu_probe_done; + } + maxid = (len / CPUSTATES / sizeof(long)) - 1; + cpumask = 0; + ncpus = 0; + for (i = 0; i <= maxid; ++i) + { + empty = 1; + for (j = 0; empty && j < CPUSTATES; ++j) + if (cp_times[i * CPUSTATES + j] != 0) + empty = 0; + if (!empty) + { + cpumask |= (1ul << i); + ++ncpus; + } + } + if ((p = realloc(cp_times, len)) != NULL) + cp_times = p; + have_cp_times = TRUE; + } - if (gk_sysctlnametomib(name, oid_cp_time, &oid_cp_time_len) < 0) - return TRUE; - ++have_cp_time; +pcpu_probe_done: + if (!have_cp_times) + ncpus = 1; + gkrellm_cpu_set_number_of_cpus(ncpus); return TRUE; } @@ -909,7 +985,7 @@ get_bufspace(guint64 *bufspacep) } if (sysctl(oid_bufspace, oid_bufspace_len, - &bufspace, &bufspace_len, 0, 0) < 0) + &bufspace, &bufspace_len, NULL, 0) < 0) return 0; #endif *bufspacep = bufspace; @@ -1005,7 +1081,7 @@ gkrellm_sys_mem_read_data(void) } for (i = 0; mibs[i].name; ++i) if (sysctl(mibs[i].oid, mibs[i].oid_len, &mibs[i].value, - &mibs[i].value_len, 0, 0) < 0) + &mibs[i].value_len, NULL, 0) < 0) return; total = (mibs[MIB_V_PAGE_COUNT].value - mibs[MIB_V_WIRE_COUNT].value) << pshift;