process_list: fix this...

Might need to tweak for the fbsd depending on CP_TICKS
This commit is contained in:
Alastair Poole 2020-12-26 11:27:58 +00:00
parent 6d070aecd2
commit ebdbda13ea
4 changed files with 187 additions and 152 deletions

View File

@ -94,6 +94,9 @@ system_cpu_usage_get(int *ncpu);
cpu_core_t ** cpu_core_t **
system_cpu_usage_delayed_get(int *ncpu, int usecs); system_cpu_usage_delayed_get(int *ncpu, int usecs);
cpu_core_t **
system_cpu_state_get(int *ncpu);
int int
system_cpu_frequency_get(void); system_cpu_frequency_get(void);

View File

@ -253,6 +253,22 @@ _cpu_state_get(cpu_core_t **cores, int ncpu)
#endif #endif
} }
cpu_core_t **
system_cpu_state_get(int *ncpu)
{
cpu_core_t **cores;
int i;
*ncpu = cpu_count();
cores = malloc((*ncpu) * sizeof(cpu_core_t *));
for (i = 0; i < *ncpu; i++)
cores[i] = calloc(1, sizeof(cpu_core_t));
_cpu_state_get(cores, *ncpu);
return cores;
}
cpu_core_t ** cpu_core_t **
system_cpu_usage_delayed_get(int *ncpu, int usecs) system_cpu_usage_delayed_get(int *ncpu, int usecs)
{ {

View File

@ -32,8 +32,6 @@ typedef struct Ui
Evas_Object *win_about; Evas_Object *win_about;
Evas_Object *main_menu; Evas_Object *main_menu;
uint8_t cpu_usage;
struct struct
{ {
Evas_Object *win; Evas_Object *win;
@ -67,13 +65,6 @@ typedef struct Ui
Ecore_Thread *thread; Ecore_Thread *thread;
} sensors; } sensors;
struct
{
Eina_Bool skip_wait;
Eina_Bool ready;
Eina_Bool shutdown_now;
} state;
struct struct
{ {
int poll_delay; int poll_delay;

View File

@ -19,35 +19,42 @@ typedef struct
{ {
Ecore_Thread *thread; Ecore_Thread *thread;
Evisum_Ui_Cache *cache; Evisum_Ui_Cache *cache;
Eina_List *cpu_times;
Eina_List *cpu_list; Eina_List *cpu_list;
Ecore_Event_Handler *handler[2]; Ecore_Event_Handler *handler[2];
Eina_Bool skip;
Eina_Bool skip_wait;
Eina_Bool ready;
Evas_Object *win; Eina_Hash *cpu_times;
Evas_Object *menu; int64_t ticks;
Ui *ui; int64_t ticks_prev;
pid_t selected_pid; Ui *ui;
char search[16];
int search_len;
Ecore_Timer *timer_search; Evas_Object *win;
Evas_Object *entry_pop; Evas_Object *menu;
Evas_Object *entry;
Eina_Bool entry_visible;
Evas_Object *scroller; pid_t selected_pid;
Evas_Object *genlist; char search[16];
int search_len;
Evas_Object *btn_menu; Ecore_Timer *timer_search;
Evas_Object *entry_pop;
Evas_Object *entry;
Eina_Bool entry_visible;
Evas_Object *btn_pid; Evas_Object *scroller;
Evas_Object *btn_uid; Evas_Object *genlist;
Evas_Object *btn_cmd;
Evas_Object *btn_size; Evas_Object *btn_menu;
Evas_Object *btn_rss;
Evas_Object *btn_state; Evas_Object *btn_pid;
Evas_Object *btn_cpu_usage; Evas_Object *btn_uid;
Evas_Object *btn_cmd;
Evas_Object *btn_size;
Evas_Object *btn_rss;
Evas_Object *btn_state;
Evas_Object *btn_cpu_usage;
} Ui_Data; } Ui_Data;
@ -194,81 +201,6 @@ _sort_by_state(const void *p1, const void *p2)
return strcmp(inf1->state, inf2->state); return strcmp(inf1->state, inf2->state);
} }
typedef struct
{
pid_t pid;
int64_t cpu_time_prev;
} pid_cpu_time_t;
static void
_proc_pid_cpu_times_free(Ui_Data *pd)
{
pid_cpu_time_t *tmp;
EINA_LIST_FREE(pd->cpu_times, tmp)
{
free(tmp);
}
}
static void
_proc_pid_cpu_times_reset(Ui_Data *pd)
{
Eina_List *l;
pid_cpu_time_t *tmp;
EINA_LIST_FOREACH(pd->cpu_times, l, tmp)
tmp->cpu_time_prev = 0;
}
static void
_proc_pid_cpu_time_save(Ui_Data *pd, Proc_Info *proc)
{
Eina_List *l;
pid_cpu_time_t *tmp;
EINA_LIST_FOREACH(pd->cpu_times, l, tmp)
{
if (tmp->pid == proc->pid)
{
tmp->cpu_time_prev = proc->cpu_time;
return;
}
}
tmp = calloc(1, sizeof(pid_cpu_time_t));
if (tmp)
{
tmp->pid = proc->pid;
tmp->cpu_time_prev = proc->cpu_time;
pd->cpu_times = eina_list_append(pd->cpu_times, tmp);
}
}
static void
_proc_pid_cpu_usage_get(Ui_Data *pd, Proc_Info *proc)
{
Eina_List *l;
pid_cpu_time_t *tmp;
EINA_LIST_FOREACH(pd->cpu_times, l, tmp)
{
if (tmp->pid == proc->pid)
{
if (tmp->cpu_time_prev && proc->cpu_time > tmp->cpu_time_prev)
{
proc->cpu_usage =
(double) (proc->cpu_time - tmp->cpu_time_prev) /
pd->ui->settings.poll_delay;
}
_proc_pid_cpu_time_save(pd, proc);
return;
}
}
_proc_pid_cpu_time_save(pd, proc);
}
static void static void
_item_unrealized_cb(void *data, Evas_Object *obj EINA_UNUSED, _item_unrealized_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED) void *event_info EINA_UNUSED)
@ -297,21 +229,21 @@ _item_del(void *data, Evas_Object *obj EINA_UNUSED)
static Evas_Object * static Evas_Object *
_item_column_add(Evas_Object *tbl, const char *text, int col) _item_column_add(Evas_Object *tbl, const char *text, int col)
{ {
Evas_Object *rec, *lbl; Evas_Object *rec, *lb;
lbl = elm_label_add(tbl); lb = elm_label_add(tbl);
evas_object_data_set(tbl, text, lbl); evas_object_data_set(tbl, text, lb);
evas_object_size_hint_align_set(lbl, FILL, FILL); evas_object_size_hint_align_set(lb, FILL, FILL);
evas_object_size_hint_weight_set(lbl, EXPAND, EXPAND); evas_object_size_hint_weight_set(lb, EXPAND, EXPAND);
evas_object_show(lbl); evas_object_show(lb);
rec = evas_object_rectangle_add(tbl); rec = evas_object_rectangle_add(tbl);
evas_object_data_set(lbl, "rec", rec); evas_object_data_set(lb, "rec", rec);
elm_table_pack(tbl, rec, col, 0, 1, 1); elm_table_pack(tbl, rec, col, 0, 1, 1);
elm_table_pack(tbl, lbl, col, 0, 1, 1); elm_table_pack(tbl, lb, col, 0, 1, 1);
return lbl; return lb;
} }
static char * static char *
@ -333,7 +265,7 @@ _pb_format_free_cb(char *str)
static Evas_Object * static Evas_Object *
_item_create(Evas_Object *parent) _item_create(Evas_Object *parent)
{ {
Evas_Object *obj, *tbl, *lbl, *ic, *rec; Evas_Object *obj, *tbl, *lb, *ic, *rec;
Evas_Object *hbx, *pb; Evas_Object *hbx, *pb;
int i = 0; int i = 0;
@ -367,27 +299,27 @@ _item_create(Evas_Object *parent)
evas_object_data_set(ic, "rec", rec); evas_object_data_set(ic, "rec", rec);
elm_table_pack(tbl, rec, i++, 0, 1, 1); elm_table_pack(tbl, rec, i++, 0, 1, 1);
lbl = elm_label_add(tbl); lb = elm_label_add(tbl);
evas_object_size_hint_weight_set(lbl, 0, EXPAND); evas_object_size_hint_weight_set(lb, 0, EXPAND);
evas_object_data_set(tbl, "proc_cmd", lbl); evas_object_data_set(tbl, "proc_cmd", lb);
evas_object_data_set(lbl, "hbx", hbx); evas_object_data_set(lb, "hbx", hbx);
evas_object_show(lbl); evas_object_show(lb);
elm_box_pack_end(hbx, lbl); elm_box_pack_end(hbx, lb);
rec = evas_object_rectangle_add(tbl); rec = evas_object_rectangle_add(tbl);
evas_object_size_hint_min_set(rec, 4, 1); evas_object_size_hint_min_set(rec, 4, 1);
elm_box_pack_end(hbx, rec); elm_box_pack_end(hbx, rec);
lbl =_item_column_add(tbl, "proc_uid", i++); lb =_item_column_add(tbl, "proc_uid", i++);
evas_object_size_hint_align_set(lbl, 0.0, FILL); evas_object_size_hint_align_set(lb, 0.0, FILL);
lbl = _item_column_add(tbl, "proc_pid", i++); lb = _item_column_add(tbl, "proc_pid", i++);
evas_object_size_hint_align_set(lbl, 0.0, FILL); evas_object_size_hint_align_set(lb, 0.0, FILL);
lbl = _item_column_add(tbl, "proc_size", i++); lb = _item_column_add(tbl, "proc_size", i++);
evas_object_size_hint_align_set(lbl, 0.0, FILL); evas_object_size_hint_align_set(lb, 0.0, FILL);
lbl = _item_column_add(tbl, "proc_rss", i++); lb = _item_column_add(tbl, "proc_rss", i++);
evas_object_size_hint_align_set(lbl, 0.0, FILL); evas_object_size_hint_align_set(lb, 0.0, FILL);
lbl = _item_column_add(tbl, "proc_state", i++); lb = _item_column_add(tbl, "proc_state", i++);
evas_object_size_hint_align_set(lbl, 0.5, FILL); evas_object_size_hint_align_set(lb, 0.5, FILL);
hbx = elm_box_add(tbl); hbx = elm_box_add(tbl);
elm_box_horizontal_set(hbx, 1); elm_box_horizontal_set(hbx, 1);
@ -419,7 +351,7 @@ _content_get(void *data, Evas_Object *obj, const char *source)
if (strcmp(source, "elm.swallow.content")) return NULL; if (strcmp(source, "elm.swallow.content")) return NULL;
if (!proc) return NULL; if (!proc) return NULL;
if (!pd->ui->state.ready) return NULL; if (!pd->ready) return NULL;
Item_Cache *it = evisum_ui_item_cache_item_get(pd->cache); Item_Cache *it = evisum_ui_item_cache_item_get(pd->cache);
if (!it) if (!it)
@ -577,7 +509,7 @@ _process_list_cancel_cb(void *data, Ecore_Thread *thread)
{ {
Ui_Data *pd = data; Ui_Data *pd = data;
_proc_pid_cpu_times_free(pd); (void) pd;
} }
@ -655,12 +587,20 @@ _process_list_uid_trim(Eina_List *list, uid_t uid)
return list; return list;
} }
static void
_cpu_times_free_cb(void *data)
{
int64_t *cpu_time = data;
free(cpu_time);
}
static Eina_List * static Eina_List *
_process_list_search_trim(Eina_List *list, Ui_Data *pd) _process_list_search_trim(Eina_List *list, Ui_Data *pd)
{ {
Ui *ui; Ui *ui;
Eina_List *l, *l_next; Eina_List *l, *l_next;
Proc_Info *proc; Proc_Info *proc;
int64_t id;
ui = pd->ui; ui = pd->ui;
@ -674,7 +614,29 @@ _process_list_search_trim(Eina_List *list, Ui_Data *pd)
} }
else else
{ {
_proc_pid_cpu_usage_get(pd, proc); int64_t *cpu_time;
id = proc->pid;
if (!(cpu_time = eina_hash_find(pd->cpu_times, &id)))
{
cpu_time = malloc(sizeof(int64_t));
*cpu_time = proc->cpu_time;
eina_hash_add(pd->cpu_times, &id, cpu_time);
}
else
{
if (*cpu_time)
{
int diff = pd->ticks - pd->ticks_prev;
int diff2 = (proc->cpu_time - *cpu_time);
if (diff > 0)
proc->cpu_usage = (double) (diff2 / ((double) diff / 100.0));
else
proc->cpu_usage = (double) (proc->cpu_time - *cpu_time) /
pd->ui->settings.poll_delay;
}
*cpu_time = proc->cpu_time;
}
} }
} }
@ -700,33 +662,63 @@ _process_list_get(Ui_Data *pd)
return list; return list;
} }
static int64_t
_ticks_get(void)
{
cpu_core_t **cores;
int n;
int64_t ticks = 0;
cores = system_cpu_state_get(&n);
for (int i = 0; i < n; i++)
{
if (ticks < cores[i]->total)
ticks = cores[i]->total;
free(cores[i]);
}
free(cores);
return ticks;
}
static void static void
_process_list(void *data, Ecore_Thread *thread) _process_list(void *data, Ecore_Thread *thread)
{ {
Ui_Data *pd; Ui_Data *pd;
Eina_List *list; Eina_List *list;
Ui *ui; Ui *ui;
int delay = 1; Proc_Info *proc;
int i, delay = 1;
pd = data; pd = data;
ui = pd->ui; ui = pd->ui;
while (!ecore_thread_check(thread)) while (!ecore_thread_check(thread))
{ {
pd->ticks = _ticks_get();
list = _process_list_get(pd); list = _process_list_get(pd);
ecore_thread_feedback(thread, list); pd->ticks_prev = pd->ticks;
for (int i = 0; i < delay * 4; i++)
if (!pd->skip)
ecore_thread_feedback(thread, list);
else
{
EINA_LIST_FREE(list, proc)
proc_info_free(proc);
}
for (i = 0; i < delay * 4; i++)
{ {
if (ecore_thread_check(thread)) return; if (ecore_thread_check(thread)) return;
if (ui->state.skip_wait) if (pd->skip_wait)
{ {
ui->state.skip_wait = EINA_FALSE; pd->skip_wait = 0;
break; break;
} }
usleep(250000); usleep(250000);
} }
ui->state.ready = EINA_TRUE; pd->ready = 1;
delay = ui->settings.poll_delay; delay = ui->settings.poll_delay;
} }
} }
@ -1163,6 +1155,28 @@ _btn_menu_clicked_cb(void *data, Evas_Object *obj,
_main_menu_dismissed_cb(ui, NULL, NULL); _main_menu_dismissed_cb(ui, NULL, NULL);
} }
static void
_genlist_scroll_start_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Ui_Data *pd;
pd = data;
pd->skip = 1;
}
static void
_genlist_scroll_end_cb(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Ui_Data *pd;
pd = data;
pd->skip = 0;
}
static Evas_Object * static Evas_Object *
_ui_content_system_add(Ui_Data *pd, Evas_Object *parent) _ui_content_system_add(Ui_Data *pd, Evas_Object *parent)
{ {
@ -1295,6 +1309,10 @@ _ui_content_system_add(Ui_Data *pd, Evas_Object *parent)
_item_pid_secondary_clicked_cb, pd); _item_pid_secondary_clicked_cb, pd);
evas_object_smart_callback_add(pd->genlist, "unrealized", evas_object_smart_callback_add(pd->genlist, "unrealized",
_item_unrealized_cb, pd); _item_unrealized_cb, pd);
evas_object_smart_callback_add(pd->genlist, "scroll,anim,start",
_genlist_scroll_start_cb, pd);
evas_object_smart_callback_add(pd->genlist, "scroll,anim,stop",
_genlist_scroll_end_cb, pd);
elm_box_pack_end(bx, tbl); elm_box_pack_end(bx, tbl);
@ -1367,7 +1385,6 @@ _win_key_down_search(Ui_Data *pd, Evas_Event_Key_Down *ev)
{ {
Evas_Object *entry; Evas_Object *entry;
Evas_Coord w, h; Evas_Coord w, h;
Ui *ui = pd->ui;
entry = pd->entry; entry = pd->entry;
@ -1378,7 +1395,7 @@ _win_key_down_search(Ui_Data *pd, Evas_Event_Key_Down *ev)
else else
{ {
elm_object_text_set(entry, ""); elm_object_text_set(entry, "");
ui->state.skip_wait = EINA_FALSE; pd->skip_wait = 0;
evas_object_lower(pd->entry_pop); evas_object_lower(pd->entry_pop);
pd->search_len = 0; pd->search_len = 0;
for (int i = 0; i < sizeof(pd->search); i++) for (int i = 0; i < sizeof(pd->search); i++)
@ -1419,11 +1436,9 @@ static void
_win_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) _win_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
{ {
Evas_Event_Key_Down *ev; Evas_Event_Key_Down *ev;
Ui *ui;
Ui_Data *pd; Ui_Data *pd;
pd = data; pd = data;
ui = pd->ui;
ev = event_info; ev = event_info;
if (!ev || !ev->keyname) if (!ev || !ev->keyname)
@ -1431,7 +1446,7 @@ _win_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
_win_key_down_search(pd, ev); _win_key_down_search(pd, ev);
ui->state.skip_wait = EINA_TRUE; pd->skip_wait = 1;
} }
static void static void
@ -1467,9 +1482,18 @@ _elm_config_changed_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED
static Eina_Bool static Eina_Bool
_evisum_config_changed_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED) _evisum_config_changed_cb(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
{ {
Eina_Iterator *it;
Ui_Data *pd = data; Ui_Data *pd = data;
void *d = NULL;
_proc_pid_cpu_times_reset(pd); it = eina_hash_iterator_data_new(pd->cpu_times);
while (eina_iterator_next(it, &d))
{
int64_t *t = d;
*t = 0;
}
eina_iterator_free(it);
return EINA_TRUE; return EINA_TRUE;
} }
@ -1503,7 +1527,7 @@ _win_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_U
if (pd->cache) if (pd->cache)
evisum_ui_item_cache_free(pd->cache); evisum_ui_item_cache_free(pd->cache);
_proc_pid_cpu_times_free(pd); eina_hash_free(pd->cpu_times);
eina_lock_free(&_lock); eina_lock_free(&_lock);
@ -1540,6 +1564,8 @@ ui_process_list_win_add(Ui *ui)
icon = elm_icon_add(win); icon = elm_icon_add(win);
elm_icon_standard_set(icon, "evisum"); elm_icon_standard_set(icon, "evisum");
elm_win_icon_object_set(win, icon); elm_win_icon_object_set(win, icon);
evisum_ui_background_add(win, evisum_ui_backgrounds_enabled_get());
if (_evisum_config->width > 1 && _evisum_config->height > 1) if (_evisum_config->width > 1 && _evisum_config->height > 1)
evas_object_resize(win, _evisum_config->width, _evisum_config->height); evas_object_resize(win, _evisum_config->width, _evisum_config->height);
else else
@ -1548,24 +1574,23 @@ ui_process_list_win_add(Ui *ui)
elm_win_center(win, 1, 1); elm_win_center(win, 1, 1);
obj = _ui_content_system_add(pd, win); obj = _ui_content_system_add(pd, win);
pd->cache = evisum_ui_item_cache_new(pd->genlist, _item_create, 50); elm_object_content_set(win, obj);
evisum_ui_background_add(win, evisum_ui_backgrounds_enabled_get());
_search_add(pd); _search_add(pd);
pd->cache = evisum_ui_item_cache_new(pd->genlist, _item_create, 50);
pd->cpu_times = eina_hash_int64_new(_cpu_times_free_cb);
evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, evas_object_event_callback_add(win, EVAS_CALLBACK_DEL,
_win_del_cb, pd); _win_del_cb, pd);
evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE,
_win_resize_cb, pd); _win_resize_cb, pd);
evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN,
_win_key_down_cb, pd); _win_key_down_cb, pd);
elm_object_content_set(win, obj);
evas_object_show(win); evas_object_show(win);
pd->thread = ecore_thread_feedback_run(_process_list, pd->thread = ecore_thread_feedback_run(_process_list,
_process_list_feedback_cb, _process_list_feedback_cb,
_process_list_cancel_cb, _process_list_cancel_cb,
NULL, pd, EINA_FALSE); NULL, pd, EINA_FALSE);
_process_list_update(pd);
} }