[sysprof] libsysprof-capture: add flush_delay for auto flushing



commit 97ec24ab42e5ad16dde2d25418b93f0e68b62929
Author: Christian Hergert <chergert redhat com>
Date:   Wed Jun 5 15:12:17 2019 -0700

    libsysprof-capture: add flush_delay for auto flushing
    
    This can be useful in scenarios where you need to kill the application
    using a signal so that data is not lost in the buffer.

 src/libsysprof-capture/sysprof-capture-writer.c | 41 +++++++++++++++++++++++++
 src/libsysprof-capture/sysprof-capture-writer.h |  4 +++
 2 files changed, 45 insertions(+)
---
diff --git a/src/libsysprof-capture/sysprof-capture-writer.c b/src/libsysprof-capture/sysprof-capture-writer.c
index 5d8a5fb..15eba05 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 928b849..8d9859a 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,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]