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 51e67dd716297ce10cadaac3c2cf5b141777bfaf
Author: Alastair Poole <[email protected]>
AuthorDate: Fri May 29 11:44:50 2026 +0100

    network: track network totals and rates.
---
 src/bin/enigmatic/Events.h                     |  78 ++++++++---------
 src/bin/enigmatic/client/enigmatic_client.c    |   8 ++
 src/bin/enigmatic/enigmatic_config.h           |   2 +-
 src/bin/enigmatic/enigmatic_main.c             |   1 +
 src/bin/enigmatic/monitor/network_interfaces.c | 111 ++++++++++++++++++++++++-
 src/bin/enigmatic/monitor/network_interfaces.h |   3 +
 src/bin/ui/evisum_ui_network.c                 |  69 ++++-----------
 7 files changed, 179 insertions(+), 93 deletions(-)

diff --git a/src/bin/enigmatic/Events.h b/src/bin/enigmatic/Events.h
index 5fdb869..dfca5e1 100644
--- a/src/bin/enigmatic/Events.h
+++ b/src/bin/enigmatic/Events.h
@@ -42,44 +42,46 @@ typedef enum
    NETWORK                = 23,
    NETWORK_INCOMING       = 24,
    NETWORK_OUTGOING       = 25,
-   FILE_SYSTEM            = 26,
-   FILE_SYSTEM_TOTAL      = 27,
-   FILE_SYSTEM_USED       = 28,
-   FILE_SYSTEM_READ       = 29,
-   FILE_SYSTEM_WRITE      = 30,
-   PROCESS                = 31,
-   PROCESS_PPID           = 32,
-   PROCESS_UID            = 33,
-   PROCESS_NICE           = 34,
-   PROCESS_PRIORITY       = 35,
-   PROCESS_CPU_ID         = 36,
-   PROCESS_NUM_THREAD     = 37,
-   PROCESS_CPU_TIME       = 38,
-   PROCESS_RUN_TIME       = 39,
-   PROCESS_START          = 40,
-   PROCESS_MEM_SIZE       = 41,
-   PROCESS_MEM_RSS        = 42,
-   PROCESS_MEM_SHARED     = 43,
-   PROCESS_MEM_VIRT       = 44,
-   PROCESS_NET_IN         = 45,
-   PROCESS_NET_OUT        = 46,
-   PROCESS_DISK_READ      = 47,
-   PROCESS_DISK_WRITE     = 48,
-   PROCESS_COMMAND        = 49,
-   PROCESS_ARGUMENTS      = 50,
-   PROCESS_STATE          = 51,
-   PROCESS_WCHAN          = 52,
-   PROCESS_NUM_FILES      = 53,
-   PROCESS_WAS_ZERO       = 54,
-   PROCESS_IS_KERNEL      = 55,
-   PROCESS_IS_NEW         = 56,
-   PROCESS_TID            = 57,
-   PROCESS_THREAD_NAME    = 58,
-   PROCESS_FDS_COUNT      = 59,
-   PROCESS_THREADS_COUNT  = 60,
-   PROCESS_CHILDREN_COUNT = 61,
-   PROCESS_PATH           = 62,
-   PROCESS_CPU_USAGE      = 63,
+   NETWORK_INCOMING_RATE  = 26,
+   NETWORK_OUTGOING_RATE  = 27,
+   FILE_SYSTEM            = 28,
+   FILE_SYSTEM_TOTAL      = 29,
+   FILE_SYSTEM_USED       = 30,
+   FILE_SYSTEM_READ       = 31,
+   FILE_SYSTEM_WRITE      = 32,
+   PROCESS                = 33,
+   PROCESS_PPID           = 34,
+   PROCESS_UID            = 35,
+   PROCESS_NICE           = 36,
+   PROCESS_PRIORITY       = 37,
+   PROCESS_CPU_ID         = 38,
+   PROCESS_NUM_THREAD     = 39,
+   PROCESS_CPU_TIME       = 40,
+   PROCESS_RUN_TIME       = 41,
+   PROCESS_START          = 42,
+   PROCESS_MEM_SIZE       = 43,
+   PROCESS_MEM_RSS        = 44,
+   PROCESS_MEM_SHARED     = 45,
+   PROCESS_MEM_VIRT       = 46,
+   PROCESS_NET_IN         = 47,
+   PROCESS_NET_OUT        = 48,
+   PROCESS_DISK_READ      = 49,
+   PROCESS_DISK_WRITE     = 50,
+   PROCESS_COMMAND        = 51,
+   PROCESS_ARGUMENTS      = 52,
+   PROCESS_STATE          = 53,
+   PROCESS_WCHAN          = 54,
+   PROCESS_NUM_FILES      = 55,
+   PROCESS_WAS_ZERO       = 56,
+   PROCESS_IS_KERNEL      = 57,
+   PROCESS_IS_NEW         = 58,
+   PROCESS_TID            = 59,
+   PROCESS_THREAD_NAME    = 60,
+   PROCESS_FDS_COUNT      = 61,
+   PROCESS_THREADS_COUNT  = 62,
+   PROCESS_CHILDREN_COUNT = 63,
+   PROCESS_PATH           = 64,
+   PROCESS_CPU_USAGE      = 65,
 } Object_Type;
 
 typedef enum
diff --git a/src/bin/enigmatic/client/enigmatic_client.c b/src/bin/enigmatic/client/enigmatic_client.c
index 55ff55d..bbf20b0 100644
--- a/src/bin/enigmatic/client/enigmatic_client.c
+++ b/src/bin/enigmatic/client/enigmatic_client.c
@@ -557,6 +557,8 @@ message_network(Enigmatic_Client *client)
                             {
                                iface2->total_in = iface->total_in;
                                iface2->total_out = iface->total_out;
+                               iface2->in = iface->in;
+                               iface2->out = iface->out;
                             }
                        }
                      free(iface);
@@ -594,6 +596,10 @@ message_network(Enigmatic_Client *client)
                        iface->total_in += change;
                      else if (msg->object_type == NETWORK_OUTGOING)
                        iface->total_out += change;
+                     else if (msg->object_type == NETWORK_INCOMING_RATE)
+                       iface->in += change;
+                     else if (msg->object_type == NETWORK_OUTGOING_RATE)
+                       iface->out += change;
                   }
              }
            break;
@@ -1152,6 +1158,8 @@ message_mod(Enigmatic_Client *client)
            break;
         case NETWORK_INCOMING:
         case NETWORK_OUTGOING:
+        case NETWORK_INCOMING_RATE:
+        case NETWORK_OUTGOING_RATE:
            message_network(client);
            break;
         case FILE_SYSTEM_TOTAL:
diff --git a/src/bin/enigmatic/enigmatic_config.h b/src/bin/enigmatic/enigmatic_config.h
index 8f18f6b..3883e2d 100644
--- a/src/bin/enigmatic/enigmatic_config.h
+++ b/src/bin/enigmatic/enigmatic_config.h
@@ -3,7 +3,7 @@
 #include "Events.h"
 
 #define ENIGMATIC_CONFIG_VERSION_MAJOR 0x0001
-#define ENIGMATIC_CONFIG_VERSION_MINOR 0x0006
+#define ENIGMATIC_CONFIG_VERSION_MINOR 0x0007
 
 #define ENIGMATIC_CONFIG_VERSION ((ENIGMATIC_CONFIG_VERSION_MAJOR << 16) | ENIGMATIC_CONFIG_VERSION_MINOR)
 
diff --git a/src/bin/enigmatic/enigmatic_main.c b/src/bin/enigmatic/enigmatic_main.c
index 14580f9..2ecb5b8 100644
--- a/src/bin/enigmatic/enigmatic_main.c
+++ b/src/bin/enigmatic/enigmatic_main.c
@@ -164,6 +164,7 @@ enigmatic_shutdown(Enigmatic *enigmatic)
    enigmatic_monitor_sensors_shutdown();
    enigmatic_monitor_power_shutdown();
    enigmatic_monitor_file_systems_shutdown();
+   enigmatic_monitor_network_interfaces_shutdown();
 
    enigmatic_server_shutdown(enigmatic);
 
diff --git a/src/bin/enigmatic/monitor/network_interfaces.c b/src/bin/enigmatic/monitor/network_interfaces.c
index 6ce87c8..e12b288 100644
--- a/src/bin/enigmatic/monitor/network_interfaces.c
+++ b/src/bin/enigmatic/monitor/network_interfaces.c
@@ -3,6 +3,89 @@
 #include "uid.h"
 #include "enigmatic_log.h"
 
+typedef struct
+{
+   uint64_t in;
+   uint64_t out;
+   uint32_t sample_time;
+} Network_Interface_Raw;
+
+static Eina_Hash *_network_interface_raw_cache;
+
+static Eina_Hash *
+_network_interface_raw_cache_get(void)
+{
+   if (!_network_interface_raw_cache)
+     _network_interface_raw_cache = eina_hash_string_superfast_new(free);
+
+   return _network_interface_raw_cache;
+}
+
+static int64_t
+_network_interface_elapsed_get(Enigmatic *enigmatic, Network_Interface_Raw *raw)
+{
+   int64_t elapsed = 0;
+
+   if ((raw) && (enigmatic->poll_time > raw->sample_time))
+     elapsed = enigmatic->poll_time - raw->sample_time;
+   if (elapsed <= 0)
+     elapsed = enigmatic->interval;
+   if (elapsed <= 0)
+     elapsed = 1;
+
+   return elapsed;
+}
+
+static void
+_network_interface_rates_update(Enigmatic *enigmatic, Network_Interface *iface)
+{
+   Eina_Hash *cache;
+   Network_Interface_Raw *raw;
+   uint64_t raw_in, raw_out;
+   int64_t elapsed;
+
+   raw_in = iface->total_in;
+   raw_out = iface->total_out;
+   iface->in = 0;
+   iface->out = 0;
+
+   cache = _network_interface_raw_cache_get();
+   if (!cache) return;
+
+   raw = eina_hash_find(cache, iface->name);
+   if (!raw)
+     {
+        raw = calloc(1, sizeof(Network_Interface_Raw));
+        if (!raw) return;
+
+        raw->in = raw_in;
+        raw->out = raw_out;
+        raw->sample_time = enigmatic->poll_time;
+        if (!eina_hash_add(cache, iface->name, raw))
+          free(raw);
+        return;
+     }
+
+   elapsed = _network_interface_elapsed_get(enigmatic, raw);
+   if (raw_in >= raw->in)
+     iface->in = (raw_in - raw->in) / elapsed;
+   if (raw_out >= raw->out)
+     iface->out = (raw_out - raw->out) / elapsed;
+
+   raw->in = raw_in;
+   raw->out = raw_out;
+   raw->sample_time = enigmatic->poll_time;
+}
+
+void
+enigmatic_monitor_network_interfaces_shutdown(void)
+{
+   if (!_network_interface_raw_cache) return;
+
+   eina_hash_free(_network_interface_raw_cache);
+   _network_interface_raw_cache = NULL;
+}
+
 static void
 cb_network_interface_free(void *data)
 {
@@ -72,6 +155,7 @@ enigmatic_monitor_network_interfaces(Enigmatic *enigmatic, Eina_Hash **cache_has
                {
                   DEBUG("iface add: %s", iface->name);
                   memcpy(iface2, iface, sizeof(Network_Interface));
+                  _network_interface_rates_update(enigmatic, iface2);
                   iface2->unique_id = unique_id_find(&enigmatic->unique_ids);
                   eina_hash_add(*cache_hash, iface->name, iface2);
                }
@@ -113,6 +197,8 @@ enigmatic_monitor_network_interfaces(Enigmatic *enigmatic, Eina_Hash **cache_has
         enigmatic_log_header(enigmatic, EVENT_MESSAGE, msg);
 
         unique_id_release(&enigmatic->unique_ids, iface->unique_id);
+        if (_network_interface_raw_cache)
+          eina_hash_del(_network_interface_raw_cache, iface->name, NULL);
         eina_hash_del(*cache_hash, iface->name, NULL);
      }
 
@@ -122,6 +208,7 @@ enigmatic_monitor_network_interfaces(Enigmatic *enigmatic, Eina_Hash **cache_has
         if (!iface2)
           {
              iface->unique_id = unique_id_find(&enigmatic->unique_ids);
+             _network_interface_rates_update(enigmatic, iface);
 
              Message msg;
              msg.type = MESG_ADD;
@@ -137,6 +224,8 @@ enigmatic_monitor_network_interfaces(Enigmatic *enigmatic, Eina_Hash **cache_has
         Message msg;
         msg.type = MESG_MOD;
 
+        _network_interface_rates_update(enigmatic, iface);
+
         if (iface2->total_in != iface->total_in)
           {
              msg.object_type = NETWORK_INCOMING;
@@ -156,11 +245,31 @@ enigmatic_monitor_network_interfaces(Enigmatic *enigmatic, Eina_Hash **cache_has
              DEBUG("%s out :%i", iface2->name, (int) iface->total_out - (int) iface2->total_out);
              changed = 1;
           }
+        if (iface2->in != iface->in)
+          {
+             msg.object_type = NETWORK_INCOMING_RATE;
+             msg.number = iface2->unique_id;
+             enigmatic_log_diff(enigmatic, msg, (int64_t) iface->in - (int64_t) iface2->in);
+
+             DEBUG("%s in rate :%i", iface2->name, (int) iface->in - (int) iface2->in);
+             changed = 1;
+          }
+
+        if (iface2->out != iface->out)
+          {
+             msg.object_type = NETWORK_OUTGOING_RATE;
+             msg.number = iface2->unique_id;
+             enigmatic_log_diff(enigmatic, msg, (int64_t) iface->out - (int64_t) iface2->out);
+
+             DEBUG("%s out rate :%i", iface2->name, (int) iface->out - (int) iface2->out);
+             changed = 1;
+          }
         iface2->total_in = iface->total_in;
         iface2->total_out = iface->total_out;
+        iface2->in = iface->in;
+        iface2->out = iface->out;
         free(iface);
      }
 
    return changed;
 }
-
diff --git a/src/bin/enigmatic/monitor/network_interfaces.h b/src/bin/enigmatic/monitor/network_interfaces.h
index 9954a45..6ee14a3 100644
--- a/src/bin/enigmatic/monitor/network_interfaces.h
+++ b/src/bin/enigmatic/monitor/network_interfaces.h
@@ -6,4 +6,7 @@
 Eina_Bool
 enigmatic_monitor_network_interfaces(Enigmatic *enigmatic, Eina_Hash **cache_hash);
 
+void
+enigmatic_monitor_network_interfaces_shutdown(void);
+
 #endif
diff --git a/src/bin/ui/evisum_ui_network.c b/src/bin/ui/evisum_ui_network.c
index 96f48c5..12f2de8 100644
--- a/src/bin/ui/evisum_ui_network.c
+++ b/src/bin/ui/evisum_ui_network.c
@@ -35,14 +35,10 @@ typedef struct {
 typedef struct {
     char name[255];
 
-    uint64_t total_in;
-    uint64_t total_out;
-
     uint64_t in;
     uint64_t out;
     uint64_t peak_in;
     uint64_t peak_out;
-    double last_sample_time;
 
     double history[NETWORK_GRAPH_SAMPLES];
     int history_count;
@@ -64,9 +60,8 @@ typedef struct {
 
 typedef struct {
     char name[255];
-    uint64_t total_in;
-    uint64_t total_out;
-    double sample_time;
+    uint64_t in;
+    uint64_t out;
 } Network_Update_Sample;
 
 static void _evisum_ui_network_graph_redraw(Evisum_Ui_Network_View *view, Eina_List *interfaces);
@@ -84,18 +79,6 @@ _evisum_ui_network_graph_objects_valid(Evisum_Ui_Network_View *view) {
            && evas_object_evas_get(view->graph_img);
 }
 
-static int
-_evisum_ui_network_poll_delay_get(Evisum_Ui *ui) {
-    int delay_secs = INTERVAL_NORMAL;
-
-    if (ui) delay_secs = ui->proc.poll_delay;
-    if (delay_secs < INTERVAL_NORMAL) delay_secs = INTERVAL_NORMAL;
-    else if (delay_secs > INTERVAL_SLOW)
-        delay_secs = INTERVAL_SLOW;
-
-    return delay_secs;
-}
-
 static void
 _evisum_ui_network_legend_toggle_state_apply(Network_View_Interface *iface) {
     if (!iface) return;
@@ -323,23 +306,21 @@ _evisum_ui_network_graph_bg_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Obje
 
 static void
 _evisum_ui_network_update(void *data, Ecore_Thread *thread) {
-    Evisum_Ui_Network_View *view = data;
     uint64_t seq = 0;
-    double last_sample_time = 0.0;
+    uint32_t last_snapshot_time = 0;
+
+    (void) data;
 
     ecore_thread_name_set(thread, "network");
 
     while (!ecore_thread_check(thread)) {
         Eina_List *samples = NULL;
-        double sample_time;
-        int delay_secs;
+        uint32_t snapshot_time;
 
         if (!evisum_background_update_wait(&seq)) continue;
 
-        sample_time = ecore_time_get();
-        delay_secs = _evisum_ui_network_poll_delay_get(view ? view->ui : NULL);
-        if ((last_sample_time > 0.0) && ((sample_time - last_sample_time) < ((double) delay_secs - 0.05)))
-            continue;
+        snapshot_time = evisum_engine_live_time_get();
+        if (!snapshot_time || (snapshot_time == last_snapshot_time)) continue;
 
         int n;
         Network_Interface *nwif, **ifaces = system_network_ifaces_get(&n);
@@ -352,9 +333,8 @@ _evisum_ui_network_update(void *data, Ecore_Thread *thread) {
             s = calloc(1, sizeof(*s));
             if (s) {
                 snprintf(s->name, sizeof(s->name), "%s", nwif->name);
-                s->total_in = nwif->total_in;
-                s->total_out = nwif->total_out;
-                s->sample_time = sample_time;
+                s->in = nwif->in;
+                s->out = nwif->out;
                 samples = eina_list_append(samples, s);
             }
 
@@ -362,8 +342,8 @@ _evisum_ui_network_update(void *data, Ecore_Thread *thread) {
 
         free(ifaces);
         if (samples) {
-            last_sample_time = sample_time;
-            ecore_thread_feedback(thread, samples);
+          last_snapshot_time = snapshot_time;
+          ecore_thread_feedback(thread, samples);
         }
     }
 }
@@ -396,32 +376,15 @@ _evisum_ui_network_update_feedback_cb(void *data, Ecore_Thread *thread EINA_UNUS
             iface->is_new = EINA_TRUE;
             iface->enabled = EINA_TRUE;
             snprintf(iface->name, sizeof(iface->name), "%s", s->name);
-            iface->total_in = s->total_in;
-            iface->total_out = s->total_out;
-            iface->last_sample_time = s->sample_time;
+            iface->in = s->in;
+            iface->out = s->out;
             view->interfaces = eina_list_append(view->interfaces, iface);
             graph_reset_needed = EINA_TRUE;
         } else {
-            double elapsed = s->sample_time - iface->last_sample_time;
-            uint64_t delta_in = (iface->total_in == 0 || s->total_in < iface->total_in)
-                                    ? 0
-                                    : (s->total_in - iface->total_in);
-            uint64_t delta_out = (iface->total_out == 0 || s->total_out < iface->total_out)
-                                     ? 0
-                                     : (s->total_out - iface->total_out);
-
-            if (elapsed > 0.0) {
-                iface->in = (uint64_t) ((double) delta_in / elapsed);
-                iface->out = (uint64_t) ((double) delta_out / elapsed);
-            } else {
-                iface->in = 0;
-                iface->out = 0;
-            }
+            iface->in = s->in;
+            iface->out = s->out;
             if (iface->in > iface->peak_in) iface->peak_in = iface->in;
             if (iface->out > iface->peak_out) iface->peak_out = iface->out;
-            iface->total_in = s->total_in;
-            iface->total_out = s->total_out;
-            iface->last_sample_time = s->sample_time;
         }
         iface->delete_me = EINA_FALSE;
     }

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

Reply via email to