]> git.ipfire.org Git - collecty.git/commitdiff
daemon: Release memory when the system is under pressure
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Oct 2025 10:37:37 +0000 (10:37 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 22 Oct 2025 10:37:37 +0000 (10:37 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/daemon/daemon.c

index fab73f19e887d7d7cd21aaa84e0d95d225948d3c..3ea05f33242dee578934bc85738c2e5de7af6a1e 100644 (file)
@@ -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)