sd_event_source* sigchld;
sd_event_source* init;
sd_event_source* exit;
+ sd_event_source* memory_pressure;
} events;
// Bus
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;
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;
}
}
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)