This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository evisum.

View the commit online.

commit f19e9c662b4ed23518f9f7c585d7490ad72332b6
Author: Alastair Poole <[email protected]>
AuthorDate: Sat Mar 28 11:44:26 2026 +0000

    process_list: parse from file and remove hash.
    
    Move logic into our existing process hashes we HAVE to duplicate.
---
 src/bin/system/process.c            | 114 ++++++------------------------------
 src/bin/ui/evisum_ui_process_list.c |  31 +++++++---
 src/bin/ui/evisum_ui_process_view.c |   9 ++-
 3 files changed, 46 insertions(+), 108 deletions(-)

diff --git a/src/bin/system/process.c b/src/bin/system/process.c
index 56b13b9..0dece22 100644
--- a/src/bin/system/process.c
+++ b/src/bin/system/process.c
@@ -273,93 +273,6 @@ typedef struct {
     char name[1024];
 } Stat;
 
-typedef struct {
-    uint64_t in;
-    uint64_t out;
-} Pid_Net_Stats;
-
-static void
-_pid_net_stats_free_cb(void *data) {
-    Pid_Net_Stats *stats = data;
-    free(stats);
-}
-
-static uint64_t
-_line_u64_get(const char *line, const char *tag) {
-    const char *p = strstr(line, tag);
-    char *end = NULL;
-
-    if (!p) return 0;
-    p += strlen(tag);
-
-    return strtoull(p, &end, 10);
-}
-
-static Pid_Net_Stats *
-_pid_net_stats_get_or_add(Eina_Hash *hash, int64_t pid) {
-    Pid_Net_Stats *stats;
-
-    stats = eina_hash_find(hash, &pid);
-    if (stats) return stats;
-
-    stats = calloc(1, sizeof(Pid_Net_Stats));
-    if (!stats) return NULL;
-
-    eina_hash_add(hash, &pid, stats);
-
-    return stats;
-}
-
-static Eina_Hash *
-_net_stats_cache_get(void) {
-    static Eina_Hash *cache = NULL;
-    static double last_refresh = 0.0;
-    FILE *f;
-    char line[4096];
-    int64_t current_pid = -1;
-    double now = ecore_time_get();
-
-    if (cache && ((now - last_refresh) < 0.5)) return cache;
-
-    if (cache) eina_hash_free(cache);
-
-    cache = eina_hash_int64_new(_pid_net_stats_free_cb);
-    if (!cache) return NULL;
-
-    f = popen("ss -H -tinp 2>/dev/null", "r");
-    if (!f) {
-        last_refresh = now;
-        return cache;
-    }
-
-    while (fgets(line, sizeof(line), f)) {
-        uint64_t in = _line_u64_get(line, "bytes_received:");
-        uint64_t out = _line_u64_get(line, "bytes_acked:");
-        const char *p = line;
-        int64_t line_pid = -1;
-
-        p = strstr(p, "pid=");
-        if (p) {
-            p += 4;
-            line_pid = strtoll(p, NULL, 10);
-            if (line_pid > 0) current_pid = line_pid;
-        }
-
-        if ((!in && !out) || (current_pid <= 0)) continue;
-
-        Pid_Net_Stats *stats = _pid_net_stats_get_or_add(cache, current_pid);
-        if (!stats) continue;
-
-        stats->in += in;
-        stats->out += out;
-    }
-
-    pclose(f);
-    last_refresh = now;
-
-    return cache;
-}
-
 static Eina_Bool
 _stat(const char *path, Stat *st) {
     FILE *f;
@@ -428,22 +341,29 @@ _n_files(Proc_Info *p) {
 
 static void
 _net_transfer_get(Proc_Info *p) {
-    Eina_Hash *cache;
-    int64_t pid;
-    Pid_Net_Stats *stats;
+    FILE *f;
+    char path[PATH_MAX];
+    char buf[4096], name[128];
+    unsigned long long in, out, dummy;
 
     p->net_in = 0;
     p->net_out = 0;
 
-    cache = _net_stats_cache_get();
-    if (!cache) return;
+    snprintf(path, sizeof(path), "/proc/%d/net/dev", p->pid);
+    f = fopen(path, "r");
+    if (!f) return;
 
-    pid = p->pid;
-    stats = eina_hash_find(cache, &pid);
-    if (!stats) return;
+    while (fgets(buf, sizeof(buf), f)) {
+        if (17 == sscanf(buf,
+                         "%127s %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu %llu",
+                         name, &in, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &out, &dummy, &dummy,
+                         &dummy, &dummy, &dummy, &dummy, &dummy)) {
+            p->net_in += in;
+            p->net_out += out;
+        }
+    }
 
-    p->net_in = stats->in;
-    p->net_out = stats->out;
+    fclose(f);
 }
 
 static Eina_List *
diff --git a/src/bin/ui/evisum_ui_process_list.c b/src/bin/ui/evisum_ui_process_list.c
index be4cb76..117f44f 100644
--- a/src/bin/ui/evisum_ui_process_list.c
+++ b/src/bin/ui/evisum_ui_process_list.c
@@ -55,7 +55,6 @@ typedef struct {
     Evas_Object *tb_main;
 
     Elm_Genlist_Item_Class itc;
-
     Evas_Object *btn_menu;
     Evisum_Ui_Widget_Exel *widget_exel;
 
@@ -76,6 +75,7 @@ typedef struct {
 #define PROC_COL_MIN_WIDTH        48
 
 typedef struct {
+    int64_t start;
     int64_t cpu_time;
     uint64_t net_in;
     uint64_t net_out;
@@ -639,25 +639,39 @@ _evisum_ui_process_list_search_trim(Eina_List *list, Evisum_Ui_Process_List_View
             int64_t id = proc->pid;
 
             if ((cache = eina_hash_find(view->proc_usage_cache, &id))) {
-                uint64_t net_in = proc->net_in;
-                uint64_t net_out = proc->net_out;
+                uint64_t net_in_abs = proc->net_in;
+                uint64_t net_out_abs = proc->net_out;
                 int elapsed = view->ui->proc.poll_delay;
                 if (elapsed <= 0) elapsed = 1;
 
-                if (cache->cpu_time) proc->cpu_usage = (double) (proc->cpu_time - cache->cpu_time) / elapsed;
+                if (cache->start != proc->start) {
+                    cache->start = proc->start;
+                    cache->cpu_time = proc->cpu_time;
+                    cache->net_in = net_in_abs;
+                    cache->net_out = net_out_abs;
+                    proc->cpu_usage = 0.0;
+                    proc->net_in = 0;
+                    proc->net_out = 0;
+                    continue;
+                }
+
+                if (cache->cpu_time && proc->cpu_time >= cache->cpu_time)
+                    proc->cpu_usage = (double) (proc->cpu_time - cache->cpu_time) / elapsed;
+                else proc->cpu_usage = 0.0;
                 cache->cpu_time = proc->cpu_time;
 
-                if (cache->net_in && net_in >= cache->net_in) proc->net_in = (net_in - cache->net_in) / elapsed;
+                if (cache->net_in && net_in_abs >= cache->net_in) proc->net_in = (net_in_abs - cache->net_in) / elapsed;
                 else proc->net_in = 0;
 
-                if (cache->net_out && net_out >= cache->net_out) proc->net_out = (net_out - cache->net_out) / elapsed;
+                if (cache->net_out && net_out_abs >= cache->net_out) proc->net_out = (net_out_abs - cache->net_out) / elapsed;
                 else proc->net_out = 0;
 
-                cache->net_in = net_in;
-                cache->net_out = net_out;
+                cache->net_in = net_in_abs;
+                cache->net_out = net_out_abs;
             } else {
                 cache = calloc(1, sizeof(Proc_Usage_Cache));
                 if (cache) {
+                    cache->start = proc->start;
                     cache->cpu_time = proc->cpu_time;
                     cache->net_in = proc->net_in;
                     cache->net_out = proc->net_out;
@@ -1426,6 +1440,7 @@ _evisum_ui_process_list_config_changed_cb(void *data, int type EINA_UNUSED, void
     it = eina_hash_iterator_data_new(view->proc_usage_cache);
     while (eina_iterator_next(it, &d)) {
         Proc_Usage_Cache *cache = d;
+        cache->start = 0;
         cache->cpu_time = 0;
         cache->net_in = 0;
         cache->net_out = 0;
diff --git a/src/bin/ui/evisum_ui_process_view.c b/src/bin/ui/evisum_ui_process_view.c
index f60b7df..67b2d5f 100644
--- a/src/bin/ui/evisum_ui_process_view.c
+++ b/src/bin/ui/evisum_ui_process_view.c
@@ -793,6 +793,7 @@ _evisum_ui_process_view_proc_info_feedback_cb(void *data, Ecore_Thread *thread,
     Evisum_Ui_Process_View *view;
     Proc_Info *proc;
     double cpu_usage = 0.0;
+    int elapsed;
 #if defined(__linux__)
     uint64_t net_in = 0;
     uint64_t net_out = 0;
@@ -802,6 +803,8 @@ _evisum_ui_process_view_proc_info_feedback_cb(void *data, Ecore_Thread *thread,
 
     view = data;
     proc = msg;
+    elapsed = view->poll_delay;
+    if (elapsed <= 0) elapsed = 1;
 
     if (!proc || (view->start && (proc->start != view->start))) {
         if (proc) proc_info_free(proc);
@@ -824,7 +827,7 @@ _evisum_ui_process_view_proc_info_feedback_cb(void *data, Ecore_Thread *thread,
     }
 
     if ((view->pid_cpu_time) && (proc->cpu_time >= view->pid_cpu_time))
-        cpu_usage = (double) (proc->cpu_time - view->pid_cpu_time) / view->poll_delay;
+        cpu_usage = (double) (proc->cpu_time - view->pid_cpu_time) / elapsed;
 
     proc->cpu_usage = cpu_usage;
 #if defined(__linux__)
@@ -832,9 +835,9 @@ _evisum_ui_process_view_proc_info_feedback_cb(void *data, Ecore_Thread *thread,
     net_out_abs = proc->net_out;
 
     if ((view->pid_net_in) && (net_in_abs >= view->pid_net_in))
-        net_in = (net_in_abs - view->pid_net_in) / view->poll_delay;
+        net_in = (net_in_abs - view->pid_net_in) / elapsed;
     if ((view->pid_net_out) && (net_out_abs >= view->pid_net_out))
-        net_out = (net_out_abs - view->pid_net_out) / view->poll_delay;
+        net_out = (net_out_abs - view->pid_net_out) / elapsed;
 
     proc->net_in = net_in;
     proc->net_out = net_out;

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to