netstar pushed a commit to branch master.

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

commit faf3b8d989b1e3a48ac73cf5860d306d15bfd891
Author: Alastair Poole <nets...@gmail.com>
Date:   Tue May 12 19:51:05 2020 +0100

    proc: refactor for thread information.
    
    If we are going to be fetching per-process thread states we really
    need to clean up this Linux /proc/*/stat parsing.
    
    I think this /proc fs implementation just sort of "happened".
    To be decided which I prefer yet of the four architectures, def, not
    Linux though :)
---
 src/bin/process.c | 153 +++++++++++++++++++++++++-----------------------------
 1 file changed, 72 insertions(+), 81 deletions(-)

diff --git a/src/bin/process.c b/src/bin/process.c
index 1ae91ed..0fc03d4 100644
--- a/src/bin/process.c
+++ b/src/bin/process.c
@@ -194,9 +194,9 @@ _cmd_args(Proc_Info *p, int pid, char *name, size_t len)
              n = line;
              while (*n && (*n + 1))
                {
-                 eina_strbuf_append(buf, n);
-                 n = strchr(n, '\0') + 1;
-                if (*n && (*n + 1)) eina_strbuf_append(buf, " ");
+                  eina_strbuf_append(buf, n);
+                  n = strchr(n, '\0') + 1;
+                  if (*n && (*n + 1)) eina_strbuf_append(buf, " ");
                }
              p->arguments = eina_strbuf_release(buf);
           }
@@ -233,70 +233,88 @@ _uid(int pid)
    return uid;
 }
 
+typedef struct {
+   int pid, utime, stime, cutime, cstime;
+   int psr, pri, nice, numthreads;
+   char state;
+   unsigned int mem_rss, flags;
+   unsigned long mem_virt;
+   char name[1024];
+} Stat;
+
+static Eina_Bool
+_stat(const char *path, Stat *st)
+{
+   FILE *f;
+   char line[4096];
+   int dummy, res = 0;
+
+   memset(st, 0, sizeof(Stat));
+
+   f = fopen(path, "r");
+   if (!f) return EINA_FALSE;
+
+   if (fgets(line, sizeof(line), f))
+     {
+        char *end, *start = strchr(line, '(') + 1;
+        end = strchr(line, ')');
+
+        strncpy(st->name, start, end - start);
+        st->name[end - start] = '\0';
+        res = sscanf(end + 2, "%c %d %d %d %d %d %u %u %u %u %u %d %d %d"
+              " %d %d %d %u %u %d %lu %u %u %u %u %u %u %u %d %d %d %d %u"
+              " %d %d %d %d %d %d %d %d %d",
+              &st->state, &dummy, &dummy, &dummy, &dummy, &dummy, &st->flags,
+              &dummy, &dummy, &dummy, &dummy, &st->utime, &st->stime, 
&st->cutime,
+              &st->cstime, &st->pri, &st->nice, &st->numthreads, &dummy, 
&dummy,
+              &st->mem_virt, &st->mem_rss, &dummy, &dummy, &dummy, &dummy, 
&dummy,
+              &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy,
+              &dummy, &dummy, &st->psr, &dummy, &dummy, &dummy, &dummy, 
&dummy);
+     }
+   fclose(f);
+
+   if (res != 42) return EINA_FALSE;
+
+   return EINA_TRUE;
+}
+
 static Eina_List *
 _process_list_linux_get(void)
 {
    Eina_List *files, *list;
-   FILE *f;
    char *n;
-   char state, line[4096], name[1024];
-   int pid, res, utime, stime, cutime, cstime, psr, pri, nice, numthreads;
-   int dummy;
-   unsigned int mem_rss, flags;
-   unsigned long mem_virt;
+   Stat st;
 
-   res = 0;
    list = NULL;
 
    files = ecore_file_ls("/proc");
    EINA_LIST_FREE(files, n)
      {
-        pid = atoi(n);
+        int pid = atoi(n);
         free(n);
 
         if (!pid) continue;
 
-        f = fopen(eina_slstr_printf("/proc/%d/stat", pid), "r");
-        if (!f) continue;
-
-        if (fgets(line, sizeof(line), f))
-          {
-             char *end, *start = strchr(line, '(') + 1;
-             end = strchr(line, ')');
-
-             strncpy(name, start, end - start);
-             name[end - start] = '\0';
-             res = sscanf(end + 2, "%c %d %d %d %d %d %u %u %u %u %u %d %d %d"
-                   " %d %d %d %u %u %d %lu %u %u %u %u %u %u %u %d %d %d %d %u"
-                   " %d %d %d %d %d %d %d %d %d",
-                   &state, &dummy, &dummy, &dummy, &dummy, &dummy, &flags,
-                   &dummy, &dummy, &dummy, &dummy, &utime, &stime, &cutime,
-                   &cstime, &pri, &nice, &numthreads, &dummy, &dummy,
-                   &mem_virt, &mem_rss, &dummy, &dummy, &dummy, &dummy, &dummy,
-                   &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy,
-                   &dummy, &dummy, &psr, &dummy, &dummy, &dummy, &dummy, 
&dummy);
-          }
-        fclose(f);
+        if (!_stat(eina_slstr_printf("/proc/%d/stat", pid), &st))
+          continue;
 
-        if (res != 42) continue;
-        if (flags & PF_KTHREAD) continue;
+        if (st.flags & PF_KTHREAD) continue;
 
         Proc_Info *p = calloc(1, sizeof(Proc_Info));
         if (!p) return NULL;
 
         p->pid = pid;
         p->uid = _uid(pid);
-        p->cpu_id = psr;
-        p->state = _process_state_name(state);
-        p->cpu_time = utime + stime;
-        p->nice = nice;
-        p->priority = pri;
-        p->numthreads = numthreads;
-
-        p->mem_virt = mem_virt;
+        p->cpu_id = st.psr;
+        p->state = _process_state_name(st.state);
+        p->cpu_time = st.utime + st.stime;
+        p->nice = st.nice;
+        p->priority = st.pri;
+        p->numthreads = st.numthreads;
+        p->mem_virt = st.mem_virt;
         _mem_size(p, pid);
 
-        _cmd_args(p, pid, name, sizeof(name));
+        _cmd_args(p, pid, st.name, sizeof(st.name));
 
         list = eina_list_append(list, p);
      }
@@ -310,53 +328,26 @@ _process_list_linux_get(void)
 Proc_Info *
 proc_info_by_pid(int pid)
 {
-   FILE *f;
-   char line[4096], name[1024], state;
-   int res, dummy, utime, stime, cutime, cstime, psr;
-   unsigned int mem_rss, pri, nice, numthreads, flags;
-   unsigned long int mem_virt;
+   Stat st;
 
-   f = fopen(eina_slstr_printf("/proc/%d/stat", pid), "r");
-   if (!f) return NULL;
-
-   if (fgets(line, sizeof(line), f))
-     {
-        char *end, *start = strchr(line, '(') + 1;
-        end = strchr(line, ')');
-        strncpy(name, start, end - start);
-        name[end - start] = '\0';
-        res = sscanf(end + 2, "%c %d %d %d %d %d %u %u %u %u %u %d %d %d"
-              " %d %d %d %u %u %d %lu %u %u %u %u %u %u %u %d %d %d %d %u"
-              " %d %d %d %d %d %d %d %d %d",
-              &state, &dummy, &dummy, &dummy, &dummy, &dummy, &flags,
-              &dummy, &dummy, &dummy, &dummy, &utime, &stime, &cutime,
-              &cstime, &pri, &nice, &numthreads, &dummy, &dummy,
-              &mem_virt, &mem_rss, &dummy, &dummy, &dummy, &dummy, &dummy,
-              &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy,
-              &dummy, &dummy, &psr, &dummy, &dummy, &dummy, &dummy, &dummy);
-     }
-   fclose(f);
-
-   if (res != 42) return NULL;
+   if (!_stat(eina_slstr_printf("/proc/%d/stat", pid), &st))
+     return NULL;
 
    Proc_Info *p = calloc(1, sizeof(Proc_Info));
    if (!p) return NULL;
 
    p->pid = pid;
    p->uid = _uid(pid);
-   p->cpu_id = psr;
-   p->state = _process_state_name(state);
-   p->cpu_time = utime + stime;
-
-   p->mem_virt = mem_virt;
-   p->mem_rss = mem_rss * getpagesize();
+   p->cpu_id = st.psr;
+   p->state = _process_state_name(st.state);
+   p->cpu_time = st.utime + st.stime;
+   p->priority = st.pri;
+   p->nice = st.nice;
+   p->numthreads = st.numthreads;
+   p->mem_virt = st.mem_virt;
    _mem_size(p, pid);
 
-   p->priority = pri;
-   p->nice = nice;
-   p->numthreads = numthreads;
-
-   _cmd_args(p, pid, name, sizeof(name));
+   _cmd_args(p, pid, st.name, sizeof(st.name));
 
    return p;
 }

-- 


Reply via email to