mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-22 10:12:10 +01: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:
parent
e10fe825b4
commit
24506bed1f
20
glib/gmain.c
20
glib/gmain.c
@ -494,6 +494,7 @@ static gboolean g_idle_dispatch (GSource *source,
|
||||
static void block_source (GSource *source);
|
||||
|
||||
static GMainContext *glib_worker_context;
|
||||
static GMainContext *glib_metrics_context;
|
||||
|
||||
#ifndef G_OS_WIN32
|
||||
|
||||
@ -1019,6 +1020,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:
|
||||
*
|
||||
@ -1171,7 +1181,15 @@ g_main_context_new_with_flags (GMainContextFlags flags)
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user