netstar pushed a commit to branch master.

http://git.enlightenment.org/apps/evisum.git/commit/?id=6d5f404eb3f18ae5c84408455372c2dcc2440d1c

commit 6d5f404eb3f18ae5c84408455372c2dcc2440d1c
Author: Alastair Poole <[email protected]>
Date:   Tue May 12 20:34:07 2020 +0100

    proc: Add basic thread support (Linux).
    
    Just a start.
---
 src/bin/process.c | 47 +++++++++++++++++++++++++++++++++++++++++++++--
 src/bin/process.h |  2 ++
 2 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/src/bin/process.c b/src/bin/process.c
index 0fc03d4..de18c8e 100644
--- a/src/bin/process.c
+++ b/src/bin/process.c
@@ -313,7 +313,6 @@ _process_list_linux_get(void)
         p->numthreads = st.numthreads;
         p->mem_virt = st.mem_virt;
         _mem_size(p, pid);
-
         _cmd_args(p, pid, st.name, sizeof(st.name));
 
         list = eina_list_append(list, p);
@@ -325,6 +324,39 @@ _process_list_linux_get(void)
    return list;
 }
 
+static void
+_proc_thread_info(Proc_Info *p)
+{
+   Eina_List *files;
+   char *n;
+   Stat st;
+
+   files = ecore_file_ls(eina_slstr_printf("/proc/%d/task", p->pid));
+   EINA_LIST_FREE(files, n)
+     {
+        int tid = atoi(n);
+        free(n);
+        if (!_stat(eina_slstr_printf("/proc/%d/task/%d/stat", p->pid, tid), 
&st))
+          continue;
+
+        Proc_Info *t = calloc(1, sizeof(Proc_Info));
+        if (!t) continue;
+        t->cpu_id = st.psr;
+        t->state = _process_state_name(st.state);
+        t->cpu_time = st.utime + st.stime;
+        t->nice = st.nice;
+        t->priority = st.pri;
+        t->numthreads = st.numthreads;
+        t->mem_virt = st.mem_virt;
+        t->mem_rss = st.mem_rss;
+        t->command = strdup(st.name);
+        p->threads = eina_list_append(p->threads, t);
+     }
+
+   if (files)
+     eina_list_free(files);
+}
+
 Proc_Info *
 proc_info_by_pid(int pid)
 {
@@ -346,9 +378,10 @@ proc_info_by_pid(int pid)
    p->numthreads = st.numthreads;
    p->mem_virt = st.mem_virt;
    _mem_size(p, pid);
-
    _cmd_args(p, pid, st.name, sizeof(st.name));
 
+   _proc_thread_info(p);
+
    return p;
 }
 
@@ -985,6 +1018,16 @@ proc_info_by_pid(int pid)
 void
 proc_info_free(Proc_Info *proc)
 {
+   Proc_Info *t;
+
+   EINA_LIST_FREE(proc->threads, t)
+     {
+        proc_info_free(t);
+     }
+
+   if (proc->threads)
+     eina_list_free(proc->threads);
+
    if (proc->command)
      free(proc->command);
    if (proc->arguments)
diff --git a/src/bin/process.h b/src/bin/process.h
index 040b88e..4ebe6c6 100644
--- a/src/bin/process.h
+++ b/src/bin/process.h
@@ -45,6 +45,8 @@ typedef struct _Proc_Info
 
    // Not used yet in UI.
    long        cpu_time;
+
+   Eina_List  *threads;
 } Proc_Info;
 
 /**

-- 


Reply via email to