netstar pushed a commit to branch master.

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

commit cf9d6dd95cb53eca22b36f4321a1ab4ebc56d852
Author: Alastair Poole <[email protected]>
Date:   Sun Aug 16 14:56:50 2020 +0100

    process: start time (linux)
---
 src/bin/system/process.c | 36 ++++++++++++++++++++++++++++++++++--
 1 file changed, 34 insertions(+), 2 deletions(-)

diff --git a/src/bin/system/process.c b/src/bin/system/process.c
index bed56ec..6235111 100644
--- a/src/bin/system/process.c
+++ b/src/bin/system/process.c
@@ -254,9 +254,33 @@ _uid(int pid)
    return uid;
 }
 
+static int64_t
+_boot_time(void)
+{
+   FILE *f;
+   int64_t boot_time;
+   char buf[4096];
+   double uptime = 0.0;
+
+   f = fopen("/proc/uptime", "r");
+   if (!f) return 0;
+
+   if (fgets(buf, sizeof(buf), f))
+     sscanf(buf, "%lf", &uptime);
+   else boot_time = 0;
+
+   fclose(f);
+
+   if (uptime > 0.0)
+     boot_time = time(NULL) - (time_t) uptime;
+
+   return boot_time;
+}
+
 typedef struct {
    int pid, ppid, utime, stime, cutime, cstime;
    int psr, pri, nice, numthreads;
+   long long int start_time;
    char state;
    unsigned int mem_rss, flags;
    unsigned long mem_virt;
@@ -269,6 +293,9 @@ _stat(const char *path, Stat *st)
    FILE *f;
    char line[4096];
    int dummy, res = 0;
+   static int64_t boot_time = 0;
+
+   if (!boot_time) boot_time = _boot_time();
 
    memset(st, 0, sizeof(Stat));
 
@@ -283,11 +310,11 @@ _stat(const char *path, Stat *st)
         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 %u %u %lld %lu %u %u %u %u %u %u %u %d %d %d %d %u"
               " %d %d %d %d %d %d %d %d %d",
               &st->state, &st->ppid, &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->cstime, &st->pri, &st->nice, &st->numthreads, &dummy, 
&st->start_time,
               &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);
@@ -296,6 +323,9 @@ _stat(const char *path, Stat *st)
 
    if (res != 42) return EINA_FALSE;
 
+   st->start_time /= sysconf(_SC_CLK_TCK);
+   st->start_time += boot_time;
+
    return EINA_TRUE;
 }
 
@@ -329,6 +359,7 @@ _process_list_linux_get(void)
         p->ppid = st.ppid;
         p->uid = _uid(pid);
         p->cpu_id = st.psr;
+        p->start = st.start_time;
         p->state = _process_state_name(st.state);
         p->cpu_time = st.utime + st.stime;
         p->nice = st.nice;
@@ -391,6 +422,7 @@ proc_info_by_pid(int pid)
    p->ppid = st.ppid;
    p->uid = _uid(pid);
    p->cpu_id = st.psr;
+   p->start = st.start_time;
    p->state = _process_state_name(st.state);
    p->cpu_time = st.utime + st.stime;
    p->priority = st.pri;

-- 


Reply via email to