From: Colin Walters Date: Fri, 8 Jul 2016 14:01:47 +0000 (-0400) Subject: fetcher: Hold a ref to main context for lifetime of thread X-Git-Tag: archive/raspbian/2022.1-3+rpi1~1^2~407^2^2~3 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=b4c15209e846aaf3bfdbf12eddea3dd1d9a46226;p=ostree.git fetcher: Hold a ref to main context for lifetime of thread I don't think this fixes the bug I was seeing, but it makes me more comfortable to know we have a strong ref to the main context across the thread lifetime, and we only unset the default right before we go away. If something in `thread_closure_unref()` used `g_main_context_get_thread_default()` for example it'd be wrong before. Closes: #383 Approved by: mbarnes --- diff --git a/src/libostree/ostree-fetcher.c b/src/libostree/ostree-fetcher.c index 313df6a8..2fb2168a 100644 --- a/src/libostree/ostree-fetcher.c +++ b/src/libostree/ostree-fetcher.c @@ -452,12 +452,13 @@ static gpointer ostree_fetcher_session_thread (gpointer data) { ThreadClosure *closure = data; + g_autoptr(GMainContext) mainctx = g_main_context_ref (closure->main_context); gint max_conns; /* This becomes the GMainContext that SoupSession schedules async * callbacks and emits signals from. Make it the thread-default * context for this thread before creating the session. */ - g_main_context_push_thread_default (closure->main_context); + g_main_context_push_thread_default (mainctx); closure->session = soup_session_async_new_with_options (SOUP_SESSION_USER_AGENT, "ostree ", SOUP_SESSION_SSL_USE_SYSTEM_CA_FILE, TRUE, @@ -481,10 +482,13 @@ ostree_fetcher_session_thread (gpointer data) g_main_loop_run (closure->main_loop); - g_main_context_pop_thread_default (closure->main_context); - thread_closure_unref (closure); + /* Do this last, since libsoup uses g_main_current_source() which + * relies on it. + */ + g_main_context_pop_thread_default (mainctx); + return NULL; }