netstar pushed a commit to branch master. http://git.enlightenment.org/apps/evisum.git/commit/?id=d2cbe01bba0ba5c6053abf5345cab50af85853df
commit d2cbe01bba0ba5c6053abf5345cab50af85853df Author: Alastair Poole <nets...@gmail.com> Date: Thu Dec 17 19:20:39 2020 +0000 proc: feedback do less, use the thread luke. --- src/bin/ui/ui_process_list.c | 248 ++++++++++++++++++++++++------------------- 1 file changed, 136 insertions(+), 112 deletions(-) diff --git a/src/bin/ui/ui_process_list.c b/src/bin/ui/ui_process_list.c index 14346bf..23fc3f6 100644 --- a/src/bin/ui/ui_process_list.c +++ b/src/bin/ui/ui_process_list.c @@ -193,63 +193,6 @@ _sort_by_state(const void *p1, const void *p2) return strcmp(inf1->state, inf2->state); } -static Eina_List * -_list_sort(Ui *ui, Eina_List *list) -{ - switch (ui->settings.sort_type) - { - case SORT_BY_NONE: - case SORT_BY_PID: - list = eina_list_sort(list, eina_list_count(list), _sort_by_pid); - break; - - case SORT_BY_UID: - list = eina_list_sort(list, eina_list_count(list), _sort_by_uid); - break; - - case SORT_BY_NICE: - list = eina_list_sort(list, eina_list_count(list), _sort_by_nice); - break; - - case SORT_BY_PRI: - list = eina_list_sort(list, eina_list_count(list), _sort_by_pri); - break; - - case SORT_BY_CPU: - list = eina_list_sort(list, eina_list_count(list), _sort_by_cpu); - break; - - case SORT_BY_THREADS: - list = eina_list_sort(list, eina_list_count(list), _sort_by_threads); - break; - - case SORT_BY_SIZE: - list = eina_list_sort(list, eina_list_count(list), _sort_by_size); - break; - - case SORT_BY_RSS: - list = eina_list_sort(list, eina_list_count(list), _sort_by_rss); - break; - - case SORT_BY_CMD: - list = eina_list_sort(list, eina_list_count(list), _sort_by_cmd); - break; - - case SORT_BY_STATE: - list = eina_list_sort(list, eina_list_count(list), _sort_by_state); - break; - - case SORT_BY_CPU_USAGE: - list = eina_list_sort(list, eina_list_count(list), _sort_by_cpu_usage); - break; - } - - if (ui->settings.sort_reverse) - list = eina_list_reverse(list); - - return list; -} - typedef struct { pid_t pid; int64_t cpu_time_prev; @@ -635,49 +578,93 @@ _process_list_cancel_cb(void *data, Ecore_Thread *thread) _proc_pid_cpu_times_free(pd); } -static void -_process_list_feedback_cb(void *data, Ecore_Thread *thread EINA_UNUSED, - void *msg EINA_UNUSED) + +static Eina_List * +_process_list_sort(Ui *ui, Eina_List *list) { - Ui *ui; - Ui_Data *pd; - Eina_List *list, *l, *l_next; - Proc_Info *proc; - Elm_Object_Item *it; - int len = 0; - list = NULL; + switch (ui->settings.sort_type) + { + case SORT_BY_NONE: + case SORT_BY_PID: + list = eina_list_sort(list, eina_list_count(list), _sort_by_pid); + break; - pd = data; - ui = pd->ui; + case SORT_BY_UID: + list = eina_list_sort(list, eina_list_count(list), _sort_by_uid); + break; - if (!eina_lock_take_try(&_lock)) - return; + case SORT_BY_NICE: + list = eina_list_sort(list, eina_list_count(list), _sort_by_nice); + break; - if (!list) - list = proc_info_all_get(); + case SORT_BY_PRI: + list = eina_list_sort(list, eina_list_count(list), _sort_by_pri); + break; - if (pd->search[0]) - len = strlen(pd->search); + case SORT_BY_CPU: + list = eina_list_sort(list, eina_list_count(list), _sort_by_cpu); + break; - if (ui->settings.show_user) - { - static uid_t uid = 0; + case SORT_BY_THREADS: + list = eina_list_sort(list, eina_list_count(list), _sort_by_threads); + break; - if (!uid) uid = getuid(); + case SORT_BY_SIZE: + list = eina_list_sort(list, eina_list_count(list), _sort_by_size); + break; + + case SORT_BY_RSS: + list = eina_list_sort(list, eina_list_count(list), _sort_by_rss); + break; + + case SORT_BY_CMD: + list = eina_list_sort(list, eina_list_count(list), _sort_by_cmd); + break; - EINA_LIST_FOREACH_SAFE(list, l, l_next, proc) + case SORT_BY_STATE: + list = eina_list_sort(list, eina_list_count(list), _sort_by_state); + break; + + case SORT_BY_CPU_USAGE: + list = eina_list_sort(list, eina_list_count(list), _sort_by_cpu_usage); + break; + } + + if (ui->settings.sort_reverse) + list = eina_list_reverse(list); + + return list; +} +static Eina_List * +_process_list_uid_trim(Eina_List *list, uid_t uid) +{ + Proc_Info *proc; + Eina_List *l, *l_next; + + EINA_LIST_FOREACH_SAFE(list, l, l_next, proc) + { + if (proc->uid != uid) { - if (proc->uid != uid) - { - proc_info_free(proc); - list = eina_list_remove_list(list, l); - } + proc_info_free(proc); + list = eina_list_remove_list(list, l); } } + return list; +} + +static Eina_List * +_process_list_search_trim(Eina_List *list, Ui_Data *pd) +{ + Ui *ui; + Eina_List *l, *l_next; + Proc_Info *proc; + + ui = pd->ui; + EINA_LIST_FOREACH_SAFE(list, l, l_next, proc) { - if ((len && (strncasecmp(proc->command, pd->search, len))) || + if ((pd->search_len && (strncasecmp(proc->command, pd->search, pd->search_len))) || (proc->pid == ui->program_pid)) { proc_info_free(proc); @@ -689,43 +676,33 @@ _process_list_feedback_cb(void *data, Ecore_Thread *thread EINA_UNUSED, } } - list = _list_sort(ui, list); - - _genlist_ensure_n_items(pd->genlist, eina_list_count(list)); - - it = elm_genlist_first_item_get(pd->genlist); + return list; +} - EINA_LIST_FREE(list, proc) - { - if (!it) - proc_info_free(proc); - else - { - Proc_Info *prev = elm_object_item_data_get(it); - if (prev) - proc_info_free(prev); +static Eina_List * +_process_list_get(Ui_Data *pd) +{ + Eina_List *list; + Ui *ui; - elm_object_item_data_set(it, proc); + ui = pd->ui; - it = elm_genlist_item_next_get(it); - } - } + list = proc_info_all_get(); - elm_genlist_realized_items_update(pd->genlist); + if (ui->settings.show_user) + list = _process_list_uid_trim(list, getuid()); - eina_lock_release(&_lock); -} + list = _process_list_search_trim(list, pd); + list = _process_list_sort(ui, list); -static void -_process_list_update(Ui_Data *pd) -{ - _process_list_feedback_cb(pd, NULL, NULL); + return list; } static void _process_list(void *data, Ecore_Thread *thread) { Ui_Data *pd; + Eina_List *list; Ui *ui; int delay = 1; @@ -734,7 +711,8 @@ _process_list(void *data, Ecore_Thread *thread) while (!ecore_thread_check(thread)) { - ecore_thread_feedback(thread, ui); + list = _process_list_get(pd); + ecore_thread_feedback(thread, list); for (int i = 0; i < delay * 4; i++) { if (ecore_thread_check(thread)) return; @@ -751,6 +729,52 @@ _process_list(void *data, Ecore_Thread *thread) } } +static void +_process_list_feedback_cb(void *data, Ecore_Thread *thread EINA_UNUSED, + void *msg EINA_UNUSED) +{ + Ui_Data *pd; + Eina_List *list; + Proc_Info *proc; + Elm_Object_Item *it; + + pd = data; + list = msg; + + eina_lock_take(&_lock); + + _genlist_ensure_n_items(pd->genlist, eina_list_count(list)); + + it = elm_genlist_first_item_get(pd->genlist); + + EINA_LIST_FREE(list, proc) + { + if (!it) + proc_info_free(proc); + else + { + Proc_Info *prev = elm_object_item_data_get(it); + if (prev) + proc_info_free(prev); + + elm_object_item_data_set(it, proc); + + it = elm_genlist_item_next_get(it); + } + } + + elm_genlist_realized_items_update(pd->genlist); + + eina_lock_release(&_lock); +} + +static void +_process_list_update(Ui_Data *pd) +{ + Eina_List *list = _process_list_get(pd); + _process_list_feedback_cb(pd, NULL, list); +} + static void _btn_icon_state_update(Evas_Object *button, Eina_Bool reverse) { --