+#else
+ if (info.cpu_count > 1) {
+ size = CPUSTATES * sizeof(int64_t);
+ for (i = 0; i < info.cpu_count; i++) {
+ int cp_time_mib[] = { CTL_KERN, KERN_CPTIME2, i };
+ if (sysctl(cp_time_mib, 3, &(fresh[i * CPUSTATES]), &size, NULL, 0)
+ < 0) {
+ ERR("sysctl kern.cp_time2 failed");
+ }
+ }
+ } else {
+ int cp_time_mib[] = { CTL_KERN, KERN_CPTIME };
+ long cp_time_tmp[CPUSTATES];
+
+ size = sizeof(cp_time_tmp);
+ if (sysctl(cp_time_mib, 2, cp_time_tmp, &size, NULL, 0) < 0) {
+ ERR("sysctl kern.cp_time failed");
+ }
+
+ for (i = 0; i < CPUSTATES; i++) {
+ fresh[i] = (int64_t) cp_time_tmp[i];
+ }
+ }
+
+ /* XXX Do sg with this int64_t => long => double ? float hell. */
+ for (i = 0; i < info.cpu_count; i++) {
+ int64_t used, total;
+ int at = i * CPUSTATES;
+
+ used = fresh[at + CP_USER] + fresh[at + CP_NICE] + fresh[at + CP_SYS];
+ total = used + fresh[at + CP_IDLE];
+
+ if ((total - oldtotal[i]) != 0) {
+ info.cpu_usage[i] = ((double) (used - oldused[i])) /
+ (double) (total - oldtotal[i]);
+ } else {
+ info.cpu_usage[i] = 0;
+ }
+
+ oldused[i] = used;
+ oldtotal[i] = total;
+ }
+#endif