mirror of
https://github.com/Llewellynvdm/conky.git
synced 2024-11-18 02:55:12 +00:00
top: convert to generic object payload
This commit is contained in:
parent
4b0c1d3226
commit
0dc60481cf
102
src/conky.c
102
src/conky.c
@ -711,46 +711,6 @@ void parse_conky_vars(struct text_object *root, const char *txt, char *p, struct
|
|||||||
generate_text_internal(p, max_user_text, *root, cur);
|
generate_text_internal(p, max_user_text, *root, cur);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *format_time(unsigned long timeval, const int width)
|
|
||||||
{
|
|
||||||
char buf[10];
|
|
||||||
unsigned long nt; // narrow time, for speed on 32-bit
|
|
||||||
unsigned cc; // centiseconds
|
|
||||||
unsigned nn; // multi-purpose whatever
|
|
||||||
|
|
||||||
nt = timeval;
|
|
||||||
cc = nt % 100; // centiseconds past second
|
|
||||||
nt /= 100; // total seconds
|
|
||||||
nn = nt % 60; // seconds past the minute
|
|
||||||
nt /= 60; // total minutes
|
|
||||||
if (width >= snprintf(buf, sizeof buf, "%lu:%02u.%02u",
|
|
||||||
nt, nn, cc)) {
|
|
||||||
return strndup(buf, text_buffer_size);
|
|
||||||
}
|
|
||||||
if (width >= snprintf(buf, sizeof buf, "%lu:%02u", nt, nn)) {
|
|
||||||
return strndup(buf, text_buffer_size);
|
|
||||||
}
|
|
||||||
nn = nt % 60; // minutes past the hour
|
|
||||||
nt /= 60; // total hours
|
|
||||||
if (width >= snprintf(buf, sizeof buf, "%lu,%02u", nt, nn)) {
|
|
||||||
return strndup(buf, text_buffer_size);
|
|
||||||
}
|
|
||||||
nn = nt; // now also hours
|
|
||||||
if (width >= snprintf(buf, sizeof buf, "%uh", nn)) {
|
|
||||||
return strndup(buf, text_buffer_size);
|
|
||||||
}
|
|
||||||
nn /= 24; // now days
|
|
||||||
if (width >= snprintf(buf, sizeof buf, "%ud", nn)) {
|
|
||||||
return strndup(buf, text_buffer_size);
|
|
||||||
}
|
|
||||||
nn /= 7; // now weeks
|
|
||||||
if (width >= snprintf(buf, sizeof buf, "%uw", nn)) {
|
|
||||||
return strndup(buf, text_buffer_size);
|
|
||||||
}
|
|
||||||
// well shoot, this outta' fit...
|
|
||||||
return strndup("<inf>", text_buffer_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void format_media_player_time(char *buf, const int size,
|
static inline void format_media_player_time(char *buf, const int size,
|
||||||
int seconds)
|
int seconds)
|
||||||
{
|
{
|
||||||
@ -2106,70 +2066,14 @@ void generate_text_internal(char *p, int p_max_size,
|
|||||||
* times, we have this special handler. */
|
* times, we have this special handler. */
|
||||||
break;
|
break;
|
||||||
case OBJ_top:
|
case OBJ_top:
|
||||||
parse_top_args("top", obj->data.top.s, obj);
|
|
||||||
if (!needed) needed = cur->cpu;
|
|
||||||
case OBJ_top_mem:
|
case OBJ_top_mem:
|
||||||
parse_top_args("top_mem", obj->data.top.s, obj);
|
|
||||||
if (!needed) needed = cur->memu;
|
|
||||||
case OBJ_top_time:
|
case OBJ_top_time:
|
||||||
parse_top_args("top_time", obj->data.top.s, obj);
|
|
||||||
if (!needed) needed = cur->time;
|
|
||||||
#ifdef IOSTATS
|
#ifdef IOSTATS
|
||||||
case OBJ_top_io:
|
case OBJ_top_io:
|
||||||
parse_top_args("top_io", obj->data.top.s, obj);
|
|
||||||
if (!needed) needed = cur->io;
|
|
||||||
#endif
|
#endif
|
||||||
|
/* yes, passing top_name_width instead
|
||||||
if (needed[obj->data.top.num]) {
|
* of p_max_size is intended here */
|
||||||
char *timeval;
|
print_top(obj, p, top_name_width);
|
||||||
|
|
||||||
switch (obj->data.top.type) {
|
|
||||||
case TOP_NAME:
|
|
||||||
snprintf(p, top_name_width + 1, "%-*s", top_name_width,
|
|
||||||
needed[obj->data.top.num]->name);
|
|
||||||
break;
|
|
||||||
case TOP_CPU:
|
|
||||||
snprintf(p, 7, "%6.2f",
|
|
||||||
needed[obj->data.top.num]->amount);
|
|
||||||
break;
|
|
||||||
case TOP_PID:
|
|
||||||
snprintf(p, 6, "%5i",
|
|
||||||
needed[obj->data.top.num]->pid);
|
|
||||||
break;
|
|
||||||
case TOP_MEM:
|
|
||||||
snprintf(p, 7, "%6.2f",
|
|
||||||
needed[obj->data.top.num]->totalmem);
|
|
||||||
break;
|
|
||||||
case TOP_TIME:
|
|
||||||
timeval = format_time(
|
|
||||||
needed[obj->data.top.num]->total_cpu_time, 9);
|
|
||||||
snprintf(p, 10, "%9s", timeval);
|
|
||||||
free(timeval);
|
|
||||||
break;
|
|
||||||
case TOP_MEM_RES:
|
|
||||||
human_readable(needed[obj->data.top.num]->rss,
|
|
||||||
p, 255);
|
|
||||||
break;
|
|
||||||
case TOP_MEM_VSIZE:
|
|
||||||
human_readable(needed[obj->data.top.num]->vsize,
|
|
||||||
p, 255);
|
|
||||||
break;
|
|
||||||
#ifdef IOSTATS
|
|
||||||
case TOP_READ_BYTES:
|
|
||||||
human_readable(needed[obj->data.top.num]->read_bytes / update_interval,
|
|
||||||
p, 255);
|
|
||||||
break;
|
|
||||||
case TOP_WRITE_BYTES:
|
|
||||||
human_readable(needed[obj->data.top.num]->write_bytes / update_interval,
|
|
||||||
p, 255);
|
|
||||||
break;
|
|
||||||
case TOP_IO_PERC:
|
|
||||||
snprintf(p, 7, "%6.2f",
|
|
||||||
needed[obj->data.top.num]->io_perc);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
OBJ(tail) {
|
OBJ(tail) {
|
||||||
print_tailhead("tail", obj, p, p_max_size);
|
print_tailhead("tail", obj, p, p_max_size);
|
||||||
}
|
}
|
||||||
|
@ -1599,11 +1599,7 @@ void free_text_objects(struct text_object *root, int internal)
|
|||||||
#ifdef IOSTATS
|
#ifdef IOSTATS
|
||||||
case OBJ_top_io:
|
case OBJ_top_io:
|
||||||
#endif
|
#endif
|
||||||
if (info.first_process && !internal) {
|
free_top(obj, internal);
|
||||||
free_all_processes();
|
|
||||||
info.first_process = NULL;
|
|
||||||
}
|
|
||||||
if (data.top.s) free(data.top.s);
|
|
||||||
break;
|
break;
|
||||||
#ifdef HDDTEMP
|
#ifdef HDDTEMP
|
||||||
case OBJ_hddtemp:
|
case OBJ_hddtemp:
|
||||||
|
@ -457,13 +457,6 @@ struct text_object {
|
|||||||
char *str;
|
char *str;
|
||||||
} ifblock;
|
} ifblock;
|
||||||
|
|
||||||
struct {
|
|
||||||
int num;
|
|
||||||
int type;
|
|
||||||
int was_parsed;
|
|
||||||
char *s;
|
|
||||||
} top;
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
double last_update;
|
double last_update;
|
||||||
float interval;
|
float interval;
|
||||||
|
180
src/top.c
180
src/top.c
@ -800,18 +800,26 @@ void process_find_top(struct process **cpu, struct process **mem,
|
|||||||
#endif /* IOSTATS */
|
#endif /* IOSTATS */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct top_data {
|
||||||
|
int num;
|
||||||
|
int type;
|
||||||
|
int was_parsed;
|
||||||
|
char *s;
|
||||||
|
};
|
||||||
|
|
||||||
int parse_top_args(const char *s, const char *arg, struct text_object *obj)
|
int parse_top_args(const char *s, const char *arg, struct text_object *obj)
|
||||||
{
|
{
|
||||||
|
struct top_data *td;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
if (obj->data.top.was_parsed) {
|
if (!arg) {
|
||||||
return 1;
|
NORM_ERR("top needs arguments");
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
obj->data.top.was_parsed = 1;
|
|
||||||
|
|
||||||
if (arg && !obj->data.top.s) {
|
if (obj->data.opaque) {
|
||||||
obj->data.top.s = strndup(arg, text_buffer_size);
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s[3] == 0) {
|
if (s[3] == 0) {
|
||||||
@ -837,33 +845,32 @@ int parse_top_args(const char *s, const char *arg, struct text_object *obj)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!arg) {
|
obj->data.opaque = td = malloc(sizeof(struct top_data));
|
||||||
NORM_ERR("top needs arguments");
|
memset(td, 0, sizeof(struct top_data));
|
||||||
return 0;
|
td->s = strndup(arg, text_buffer_size);
|
||||||
}
|
|
||||||
|
|
||||||
if (sscanf(arg, "%63s %i", buf, &n) == 2) {
|
if (sscanf(arg, "%63s %i", buf, &n) == 2) {
|
||||||
if (strcmp(buf, "name") == EQUAL) {
|
if (strcmp(buf, "name") == EQUAL) {
|
||||||
obj->data.top.type = TOP_NAME;
|
td->type = TOP_NAME;
|
||||||
} else if (strcmp(buf, "cpu") == EQUAL) {
|
} else if (strcmp(buf, "cpu") == EQUAL) {
|
||||||
obj->data.top.type = TOP_CPU;
|
td->type = TOP_CPU;
|
||||||
} else if (strcmp(buf, "pid") == EQUAL) {
|
} else if (strcmp(buf, "pid") == EQUAL) {
|
||||||
obj->data.top.type = TOP_PID;
|
td->type = TOP_PID;
|
||||||
} else if (strcmp(buf, "mem") == EQUAL) {
|
} else if (strcmp(buf, "mem") == EQUAL) {
|
||||||
obj->data.top.type = TOP_MEM;
|
td->type = TOP_MEM;
|
||||||
} else if (strcmp(buf, "time") == EQUAL) {
|
} else if (strcmp(buf, "time") == EQUAL) {
|
||||||
obj->data.top.type = TOP_TIME;
|
td->type = TOP_TIME;
|
||||||
} else if (strcmp(buf, "mem_res") == EQUAL) {
|
} else if (strcmp(buf, "mem_res") == EQUAL) {
|
||||||
obj->data.top.type = TOP_MEM_RES;
|
td->type = TOP_MEM_RES;
|
||||||
} else if (strcmp(buf, "mem_vsize") == EQUAL) {
|
} else if (strcmp(buf, "mem_vsize") == EQUAL) {
|
||||||
obj->data.top.type = TOP_MEM_VSIZE;
|
td->type = TOP_MEM_VSIZE;
|
||||||
#ifdef IOSTATS
|
#ifdef IOSTATS
|
||||||
} else if (strcmp(buf, "io_read") == EQUAL) {
|
} else if (strcmp(buf, "io_read") == EQUAL) {
|
||||||
obj->data.top.type = TOP_READ_BYTES;
|
td->type = TOP_READ_BYTES;
|
||||||
} else if (strcmp(buf, "io_write") == EQUAL) {
|
} else if (strcmp(buf, "io_write") == EQUAL) {
|
||||||
obj->data.top.type = TOP_WRITE_BYTES;
|
td->type = TOP_WRITE_BYTES;
|
||||||
} else if (strcmp(buf, "io_perc") == EQUAL) {
|
} else if (strcmp(buf, "io_perc") == EQUAL) {
|
||||||
obj->data.top.type = TOP_IO_PERC;
|
td->type = TOP_IO_PERC;
|
||||||
#endif /* IOSTATS */
|
#endif /* IOSTATS */
|
||||||
} else {
|
} else {
|
||||||
NORM_ERR("invalid type arg for top");
|
NORM_ERR("invalid type arg for top");
|
||||||
@ -879,7 +886,7 @@ int parse_top_args(const char *s, const char *arg, struct text_object *obj)
|
|||||||
NORM_ERR("invalid num arg for top. Must be between 1 and 10.");
|
NORM_ERR("invalid num arg for top. Must be between 1 and 10.");
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
obj->data.top.num = n - 1;
|
td->num = n - 1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
NORM_ERR("invalid argument count for top");
|
NORM_ERR("invalid argument count for top");
|
||||||
@ -888,4 +895,137 @@ int parse_top_args(const char *s, const char *arg, struct text_object *obj)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *format_time(unsigned long timeval, const int width)
|
||||||
|
{
|
||||||
|
char buf[10];
|
||||||
|
unsigned long nt; // narrow time, for speed on 32-bit
|
||||||
|
unsigned cc; // centiseconds
|
||||||
|
unsigned nn; // multi-purpose whatever
|
||||||
|
|
||||||
|
nt = timeval;
|
||||||
|
cc = nt % 100; // centiseconds past second
|
||||||
|
nt /= 100; // total seconds
|
||||||
|
nn = nt % 60; // seconds past the minute
|
||||||
|
nt /= 60; // total minutes
|
||||||
|
if (width >= snprintf(buf, sizeof buf, "%lu:%02u.%02u",
|
||||||
|
nt, nn, cc)) {
|
||||||
|
return strndup(buf, text_buffer_size);
|
||||||
|
}
|
||||||
|
if (width >= snprintf(buf, sizeof buf, "%lu:%02u", nt, nn)) {
|
||||||
|
return strndup(buf, text_buffer_size);
|
||||||
|
}
|
||||||
|
nn = nt % 60; // minutes past the hour
|
||||||
|
nt /= 60; // total hours
|
||||||
|
if (width >= snprintf(buf, sizeof buf, "%lu,%02u", nt, nn)) {
|
||||||
|
return strndup(buf, text_buffer_size);
|
||||||
|
}
|
||||||
|
nn = nt; // now also hours
|
||||||
|
if (width >= snprintf(buf, sizeof buf, "%uh", nn)) {
|
||||||
|
return strndup(buf, text_buffer_size);
|
||||||
|
}
|
||||||
|
nn /= 24; // now days
|
||||||
|
if (width >= snprintf(buf, sizeof buf, "%ud", nn)) {
|
||||||
|
return strndup(buf, text_buffer_size);
|
||||||
|
}
|
||||||
|
nn /= 7; // now weeks
|
||||||
|
if (width >= snprintf(buf, sizeof buf, "%uw", nn)) {
|
||||||
|
return strndup(buf, text_buffer_size);
|
||||||
|
}
|
||||||
|
// well shoot, this outta' fit...
|
||||||
|
return strndup("<inf>", text_buffer_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_top(struct text_object *obj, char *p, int top_name_width)
|
||||||
|
{
|
||||||
|
struct information *cur = &info;
|
||||||
|
struct top_data *td = obj->data.opaque;
|
||||||
|
struct process **needed = 0;
|
||||||
|
|
||||||
|
if (!td)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (obj->type) {
|
||||||
|
case OBJ_top:
|
||||||
|
needed = cur->cpu;
|
||||||
|
break;
|
||||||
|
case OBJ_top_mem:
|
||||||
|
needed = cur->memu;
|
||||||
|
break;
|
||||||
|
case OBJ_top_time:
|
||||||
|
needed = cur->time;
|
||||||
|
break;
|
||||||
|
case OBJ_top_io:
|
||||||
|
needed = cur->io;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needed[td->num]) {
|
||||||
|
char *timeval;
|
||||||
|
|
||||||
|
switch (td->type) {
|
||||||
|
case TOP_NAME:
|
||||||
|
snprintf(p, top_name_width + 1, "%-*s", top_name_width,
|
||||||
|
needed[td->num]->name);
|
||||||
|
break;
|
||||||
|
case TOP_CPU:
|
||||||
|
snprintf(p, 7, "%6.2f",
|
||||||
|
needed[td->num]->amount);
|
||||||
|
break;
|
||||||
|
case TOP_PID:
|
||||||
|
snprintf(p, 6, "%5i",
|
||||||
|
needed[td->num]->pid);
|
||||||
|
break;
|
||||||
|
case TOP_MEM:
|
||||||
|
snprintf(p, 7, "%6.2f",
|
||||||
|
needed[td->num]->totalmem);
|
||||||
|
break;
|
||||||
|
case TOP_TIME:
|
||||||
|
timeval = format_time(
|
||||||
|
needed[td->num]->total_cpu_time, 9);
|
||||||
|
snprintf(p, 10, "%9s", timeval);
|
||||||
|
free(timeval);
|
||||||
|
break;
|
||||||
|
case TOP_MEM_RES:
|
||||||
|
human_readable(needed[td->num]->rss,
|
||||||
|
p, 255);
|
||||||
|
break;
|
||||||
|
case TOP_MEM_VSIZE:
|
||||||
|
human_readable(needed[td->num]->vsize,
|
||||||
|
p, 255);
|
||||||
|
break;
|
||||||
|
#ifdef IOSTATS
|
||||||
|
case TOP_READ_BYTES:
|
||||||
|
human_readable(needed[td->num]->read_bytes / update_interval,
|
||||||
|
p, 255);
|
||||||
|
break;
|
||||||
|
case TOP_WRITE_BYTES:
|
||||||
|
human_readable(needed[td->num]->write_bytes / update_interval,
|
||||||
|
p, 255);
|
||||||
|
break;
|
||||||
|
case TOP_IO_PERC:
|
||||||
|
snprintf(p, 7, "%6.2f",
|
||||||
|
needed[td->num]->io_perc);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_top(struct text_object *obj, int internal)
|
||||||
|
{
|
||||||
|
struct top_data *td = obj->data.opaque;
|
||||||
|
|
||||||
|
if (info.first_process && !internal) {
|
||||||
|
free_all_processes();
|
||||||
|
info.first_process = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!td)
|
||||||
|
return;
|
||||||
|
if (td->s)
|
||||||
|
free(td->s);
|
||||||
|
free(obj->data.opaque);
|
||||||
|
obj->data.opaque = NULL;
|
||||||
|
}
|
||||||
|
@ -143,5 +143,7 @@ void process_find_top(struct process **, struct process **, struct process **
|
|||||||
struct process *get_process_by_name(const char *);
|
struct process *get_process_by_name(const char *);
|
||||||
|
|
||||||
int parse_top_args(const char *s, const char *arg, struct text_object *obj);
|
int parse_top_args(const char *s, const char *arg, struct text_object *obj);
|
||||||
|
void print_top(struct text_object *, char *, int);
|
||||||
|
void free_top(struct text_object *, int);
|
||||||
|
|
||||||
#endif /* _top_h_ */
|
#endif /* _top_h_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user