changes; various.

Sorting threads.
Show version.
Fix bugs.
This commit is contained in:
Alastair Poole 2020-05-17 19:30:00 +01:00
parent 0aea127f8e
commit c546e69c03
5 changed files with 200 additions and 29 deletions

View File

@ -1,6 +1,6 @@
##### Project
project('evisum', 'c',
version : '0.4.0',
version : '0.5.0-alpha',
meson_version : '>= 0.40.0')
efl_version = '>= 1.22.0'

View File

@ -1,4 +1,4 @@
/*
/*
* Copyright 2018-2019. Alastair Poole <netstar@gmail.com>
*
* http://haxlab.org.
@ -46,6 +46,18 @@ int
main(int argc, char **argv)
{
Ui *ui;
int i;
for (i = 0; i < argc; i++)
{
if ((!strcmp(argv[i], "-h")) || (!strcmp(argv[i], "-help")) ||
(!strcmp(argv[i], "--help") || !strcasecmp(argv[i], "-v")))
{
printf("(c) 2018-2020 Alastair Poole <netstar@gmail.com>\n");
printf("Evisum version: %s\n", PACKAGE_VERSION);
exit(0);
}
}
eina_init();
ecore_init();

View File

@ -153,12 +153,11 @@ _sort_by_cpu_usage(const void *p1, const void *p2)
one = inf1->cpu_usage;
two = inf2->cpu_usage;
if (one < two)
return -1;
if (two > one)
if (one > two)
return 1;
return 0;
else if (one < two)
return -1;
else return 0;
}
static int

View File

@ -57,14 +57,14 @@ _item_unrealized_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info E
typedef struct {
int tid;
char *name;
char *state;
char *name;
char *state;
int cpu_id;
double cpu_usage;
} Thread_Info;
static Thread_Info *
_t_new(Proc_Info *thr, double cpu_usage)
_thread_info_new(Proc_Info *thr, double cpu_usage)
{
Thread_Info *t = calloc(1, sizeof(Thread_Info));
t->tid = thr->tid;
@ -123,8 +123,8 @@ _item_create(Evas_Object *parent)
evas_object_size_hint_align_set(label, 0.5, EVAS_HINT_EXPAND);
label = _item_column_add(table, "cpu_id", 3);
evas_object_size_hint_align_set(label, 0.5, EVAS_HINT_EXPAND);
label = _item_column_add(table, "cpu_usage", 4);
evas_object_size_hint_align_set(label, 0.5, EVAS_HINT_EXPAND);
return table;
}
@ -259,6 +259,62 @@ _genlist_ensure_n_items(Evas_Object *genlist, unsigned int items)
elm_genlist_item_class_free(itc);
}
static int
_sort_by_cpu_usage(const void *p1, const void *p2)
{
const Thread_Info *inf1, *inf2;
double one, two;
inf1 = p1; inf2 = p2;
one = inf1->cpu_usage; two = inf2->cpu_usage;
if (one > two)
return 1;
else if (one < two)
return -1;
else return 0;
}
static int
_sort_by_cpu_id(const void *p1, const void *p2)
{
const Thread_Info *inf1, *inf2;
inf1 = p1; inf2 = p2;
return inf1->cpu_id - inf2->cpu_id;
}
static int
_sort_by_state(const void *p1, const void *p2)
{
const Thread_Info *inf1, *inf2;
inf1 = p1; inf2 = p2;
return strcmp(inf1->state, inf2->state);
}
static int
_sort_by_name(const void *p1, const void *p2)
{
const Thread_Info *inf1, *inf2;
inf1 = p1; inf2 = p2;
return strcmp(inf1->name, inf2->name);
}
static int
_sort_by_tid(const void *p1, const void *p2)
{
const Thread_Info *inf1, *inf2;
inf1 = p1; inf2 = p2;
return inf1->tid - inf2->tid;
}
static void
_hash_free_cb(void *data)
@ -272,46 +328,55 @@ static void
_thread_info_set(Ui_Process *ui, Proc_Info *proc)
{
Eina_List *l;
Proc_Info *t;
Proc_Info *p;
Thread_Info *t;
Elm_Object_Item *it;
Eina_List *threads = NULL;
if (!ui->hash_cpu_times)
{
ui->hash_cpu_times = eina_hash_string_superfast_new(_hash_free_cb);
}
ui->hash_cpu_times = eina_hash_string_superfast_new(_hash_free_cb);
_genlist_ensure_n_items(ui->genlist_threads, eina_list_count(proc->threads));
it = elm_genlist_first_item_get(ui->genlist_threads);
EINA_LIST_FOREACH(proc->threads, l, t)
EINA_LIST_FOREACH(proc->threads, l, p)
{
long *cpu_time, *cpu_time_prev;
double cpu_usage = 0.0;
const char *key = eina_slstr_printf("%s:%d", t->thread_name, t->tid);
const char *key = eina_slstr_printf("%s:%d", p->thread_name, p->tid);
if ((cpu_time_prev = eina_hash_find(ui->hash_cpu_times, key)) == NULL)
{
cpu_time = malloc(sizeof(long));
*cpu_time = t->cpu_time;
*cpu_time = p->cpu_time;
eina_hash_add(ui->hash_cpu_times, key, cpu_time);
}
else
{
cpu_usage = (double) (t->cpu_time - *cpu_time_prev) / ui->poll_delay;
*cpu_time_prev = t->cpu_time;
cpu_usage = (double) (p->cpu_time - *cpu_time_prev) / ui->poll_delay;
*cpu_time_prev = p->cpu_time;
}
Thread_Info *tinfo = elm_object_item_data_get(it);
if (tinfo)
_item_del(tinfo, NULL);
t = _thread_info_new(p, cpu_usage);
if (t)
threads = eina_list_append(threads, t);
}
tinfo = _t_new(t, cpu_usage);
elm_object_item_data_set(it, tinfo);
elm_genlist_item_update(it);
if (ui->sort_cb)
threads = eina_list_sort(threads, eina_list_count(threads), ui->sort_cb);
if (ui->sort_reverse)
threads = eina_list_reverse(threads);
it = elm_genlist_first_item_get(ui->genlist_threads);
EINA_LIST_FOREACH(threads, l, t)
{
Thread_Info *prev = elm_object_item_data_get(it);
if (prev) _item_del(prev, NULL);
elm_object_item_data_set(it, t);
elm_genlist_item_update(it);
it = elm_genlist_item_next_get(it);
}
eina_list_free(threads);
}
static void
@ -603,6 +668,86 @@ _process_tab_add(Evas_Object *parent, Ui_Process *ui)
return scroller;
}
static void
_btn_icon_state_set(Evas_Object *button, Eina_Bool reverse)
{
Evas_Object *icon = elm_icon_add(button);
if (reverse)
elm_icon_standard_set(icon, evisum_icon_path_get("go-down"));
else
elm_icon_standard_set(icon, evisum_icon_path_get("go-up"));
elm_object_part_content_set(button, "icon", icon);
evas_object_show(icon);
}
static void
_btn_name_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Ui_Process *ui = data;
if (ui->sort_cb == _sort_by_name)
ui->sort_reverse = !ui->sort_reverse;
_btn_icon_state_set(obj, ui->sort_reverse);
ui->sort_cb = _sort_by_name;
}
static void
_btn_thread_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Ui_Process *ui = data;
if (ui->sort_cb == _sort_by_tid)
ui->sort_reverse = !ui->sort_reverse;
_btn_icon_state_set(obj, ui->sort_reverse);
ui->sort_cb = _sort_by_tid;
}
static void
_btn_state_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Ui_Process *ui = data;
if (ui->sort_cb == _sort_by_state)
ui->sort_reverse = !ui->sort_reverse;
_btn_icon_state_set(obj, ui->sort_reverse);
ui->sort_cb = _sort_by_state;
}
static void
_btn_cpu_id_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Ui_Process *ui = data;
if (ui->sort_cb == _sort_by_cpu_id)
ui->sort_reverse = !ui->sort_reverse;
ui->sort_cb = _sort_by_cpu_id;
_btn_icon_state_set(obj, ui->sort_reverse);
}
static void
_btn_cpu_usage_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Ui_Process *ui = data;
if (ui->sort_cb == _sort_by_cpu_usage)
ui->sort_reverse = !ui->sort_reverse;
ui->sort_cb = _sort_by_cpu_usage;
_btn_icon_state_set(obj, ui->sort_reverse);
}
static Evas_Object *
_threads_tab_add(Evas_Object *parent, Ui_Process *ui)
{
@ -623,35 +768,45 @@ _threads_tab_add(Evas_Object *parent, Ui_Process *ui)
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_text_set(btn, _("ID"));
_btn_icon_state_set(btn, ui->sort_reverse);
evas_object_show(btn);
evas_object_smart_callback_add(btn, "clicked", _btn_thread_clicked_cb, ui);
elm_box_pack_end(hbox, btn);
ui->btn_thread_name = btn = elm_button_add(hbox);
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_text_set(btn, _("Name"));
_btn_icon_state_set(btn, ui->sort_reverse);
evas_object_show(btn);
evas_object_smart_callback_add(btn, "clicked", _btn_name_clicked_cb, ui);
elm_box_pack_end(hbox, btn);
ui->btn_thread_state = btn = elm_button_add(hbox);
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_text_set(btn, _("State"));
_btn_icon_state_set(btn, ui->sort_reverse);
evas_object_show(btn);
evas_object_smart_callback_add(btn, "clicked", _btn_state_clicked_cb, ui);
elm_box_pack_end(hbox, btn);
ui->btn_thread_cpu_id = btn = elm_button_add(hbox);
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_text_set(btn, _("CPU ID"));
_btn_icon_state_set(btn, ui->sort_reverse);
evas_object_show(btn);
evas_object_smart_callback_add(btn, "clicked", _btn_cpu_id_clicked_cb, ui);
elm_box_pack_end(hbox, btn);
ui->btn_thread_cpu_usage = btn = elm_button_add(hbox);
evas_object_size_hint_weight_set(btn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
elm_object_text_set(btn, _("CPU Usage"));
_btn_icon_state_set(btn, ui->sort_reverse);
evas_object_show(btn);
evas_object_smart_callback_add(btn, "clicked", _btn_cpu_usage_clicked_cb, ui);
elm_box_pack_end(hbox, btn);
ui->genlist_threads = genlist = elm_genlist_add(parent);
@ -842,8 +997,10 @@ ui_process_win_add(int pid, const char *cmd)
Ui_Process *ui = calloc(1, sizeof(Ui_Process));
ui->selected_pid = pid;
ui->selected_cmd = strdup(cmd);
ui->poll_delay = 3.0;
ui->poll_delay = 3;
ui->item_cache = NULL;
ui->sort_reverse = EINA_TRUE;
ui->sort_cb = _sort_by_cpu_usage;
ui->win = win = elm_win_util_standard_add("evisum", "evisum");
_win_title_set(win, "%s (%d)", cmd, pid);

View File

@ -50,6 +50,9 @@ typedef struct _Ui_Process {
int64_t pid_cpu_time;
Eina_Bool info_init;
Eina_Bool threads_ready;
Eina_Bool sort_reverse;
int (*sort_cb)(const void *p1, const void *p2);
Ecore_Timer *timer_pid;
} Ui_Process;