mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-12-27 04:32:55 +00:00
${top} fixes for FreeBSD
${top}, ${top_mem} and ${top_time} are now recognized as variables. The parts of code doing this were in a #ifdef __linux__. The total CPU time of processes (${top} with "time" argument) is now printable, and ${top_time} works. Signed-off-by: Alexander Graf <agraf@znc.in>
This commit is contained in:
parent
a44b3c3f47
commit
10bd81e77c
@ -2180,7 +2180,6 @@ void generate_text_internal(char *p, int p_max_size,
|
|||||||
/* we have four different types of top (top, top_mem,
|
/* we have four different types of top (top, top_mem,
|
||||||
* top_time and top_io). To avoid having almost-same code four
|
* top_time and top_io). To avoid having almost-same code four
|
||||||
* times, we have this special handler. */
|
* times, we have this special handler. */
|
||||||
#ifdef __linux__
|
|
||||||
break;
|
break;
|
||||||
case OBJ_top:
|
case OBJ_top:
|
||||||
case OBJ_top_mem:
|
case OBJ_top_mem:
|
||||||
@ -2189,7 +2188,6 @@ void generate_text_internal(char *p, int p_max_size,
|
|||||||
case OBJ_top_io:
|
case OBJ_top_io:
|
||||||
#endif
|
#endif
|
||||||
print_top(obj, p, p_max_size);
|
print_top(obj, p, p_max_size);
|
||||||
#endif /* __linux__ */
|
|
||||||
OBJ(tail) {
|
OBJ(tail) {
|
||||||
print_tailhead("tail", obj, p, p_max_size);
|
print_tailhead("tail", obj, p, p_max_size);
|
||||||
}
|
}
|
||||||
@ -4226,9 +4224,7 @@ static void set_default_configurations(void)
|
|||||||
#ifdef IOSTATS
|
#ifdef IOSTATS
|
||||||
top_io = 0;
|
top_io = 0;
|
||||||
#endif
|
#endif
|
||||||
#ifdef __linux__
|
|
||||||
top_running = 0;
|
top_running = 0;
|
||||||
#endif
|
|
||||||
#ifdef MPD
|
#ifdef MPD
|
||||||
mpd_env_host = getenv("MPD_HOST");
|
mpd_env_host = getenv("MPD_HOST");
|
||||||
mpd_env_port = getenv("MPD_PORT");
|
mpd_env_port = getenv("MPD_PORT");
|
||||||
|
15
src/core.c
15
src/core.c
@ -541,6 +541,11 @@ struct text_object *construct_text_object(const char *s, const char *arg, long
|
|||||||
parse_platform_sensor(obj, arg);
|
parse_platform_sensor(obj, arg);
|
||||||
END OBJ_ARG(hwmon, 0, "hwmon needs argumanets")
|
END OBJ_ARG(hwmon, 0, "hwmon needs argumanets")
|
||||||
parse_hwmon_sensor(obj, arg);
|
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
|
END
|
||||||
/* we have four different types of top (top, top_mem, top_time and top_io). To
|
/* 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
|
* avoid having almost-same code four times, we have this special
|
||||||
@ -551,12 +556,8 @@ struct text_object *construct_text_object(const char *s, const char *arg, long
|
|||||||
if (!parse_top_args(s, arg, obj)) {
|
if (!parse_top_args(s, arg, obj)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
} else OBJ(addr, &update_net_stats)
|
} else
|
||||||
parse_net_stat_arg(obj, arg, free_at_crash);
|
OBJ_ARG(tail, 0, "tail needs arguments")
|
||||||
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")
|
|
||||||
init_tailhead("tail", arg, obj, free_at_crash);
|
init_tailhead("tail", arg, obj, free_at_crash);
|
||||||
END OBJ_ARG(head, 0, "head needs arguments")
|
END OBJ_ARG(head, 0, "head needs arguments")
|
||||||
init_tailhead("head", arg, obj, free_at_crash);
|
init_tailhead("head", arg, obj, free_at_crash);
|
||||||
@ -786,9 +787,9 @@ struct text_object *construct_text_object(const char *s, const char *arg, long
|
|||||||
obj->sub = malloc(sizeof(struct text_object));
|
obj->sub = malloc(sizeof(struct text_object));
|
||||||
extract_variable_text_internal(obj->sub, arg);
|
extract_variable_text_internal(obj->sub, arg);
|
||||||
END OBJ(processes, &update_total_processes)
|
END OBJ(processes, &update_total_processes)
|
||||||
#ifdef __linux__
|
|
||||||
END OBJ(running_processes, &update_top)
|
END OBJ(running_processes, &update_top)
|
||||||
top_running = 1;
|
top_running = 1;
|
||||||
|
#ifdef __linux__
|
||||||
END OBJ(threads, &update_threads)
|
END OBJ(threads, &update_threads)
|
||||||
END OBJ(running_threads, &update_stat)
|
END OBJ(running_threads, &update_stat)
|
||||||
#else
|
#else
|
||||||
|
@ -67,7 +67,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
__attribute__((gnu_inline)) inline void
|
__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;
|
static short cpu_setup = 0;
|
||||||
|
|
||||||
@ -590,7 +590,7 @@ char get_freq(char *p_client_buffer, size_t client_buffer_size, const char *p_fo
|
|||||||
|
|
||||||
int update_top(void)
|
int update_top(void)
|
||||||
{
|
{
|
||||||
proc_find_top(info.cpu, info.memu);
|
proc_find_top(info.cpu, info.memu, info.time);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -726,8 +726,15 @@ int comparemem(const void *a, const void *b)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
__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;
|
struct kinfo_proc *p;
|
||||||
int n_processes;
|
int n_processes;
|
||||||
@ -751,6 +758,9 @@ proc_find_top(struct process **cpu, struct process **mem)
|
|||||||
processes[j].amount = 100.0 * p[i].ki_pctcpu / FSCALE;
|
processes[j].amount = 100.0 * p[i].ki_pctcpu / FSCALE;
|
||||||
processes[j].vsize = p[i].ki_size;
|
processes[j].vsize = p[i].ki_size;
|
||||||
processes[j].rss = (p[i].ki_rssize * getpagesize());
|
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++;
|
j++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -760,11 +770,8 @@ proc_find_top(struct process **cpu, struct process **mem)
|
|||||||
struct process *tmp, *ttmp;
|
struct process *tmp, *ttmp;
|
||||||
|
|
||||||
tmp = malloc(sizeof(struct process));
|
tmp = malloc(sizeof(struct process));
|
||||||
tmp->pid = processes[i].pid;
|
memcpy(tmp, &processes[i], sizeof(struct process));
|
||||||
tmp->amount = processes[i].amount;
|
|
||||||
tmp->name = strndup(processes[i].name, text_buffer_size);
|
tmp->name = strndup(processes[i].name, text_buffer_size);
|
||||||
tmp->rss = processes[i].rss;
|
|
||||||
tmp->vsize = processes[i].vsize;
|
|
||||||
|
|
||||||
ttmp = mem[i];
|
ttmp = mem[i];
|
||||||
mem[i] = tmp;
|
mem[i] = tmp;
|
||||||
@ -779,11 +786,8 @@ proc_find_top(struct process **cpu, struct process **mem)
|
|||||||
struct process *tmp, *ttmp;
|
struct process *tmp, *ttmp;
|
||||||
|
|
||||||
tmp = malloc(sizeof(struct process));
|
tmp = malloc(sizeof(struct process));
|
||||||
tmp->pid = processes[i].pid;
|
memcpy(tmp, &processes[i], sizeof(struct process));
|
||||||
tmp->amount = processes[i].amount;
|
|
||||||
tmp->name = strndup(processes[i].name, text_buffer_size);
|
tmp->name = strndup(processes[i].name, text_buffer_size);
|
||||||
tmp->rss = processes[i].rss;
|
|
||||||
tmp->vsize = processes[i].vsize;
|
|
||||||
|
|
||||||
ttmp = cpu[i];
|
ttmp = cpu[i];
|
||||||
cpu[i] = tmp;
|
cpu[i] = tmp;
|
||||||
@ -793,6 +797,22 @@ proc_find_top(struct process **cpu, struct process **mem)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
#if defined(FREEBSD_DEBUG)
|
||||||
printf("=====\nmem\n");
|
printf("=====\nmem\n");
|
||||||
for (i = 0; i < 10; i++) {
|
for (i = 0; i < 10; i++) {
|
||||||
|
Loading…
Reference in New Issue
Block a user