gmetrics: Run metrics timeouts on dedicated thread

Some of the timeout handlers can take seconds to complete, so
run them from their own thread instead of the main thread.
This commit is contained in:
Ray Strode
2022-05-16 13:59:44 -04:00
parent 15bd34f4d3
commit 2249e961fb

View File

@@ -447,6 +447,7 @@ static gboolean g_idle_dispatch (GSource *source,
static void block_source (GSource *source);
static GMainContext *glib_worker_context;
static GMainContext *glib_metrics_context;
G_LOCK_DEFINE_STATIC (main_loop);
static GMainContext *default_main_context;
@@ -925,6 +926,15 @@ on_timeout_fd_ready (void)
return G_SOURCE_CONTINUE;
}
static gpointer
glib_metrics_main (gpointer data)
{
while (TRUE)
g_main_context_iteration (glib_metrics_context, TRUE);
return NULL;
}
/**
* g_main_context_new:
*
@@ -1059,7 +1069,15 @@ g_main_context_new (void)
if (metrics_timeout_source != NULL)
{
g_source_attach (metrics_timeout_source, context);
sigset_t prev_mask;
sigset_t all;
sigfillset (&all);
pthread_sigmask (SIG_SETMASK, &all, &prev_mask);
glib_metrics_context = g_main_context_new ();
g_thread_new ("gmetrics", glib_metrics_main, NULL);
pthread_sigmask (SIG_SETMASK, &prev_mask, NULL);
g_source_attach (metrics_timeout_source, glib_metrics_context);
g_source_unref (metrics_timeout_source);
}