netstar pushed a commit to branch master.

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

commit 4d4ba4dec2d077db35b558ad18482416ce9df2a3
Author: Alastair Poole <[email protected]>
Date:   Fri May 15 23:00:44 2020 +0100

    proc: Improve PID listing for macOS.
    
    Improved PID listing. Old as fallback.
---
 src/bin/system/process.c | 85 ++++++++++++++++++++++++++++++++++++------------
 1 file changed, 64 insertions(+), 21 deletions(-)

diff --git a/src/bin/system/process.c b/src/bin/system/process.c
index 6374d0d..7babb39 100644
--- a/src/bin/system/process.c
+++ b/src/bin/system/process.c
@@ -669,38 +669,81 @@ _cmd_get(Proc_Info *p, int pid)
    free(argv);
 }
 
+static Proc_Info *
+_proc_pidinfo(size_t pid)
+{
+   struct proc_taskallinfo taskinfo;
+   int size = proc_pidinfo(pid, PROC_PIDTASKALLINFO, 0, &taskinfo, 
sizeof(taskinfo));
+   if (size != sizeof(taskinfo)) return NULL;
+
+   Proc_Info *p = calloc(1, sizeof(Proc_Info));
+   if (!p) return NULL;
+
+   p->pid = pid;
+   p->uid = taskinfo.pbsd.pbi_uid;
+   p->cpu_id = -1;
+   p->cpu_time = taskinfo.ptinfo.pti_total_user +
+      taskinfo.ptinfo.pti_total_system;
+   p->cpu_time /= 10000000;
+   p->state = _process_state_name(taskinfo.pbsd.pbi_status);
+   p->mem_size = p->mem_virt = taskinfo.ptinfo.pti_virtual_size;
+   p->mem_rss = taskinfo.ptinfo.pti_resident_size;
+   p->mem_shared = 0;
+   p->priority = taskinfo.ptinfo.pti_priority;
+   p->nice = taskinfo.pbsd.pbi_nice;
+   p->numthreads = taskinfo.ptinfo.pti_threadnum;
+   _cmd_get(p, pid);
+
+   return p;
+}
+
 static Eina_List *
-_process_list_macos_get(void)
+_process_list_macos_fallback_get(void)
 {
    Eina_List *list = NULL;
 
    for (int i = 1; i <= PID_MAX; i++)
      {
-        struct proc_taskallinfo taskinfo;
-        int size = proc_pidinfo(i, PROC_PIDTASKALLINFO, 0, &taskinfo, 
sizeof(taskinfo));
-        if (size != sizeof(taskinfo)) continue;
+        Proc_Info *p = _proc_pidinfo(i);
+        if (p)
+          list = eina_list_append(list, p);
+     }
 
-        Proc_Info *p = calloc(1, sizeof(Proc_Info));
-        if (!p) return NULL;
+   return list;
+}
 
-        p->pid = i;
-        p->uid = taskinfo.pbsd.pbi_uid;
-        p->cpu_id = -1;
-        p->cpu_time = taskinfo.ptinfo.pti_total_user +
-           taskinfo.ptinfo.pti_total_system;
-        p->cpu_time /= 10000000;
-        p->state = _process_state_name(taskinfo.pbsd.pbi_status);
-        p->mem_size = p->mem_virt = taskinfo.ptinfo.pti_virtual_size;
-        p->mem_rss = taskinfo.ptinfo.pti_resident_size;
-        p->mem_shared = 0;
-        p->priority = taskinfo.ptinfo.pti_priority;
-        p->nice = taskinfo.pbsd.pbi_nice;
-        p->numthreads = taskinfo.ptinfo.pti_threadnum;
-        _cmd_get(p, i);
+static Eina_List *
+_process_list_macos_get(void)
+{
+   Eina_List *list = NULL;
+   pid_t *pids = NULL;
+   int size, pid_count;
 
-        list = eina_list_append(list, p);
+   size = proc_listpids(PROC_ALL_PIDS, 0, NULL, 0);
+   if (size == -1)
+     return _process_list_macos_fallback_get();
+
+   pids = malloc(size * sizeof(pid_t));
+   if (!pids) return NULL;
+
+   size = proc_listpids(PROC_ALL_PIDS, 0, pids, size * sizeof(pid_t));
+   if (size == -1)
+     {
+        free(pids);
+        return _process_list_macos_fallback_get();
      }
 
+   pid_count = size / sizeof(pid_t);
+   for (int i = 0; i < pid_count; i++)
+     {
+        pid_t pid = pids[i];
+        Proc_Info *p = _proc_pidinfo(pid);
+        if (p)
+          list = eina_list_append(list, p);
+     }
+
+   free(pids);
+
    return list;
 }
 

-- 


Reply via email to