From c1561b1dedfbf98b2efb842ee66165421ab1422b Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Wed, 13 Jan 2021 19:32:58 +0000 Subject: [PATCH] =?UTF-8?q?flatpak-utils-http:=20Don=E2=80=99t=20use=20GMa?= =?UTF-8?q?inLoop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Iterate the `GMainContext` manually instead. This makes the exit condition from the loop much more obvious, and eliminates the potential class of problems where `g_main_loop_quit()` is called before `g_main_loop_run()` and has no effect. Signed-off-by: Philip Withnall --- common/flatpak-utils-http.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/common/flatpak-utils-http.c b/common/flatpak-utils-http.c index 959f531e..ffe1b476 100644 --- a/common/flatpak-utils-http.c +++ b/common/flatpak-utils-http.c @@ -43,7 +43,8 @@ typedef struct typedef struct { - GMainLoop *loop; + GMainContext *context; + gboolean done; GError *error; gboolean store_compressed; @@ -350,7 +351,8 @@ stream_closed (GObject *source, GAsyncResult *res, gpointer user_data) g_clear_pointer (&data->out, g_object_unref); } - g_main_loop_quit (data->loop); + data->done = TRUE; + g_main_context_wakeup (data->context); } static void @@ -418,7 +420,8 @@ load_uri_callback (GObject *source_object, in = soup_request_send_finish (SOUP_REQUEST (request), res, &data->error); if (in == NULL) { - g_main_loop_quit (data->loop); + /* data->error has been set */ + g_main_context_wakeup (data->context); return; } @@ -483,7 +486,7 @@ load_uri_callback (GObject *source_object, "Server returned status %u: %s", msg->status_code, soup_status_get_phrase (msg->status_code)); - g_main_loop_quit (data->loop); + g_main_context_wakeup (data->context); return; } @@ -601,7 +604,6 @@ flatpak_load_http_uri_once (SoupSession *soup_session, GBytes *bytes = NULL; g_autoptr(GMainContext) context = NULL; g_autoptr(SoupRequestHTTP) request = NULL; - g_autoptr(GMainLoop) loop = NULL; g_autoptr(GString) content = g_string_new (""); LoadUriData data = { NULL }; SoupMessage *m; @@ -610,8 +612,7 @@ flatpak_load_http_uri_once (SoupSession *soup_session, context = g_main_context_ref_thread_default (); - loop = g_main_loop_new (context, TRUE); - data.loop = loop; + data.context = context; data.content = content; data.progress = progress; data.cancellable = cancellable; @@ -641,7 +642,8 @@ flatpak_load_http_uri_once (SoupSession *soup_session, cancellable, load_uri_callback, &data); - g_main_loop_run (loop); + while (data.error == NULL && !data.done) + g_main_context_iteration (data.context, TRUE); if (data.error) { @@ -721,7 +723,6 @@ flatpak_download_http_uri_once (SoupSession *soup_session, GError **error) { g_autoptr(SoupRequestHTTP) request = NULL; - g_autoptr(GMainLoop) loop = NULL; g_autoptr(GMainContext) context = NULL; LoadUriData data = { NULL }; SoupMessage *m; @@ -730,8 +731,7 @@ flatpak_download_http_uri_once (SoupSession *soup_session, context = g_main_context_ref_thread_default (); - loop = g_main_loop_new (context, TRUE); - data.loop = loop; + data.context = context; data.out = out; data.progress = progress; data.cancellable = cancellable; @@ -758,7 +758,8 @@ flatpak_download_http_uri_once (SoupSession *soup_session, cancellable, load_uri_callback, &data); - g_main_loop_run (loop); + while (data.error == NULL && !data.done) + g_main_context_iteration (data.context, TRUE); if (out_bytes_written) *out_bytes_written = data.downloaded_bytes; @@ -866,7 +867,6 @@ flatpak_cache_http_uri_once (SoupSession *soup_session, GError **error) { g_autoptr(SoupRequestHTTP) request = NULL; - g_autoptr(GMainLoop) loop = NULL; g_autoptr(GMainContext) context = NULL; g_autoptr(CacheHttpData) cache_data = NULL; g_autofree char *parent_path = g_path_get_dirname (dest_subpath); @@ -914,8 +914,7 @@ flatpak_cache_http_uri_once (SoupSession *soup_session, context = g_main_context_ref_thread_default (); - loop = g_main_loop_new (context, TRUE); - data.loop = loop; + data.context = context; data.cache_data = cache_data; data.out_tmpfile = &out_tmpfile; data.out_tmpfile_parent_dfd = dfd; @@ -956,7 +955,8 @@ flatpak_cache_http_uri_once (SoupSession *soup_session, cancellable, load_uri_callback, &data); - g_main_loop_run (loop); + while (data.error == NULL && !data.done) + g_main_context_iteration (data.context, TRUE); if (data.error) {