From: Michael Tremer Date: Wed, 22 Oct 2025 10:37:37 +0000 (+0000) Subject: daemon: Release memory when the system is under pressure X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c88f973e0a13121f7ddfb4c6021de593a7d8dc44;p=telemetry.git daemon: Release memory when the system is under pressure Signed-off-by: Michael Tremer --- diff --git a/src/daemon/daemon.c b/src/daemon/daemon.c index fab73f1..3ea05f3 100644 --- a/src/daemon/daemon.c +++ b/src/daemon/daemon.c @@ -53,6 +53,7 @@ struct td_daemon { sd_event_source* sigchld; sd_event_source* init; sd_event_source* exit; + sd_event_source* memory_pressure; } events; // Bus @@ -132,6 +133,25 @@ static int td_daemon_SIGCHLD(sd_event_source* source, return 0; } +static int td_daemon_release_memory(sd_event_source* source, void* data) { + td_daemon* self = data; + int r; + + DEBUG(self->ctx, "Releasing memory...\n"); + + // Flush the queue to disk to free up memory + if (self->queue) { + r = td_queue_flush(self->queue); + if (r < 0) { + ERROR(self->ctx, "Failed to flush queue to release memory: %s\n", strerror(-r)); + return r; + } + } + + // Call the default operation + return sd_event_trim_memory(); +} + static int td_daemon_setup_loop(td_daemon* self) { int r; @@ -195,6 +215,14 @@ static int td_daemon_setup_loop(td_daemon* self) { return r; } + // Release memory when asked to + r = sd_event_add_memory_pressure(self->loop, &self->events.memory_pressure, + td_daemon_release_memory, daemon); + if (r < 0) { + ERROR(self->ctx, "Failed to register memory pressure callback: %s\n", strerror(-r)); + return r; + } + return 0; } @@ -213,6 +241,8 @@ static int td_daemon_setup_udev(td_daemon* self) { } static void td_daemon_free(td_daemon* self) { + if (self->events.memory_pressure) + sd_event_source_unref(self->events.memory_pressure); if (self->events.sigchld) sd_event_source_unref(self->events.sigchld); if (self->events.sigterm)