diff --git a/src/libsysprof-capture/sysprof-capture-writer.c b/src/libsysprof-capture/sysprof-capture-writer.c index 5d8a5fb7..15eba05f 100644 --- a/src/libsysprof-capture/sysprof-capture-writer.c +++ b/src/libsysprof-capture/sysprof-capture-writer.c @@ -133,6 +133,9 @@ struct _SysprofCaptureWriter gsize pos; gsize len; + /* GSource for periodic flush */ + GSource *periodic_flush; + /* counter id sequence */ gint next_counter_id; @@ -164,6 +167,8 @@ sysprof_capture_writer_finalize (SysprofCaptureWriter *self) { if (self != NULL) { + g_clear_pointer (&self->periodic_flush, g_source_destroy); + sysprof_capture_writer_flush (self); if (self->fd != -1) @@ -1469,3 +1474,39 @@ sysprof_capture_writer_add_file_fd (SysprofCaptureWriter *self, return TRUE; } + +static gboolean +sysprof_capture_writer_auto_flush_cb (SysprofCaptureWriter *self) +{ + g_assert (self != NULL); + + sysprof_capture_writer_flush (self); + + return G_SOURCE_CONTINUE; +} + +void +sysprof_capture_writer_set_flush_delay (SysprofCaptureWriter *self, + GMainContext *main_context, + guint timeout_seconds) +{ + GSource *source; + + g_return_if_fail (self != NULL); + + g_clear_pointer (&self->periodic_flush, g_source_destroy); + + if (timeout_seconds == 0) + return; + + source = g_timeout_source_new_seconds (timeout_seconds); + g_source_set_name (source, "[sysprof-capture-writer-flush]"); + g_source_set_priority (source, G_PRIORITY_LOW + 100); + g_source_set_callback (source, + (GSourceFunc) sysprof_capture_writer_auto_flush_cb, + self, NULL); + + self->periodic_flush = g_steal_pointer (&source); + + g_source_attach (self->periodic_flush, main_context); +} diff --git a/src/libsysprof-capture/sysprof-capture-writer.h b/src/libsysprof-capture/sysprof-capture-writer.h index 928b8497..8d9859a5 100644 --- a/src/libsysprof-capture/sysprof-capture-writer.h +++ b/src/libsysprof-capture/sysprof-capture-writer.h @@ -81,6 +81,10 @@ SYSPROF_AVAILABLE_IN_ALL void sysprof_capture_writer_stat (SysprofCaptureWriter *self, SysprofCaptureStat *stat); SYSPROF_AVAILABLE_IN_ALL +void sysprof_capture_writer_set_flush_delay (SysprofCaptureWriter *self, + GMainContext *main_context, + guint timeout_seconds); +SYSPROF_AVAILABLE_IN_ALL gboolean sysprof_capture_writer_add_file (SysprofCaptureWriter *self, gint64 time, gint cpu,