netstar pushed a commit to branch master.

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

commit 9ae4eafa13ba63a3fd6370173b8b92059f867b0d
Author: Alastair Poole <[email protected]>
Date:   Fri May 15 14:24:38 2020 +0100

    FreeBSD: Add Support for Thread States
---
 src/bin/system/process.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 82 insertions(+), 2 deletions(-)

diff --git a/src/bin/system/process.c b/src/bin/system/process.c
index f004fec..24172dd 100644
--- a/src/bin/system/process.c
+++ b/src/bin/system/process.c
@@ -967,8 +967,8 @@ _cmd_get(Proc_Info *p, struct kinfo_proc *kp)
    p->command = strdup(name);
 }
 
-Proc_Info *
-proc_info_by_pid(int pid)
+static Proc_Info *
+_proc_info_by_pid_fallback(int pid)
 {
    struct rusage *usage;
    struct kinfo_proc kp;
@@ -1014,6 +1014,86 @@ proc_info_by_pid(int pid)
    return p;
 }
 
+static Proc_Info *
+_proc_thread_info(struct kinfo_proc *kp, Eina_Bool is_thread)
+{
+   struct rusage *usage;
+   Proc_Info *p;
+   static int pagesize = 0;
+
+   if (!pagesize) pagesize = getpagesize();
+
+   p = calloc(1, sizeof(Proc_Info));
+
+   p->pid = kp->ki_pid;
+   p->uid = kp->ki_uid;
+   if (!is_thread)
+     _cmd_get(p, kp);
+   else
+     p->command = strdup(kp->ki_tdname);
+
+   p->cpu_id = kp->ki_oncpu;
+   if (p->cpu_id == -1)
+     p->cpu_id = kp->ki_lastcpu;
+
+   usage = &kp->ki_rusage;
+
+   p->cpu_time = (usage->ru_utime.tv_sec * 1000000) + usage->ru_utime.tv_usec +
+       (usage->ru_stime.tv_sec * 1000000) + usage->ru_stime.tv_usec;
+   p->cpu_time /= 10000;
+   p->state = _process_state_name(kp->ki_stat);
+   p->mem_virt = kp->ki_size;
+   p->mem_rss = kp->ki_rssize * pagesize;
+   p->mem_size = p->mem_virt;
+   p->nice = kp->ki_nice - NZERO;
+   p->priority = kp->ki_pri.pri_level - PZERO;
+   p->numthreads = kp->ki_numthreads;
+
+   return p;
+}
+
+Proc_Info *
+proc_info_by_pid(int pid)
+{
+   kvm_t *kern;
+   struct kinfo_proc *kps, *kp;
+   char errbuf[_POSIX2_LINE_MAX];
+   int pid_count;
+
+   kern = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf);
+   if (!kern)
+     return _proc_info_by_pid_fallback(pid);
+
+   kps = kvm_getprocs(kern, KERN_PROC_ALL, 0, &pid_count);
+   if (!kps)
+     {
+        kvm_close(kern);
+        return _proc_info_by_pid_fallback(pid);
+     }
+
+   Proc_Info *p = NULL;
+
+   for (int i = 0; i < pid_count; i++)
+     {
+        if (kps[i].ki_flag & P_KPROC)
+          continue;
+        if (kps[i].ki_pid != pid)
+          continue;
+
+        kp = &kps[i];
+        Proc_Info *t = _proc_thread_info(kp, EINA_TRUE);
+        if (!p)
+          p = _proc_thread_info(kp, EINA_FALSE);
+
+        p->threads = eina_list_append(p->threads, t);
+     }
+
+   kvm_close(kern);
+
+   if (!p) return _proc_info_by_pid_fallback(pid);
+
+   return p;
+}
 #endif
 
 void

-- 


Reply via email to