/* we have four different types of top (top, top_mem,
* top_time and top_io). To avoid having almost-same code four
* times, we have this special handler. */
-#ifdef __linux__
break;
case OBJ_top:
case OBJ_top_mem:
case OBJ_top_io:
#endif
print_top(obj, p, p_max_size);
-#endif /* __linux__ */
OBJ(tail) {
print_tailhead("tail", obj, p, p_max_size);
}
#ifdef IOSTATS
top_io = 0;
#endif
-#ifdef __linux__
top_running = 0;
-#endif
#ifdef MPD
mpd_env_host = getenv("MPD_HOST");
mpd_env_port = getenv("MPD_PORT");
parse_platform_sensor(obj, arg);
END OBJ_ARG(hwmon, 0, "hwmon needs argumanets")
parse_hwmon_sensor(obj, arg);
+ END OBJ(addr, &update_net_stats)
+ parse_net_stat_arg(obj, arg, free_at_crash);
+ END OBJ(addrs, &update_net_stats)
+ parse_net_stat_arg(obj, arg, free_at_crash);
+#endif /* __linux__ */
END
/* we have four different types of top (top, top_mem, top_time and top_io). To
* avoid having almost-same code four times, we have this special
if (!parse_top_args(s, arg, obj)) {
return NULL;
}
- } else OBJ(addr, &update_net_stats)
- parse_net_stat_arg(obj, arg, free_at_crash);
- END OBJ(addrs, &update_net_stats)
- parse_net_stat_arg(obj, arg, free_at_crash);
-#endif /* __linux__ */
- END OBJ_ARG(tail, 0, "tail needs arguments")
+ } else
+ OBJ_ARG(tail, 0, "tail needs arguments")
init_tailhead("tail", arg, obj, free_at_crash);
END OBJ_ARG(head, 0, "head needs arguments")
init_tailhead("head", arg, obj, free_at_crash);
obj->sub = malloc(sizeof(struct text_object));
extract_variable_text_internal(obj->sub, arg);
END OBJ(processes, &update_total_processes)
-#ifdef __linux__
END OBJ(running_processes, &update_top)
top_running = 1;
+#ifdef __linux__
END OBJ(threads, &update_threads)
END OBJ(running_threads, &update_stat)
#else
#endif
__attribute__((gnu_inline)) inline void
-proc_find_top(struct process **cpu, struct process **mem);
+proc_find_top(struct process **cpu, struct process **mem, struct process **time);
static short cpu_setup = 0;
int update_top(void)
{
- proc_find_top(info.cpu, info.memu);
+ proc_find_top(info.cpu, info.memu, info.time);
return 0;
}
}
}
+int comparetime(const void *va, const void *vb)
+{
+ struct process *a = (struct process *)va, *b = (struct process *)vb;
+
+ return b->total_cpu_time - a->total_cpu_time;
+}
+
__attribute__((gnu_inline)) inline void
-proc_find_top(struct process **cpu, struct process **mem)
+proc_find_top(struct process **cpu, struct process **mem, struct process **time)
{
struct kinfo_proc *p;
int n_processes;
processes[j].amount = 100.0 * p[i].ki_pctcpu / FSCALE;
processes[j].vsize = p[i].ki_size;
processes[j].rss = (p[i].ki_rssize * getpagesize());
+ /* ki_runtime is in microseconds, total_cpu_time in centiseconds.
+ * Therefore we divide by 10000. */
+ processes[j].total_cpu_time = p[i].ki_runtime / 10000;
j++;
}
}
struct process *tmp, *ttmp;
tmp = malloc(sizeof(struct process));
- tmp->pid = processes[i].pid;
- tmp->amount = processes[i].amount;
+ memcpy(tmp, &processes[i], sizeof(struct process));
tmp->name = strndup(processes[i].name, text_buffer_size);
- tmp->rss = processes[i].rss;
- tmp->vsize = processes[i].vsize;
ttmp = mem[i];
mem[i] = tmp;
struct process *tmp, *ttmp;
tmp = malloc(sizeof(struct process));
- tmp->pid = processes[i].pid;
- tmp->amount = processes[i].amount;
+ memcpy(tmp, &processes[i], sizeof(struct process));
tmp->name = strndup(processes[i].name, text_buffer_size);
- tmp->rss = processes[i].rss;
- tmp->vsize = processes[i].vsize;
ttmp = cpu[i];
cpu[i] = tmp;
}
}
+ qsort(processes, j - 1, sizeof(struct process), comparetime);
+ for (i = 0; i < 10 && i < n_processes; i++) {
+ struct process *tmp, *ttmp;
+
+ tmp = malloc(sizeof(struct process));
+ memcpy(tmp, &processes[i], sizeof(struct process));
+ tmp->name = strndup(processes[i].name, text_buffer_size);
+
+ ttmp = time[i];
+ time[i] = tmp;
+ if (ttmp != NULL) {
+ free(ttmp->name);
+ free(ttmp);
+ }
+ }
+
#if defined(FREEBSD_DEBUG)
printf("=====\nmem\n");
for (i = 0; i < 10; i++) {