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.