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.