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);

-- 


Reply via email to