netstar pushed a commit to branch master. http://git.enlightenment.org/apps/evisum.git/commit/?id=ceeb71c90a042bb4b38b8bb9f224b66912bb99e3
commit ceeb71c90a042bb4b38b8bb9f224b66912bb99e3 Author: Alastair Poole <nets...@gmail.com> Date: Fri Feb 26 08:14:58 2021 +0000 proc: files --- src/bin/system/process.c | 37 ++++++++++++++++++++++---- src/bin/system/process.h | 6 +++++ src/bin/ui/ui_process_list.c | 63 ++++++++++++++++++++++++++++++++++++++------ src/bin/ui/ui_process_list.h | 18 +++++++------ src/bin/ui/ui_process_view.c | 15 +++++++++++ 5 files changed, 118 insertions(+), 21 deletions(-) diff --git a/src/bin/system/process.c b/src/bin/system/process.c index 8c7a881..299da72 100644 --- a/src/bin/system/process.c +++ b/src/bin/system/process.c @@ -299,6 +299,19 @@ _stat(const char *path, Stat *st) return 1; } +static int +_n_files(Proc_Info *p) +{ + char buf[4096]; + + snprintf(buf, sizeof(buf), "/proc/%d/fd", p->pid); + p->fds = ecore_file_ls(buf); + if (p->fds) + p->numfiles = eina_list_count(p->fds); + + return p->numfiles; +} + static Eina_List * _process_list_linux_get(void) { @@ -334,13 +347,14 @@ _process_list_linux_get(void) p->cpu_id = st.psr; p->start = st.start_time; p->run_time = st.run_time; - if (toupper(st.state) == 'S') p->ssleep = 1; + if (toupper(st.state) == 'S') p->ssleep = 1; state = _process_state_name(st.state); snprintf(p->state, sizeof(p->state), "%s", state); p->cpu_time = st.utime + st.stime; p->nice = st.nice; p->priority = st.pri; p->numthreads = st.numthreads; + p->numfiles = _n_files(p); if (st.flags & PF_KTHREAD) p->is_kernel = 1; _mem_size(p); @@ -374,7 +388,7 @@ _proc_thread_info(Proc_Info *p) Proc_Info *t = calloc(1, sizeof(Proc_Info)); if (!t) continue; t->cpu_id = st.psr; - if (toupper(st.state) == 'S') p->ssleep = 1; + if (toupper(st.state) == 'S') p->ssleep = 1; state = _process_state_name(st.state); snprintf(t->state, sizeof(t->state), "%s", state); t->cpu_time = st.utime + st.stime; @@ -418,6 +432,7 @@ proc_info_by_pid(int pid) p->priority = st.pri; p->nice = st.nice; p->numthreads = st.numthreads; + p->numfiles = _n_files(p); if (st.flags & PF_KTHREAD) p->is_kernel = 1; _mem_size(p); _cmd_args(p, st.name, sizeof(st.name)); @@ -1089,13 +1104,12 @@ void proc_info_free(Proc_Info *proc) { Proc_Info *t; + char *s; if (!proc) return; EINA_LIST_FREE(proc->threads, t) - { - proc_info_free(t); - } + proc_info_free(t); if (proc->command) free(proc->command); @@ -1104,6 +1118,9 @@ proc_info_free(Proc_Info *proc) if (proc->thread_name) free(proc->thread_name); + EINA_LIST_FREE(proc->fds, s) + free(s); + free(proc); } @@ -1291,6 +1308,16 @@ proc_sort_by_threads(const void *p1, const void *p2) return inf1->numthreads - inf2->numthreads; } +int +proc_sort_by_files(const void *p1, const void *p2) +{ + const Proc_Info *inf1, *inf2; + + inf1 = p1; inf2 = p2; + + return inf1->numfiles - inf2->numfiles; +} + int proc_sort_by_size(const void *p1, const void *p2) { diff --git a/src/bin/system/process.h b/src/bin/system/process.h index cddc7ea..0f8ae9d 100644 --- a/src/bin/system/process.h +++ b/src/bin/system/process.h @@ -33,6 +33,9 @@ typedef struct _Proc_Info int ssleep; char state[32]; + Eina_List *fds; + int numfiles; + short is_kernel; int tid; char *thread_name; @@ -83,6 +86,9 @@ proc_sort_by_cpu(const void *p1, const void *p2); int proc_sort_by_threads(const void *p1, const void *p2); +int +proc_sort_by_files(const void *p1, const void *p2); + int proc_sort_by_size(const void *p1, const void *p2); diff --git a/src/bin/ui/ui_process_list.c b/src/bin/ui/ui_process_list.c index 8f99ac4..6510a18 100644 --- a/src/bin/ui/ui_process_list.c +++ b/src/bin/ui/ui_process_list.c @@ -66,6 +66,7 @@ typedef struct Evas_Object *btn_cpu; Evas_Object *btn_pri; Evas_Object *btn_nice; + Evas_Object *btn_files; Evas_Object *btn_size; Evas_Object *btn_virt; Evas_Object *btn_rss; @@ -122,14 +123,16 @@ _field_name(Proc_Field id) return _("Priority"); case PROC_FIELD_NICE: return _("Nice"); + case PROC_FIELD_FILES: + return _("Open files"); case PROC_FIELD_SIZE: - return _("Size"); + return _("Memory Size"); case PROC_FIELD_VIRT: - return _("Virtual"); + return _("Memory Virtual"); case PROC_FIELD_RSS: - return _("Reserved"); + return _("Memory Reserved"); case PROC_FIELD_SHARED: - return _("Shared"); + return _("Memory Shared"); case PROC_FIELD_STATE: return _("State"); case PROC_FIELD_TIME: @@ -390,6 +393,11 @@ _item_create(Evas_Object *obj) lb = _item_column_add(tb, "proc_nice", i++); evas_object_size_hint_align_set(lb, 1.0, FILL); } + if (_field_enabled(PROC_FIELD_FILES)) + { + lb = _item_column_add(tb, "proc_files", i++); + evas_object_size_hint_align_set(lb, 1.0, FILL); + } if (_field_enabled(PROC_FIELD_SIZE)) { lb = _item_column_add(tb, "proc_size", i++); @@ -583,6 +591,18 @@ _content_get(void *data, Evas_Object *obj, const char *source) evas_object_show(lb); } + if (_field_enabled(PROC_FIELD_FILES)) + { + evas_object_geometry_get(pd->btn_nice, NULL, NULL, &w, NULL); + lb = evas_object_data_get(it->obj, "proc_files"); + snprintf(buf, sizeof(buf), "%d", proc->numfiles); + if (strcmp(buf, elm_object_text_get(lb))) + elm_object_text_set(lb, buf); + rec = evas_object_data_get(lb, "rec"); + evas_object_size_hint_min_set(rec, w, 1); + evas_object_show(lb); + } + if (_field_enabled(PROC_FIELD_SIZE)) { evas_object_geometry_get(pd->btn_size, NULL, NULL, &w, NULL); @@ -1122,6 +1142,19 @@ _btn_nice_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, _btn_clicked_state_save(pd, pd->btn_nice); } +static void +_btn_files_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Ui_Data *pd = data; + Ui *ui = pd->ui; + + if (ui->proc.sort_type == PROC_SORT_BY_FILES) + ui->proc.sort_reverse = !ui->proc.sort_reverse; + ui->proc.sort_type = PROC_SORT_BY_FILES; + _btn_clicked_state_save(pd, pd->btn_files); +} + static void _btn_size_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) @@ -1608,6 +1641,19 @@ _content_add(Ui_Data *pd, Evas_Object *parent) _btn_nice_clicked_cb, pd); _fields[PROC_FIELD_NICE].btn = btn; + pd->btn_files = btn = elm_button_add(parent); + _btn_icon_state_init(btn, + (ui->proc.sort_type == PROC_SORT_BY_FILES ? + ui->proc.sort_reverse : 0), + ui->proc.sort_type == PROC_SORT_BY_FILES); + evas_object_size_hint_weight_set(btn, 1.0, 0); + evas_object_size_hint_align_set(btn, FILL, FILL); + elm_object_text_set(btn, _("files")); + evas_object_show(btn); + evas_object_smart_callback_add(btn, "clicked", + _btn_files_clicked_cb, pd); + _fields[PROC_FIELD_FILES].btn = btn; + pd->btn_size = btn = elm_button_add(parent); _btn_icon_state_init(btn, (ui->proc.sort_type == PROC_SORT_BY_SIZE ? @@ -2064,12 +2110,13 @@ static void _init(Ui_Data *pd) { pd->sorters[PROC_SORT_BY_NONE].sort_cb = proc_sort_by_pid; - pd->sorters[PROC_SORT_BY_PID].sort_cb = proc_sort_by_pid; pd->sorters[PROC_SORT_BY_UID].sort_cb = proc_sort_by_uid; - pd->sorters[PROC_SORT_BY_NICE].sort_cb = proc_sort_by_nice; - pd->sorters[PROC_SORT_BY_PRI].sort_cb = proc_sort_by_pri; - pd->sorters[PROC_SORT_BY_CPU].sort_cb = proc_sort_by_cpu; + pd->sorters[PROC_SORT_BY_PID].sort_cb = proc_sort_by_pid; pd->sorters[PROC_SORT_BY_THREADS].sort_cb = proc_sort_by_threads; + pd->sorters[PROC_SORT_BY_CPU].sort_cb = proc_sort_by_cpu; + pd->sorters[PROC_SORT_BY_PRI].sort_cb = proc_sort_by_pri; + pd->sorters[PROC_SORT_BY_NICE].sort_cb = proc_sort_by_nice; + pd->sorters[PROC_SORT_BY_FILES].sort_cb = proc_sort_by_files; pd->sorters[PROC_SORT_BY_SIZE].sort_cb = proc_sort_by_size; pd->sorters[PROC_SORT_BY_VIRT].sort_cb = proc_sort_by_virt; pd->sorters[PROC_SORT_BY_RSS].sort_cb = proc_sort_by_rss; diff --git a/src/bin/ui/ui_process_list.h b/src/bin/ui/ui_process_list.h index ade7eb0..9778d7d 100644 --- a/src/bin/ui/ui_process_list.h +++ b/src/bin/ui/ui_process_list.h @@ -13,6 +13,7 @@ typedef enum PROC_SORT_BY_CPU, PROC_SORT_BY_PRI, PROC_SORT_BY_NICE, + PROC_SORT_BY_FILES, PROC_SORT_BY_SIZE, PROC_SORT_BY_VIRT, PROC_SORT_BY_RSS, @@ -32,14 +33,15 @@ typedef enum PROC_FIELD_CPU = 5, PROC_FIELD_PRI = 6, PROC_FIELD_NICE = 7, - PROC_FIELD_SIZE = 8, - PROC_FIELD_VIRT = 9, - PROC_FIELD_RSS = 10, - PROC_FIELD_SHARED = 11, - PROC_FIELD_STATE = 12, - PROC_FIELD_TIME = 13, - PROC_FIELD_CPU_USAGE = 14, - PROC_FIELD_MAX = 15, + PROC_FIELD_FILES = 8, + PROC_FIELD_SIZE = 9, + PROC_FIELD_VIRT = 10, + PROC_FIELD_RSS = 11, + PROC_FIELD_SHARED = 12, + PROC_FIELD_STATE = 13, + PROC_FIELD_TIME = 14, + PROC_FIELD_CPU_USAGE = 15, + PROC_FIELD_MAX = 16, } Proc_Field; void diff --git a/src/bin/ui/ui_process_view.c b/src/bin/ui/ui_process_view.c index 0e9382f..c09c2a4 100644 --- a/src/bin/ui/ui_process_view.c +++ b/src/bin/ui/ui_process_view.c @@ -39,6 +39,7 @@ typedef struct Evas_Object *entry_uid; Evas_Object *entry_cpu; Evas_Object *entry_threads; + Evas_Object *entry_files; Evas_Object *entry_virt; Evas_Object *entry_rss; Evas_Object *entry_shared; @@ -838,6 +839,8 @@ static void _general_view_update(Ui_Data *pd, Proc_Info *proc) { struct passwd *pwd_entry; + Eina_List *l; + char *s; if (!strcmp(proc->state, "stop")) { @@ -869,6 +872,13 @@ _general_view_update(Ui_Data *pd, Proc_Info *proc) elm_object_text_set(pd->general.entry_ppid, eina_slstr_printf("%d", proc->ppid)); elm_object_text_set(pd->general.entry_threads, eina_slstr_printf("%d", proc->numthreads)); + Eina_Strbuf *b = eina_strbuf_new(); + EINA_LIST_FOREACH(proc->fds, l, s) + eina_strbuf_append_printf(b, "%s ", s); + if (eina_strbuf_length_get(b)) + elm_object_text_set(pd->general.entry_files, eina_strbuf_string_get(b)); + eina_strbuf_free(b); + elm_object_text_set(pd->general.entry_virt, evisum_size_format(proc->mem_virt)); elm_object_text_set(pd->general.entry_rss, evisum_size_format(proc->mem_rss)); #if !defined(__linux__) @@ -1117,6 +1127,11 @@ _general_tab_add(Evas_Object *parent, Ui_Data *pd) pd->general.entry_threads = entry = _entry_add(parent); elm_table_pack(tb, entry, 1, i++, 1, 1); + lb = _lb_add(parent, _("Files:")); + elm_table_pack(tb, lb, 0, i, 1, 1); + pd->general.entry_files = entry = _entry_add(parent); + elm_table_pack(tb, entry, 1, i++, 1, 1); + lb = _lb_add(parent, _(" Memory :")); elm_table_pack(tb, lb, 0, i, 1, 1); pd->general.entry_size = entry = _entry_add(parent); --