mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-08-01 15:03:39 +02:00
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:
20
glib/gmain.c
20
glib/gmain.c
@@ -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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user