From 7df98880b4273308b043d632682cc2daa55319ea Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Tue, 31 Jan 2023 12:16:16 +0100 Subject: Do not wait for the next loop iteration to unqueue async items This way we release the connection earlier, since other requests might be waiting for the connection. We can also remove manual loop iterations in the tests after a request is done. --- libsoup/soup-session.c | 17 ++++++----------- tests/cache-test.c | 7 ------- tests/connection-test.c | 4 ---- tests/http2-test.c | 48 ++++++++---------------------------------------- tests/misc-test.c | 22 ---------------------- tests/multipart-test.c | 2 -- tests/multithread-test.c | 3 --- tests/test-utils.c | 10 ---------- 8 files changed, 14 insertions(+), 99 deletions(-) diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c index cbc00b9d..4d4c8654 100644 --- a/libsoup/soup-session.c +++ b/libsoup/soup-session.c @@ -1471,9 +1471,7 @@ message_completed (SoupMessage *msg, SoupMessageIOCompletion completion, gpointe if (item->state != SOUP_MESSAGE_RESTARTING) { item->state = SOUP_MESSAGE_FINISHING; - - if (!item->async) - soup_session_process_queue_item (item->session, item, TRUE); + soup_session_process_queue_item (item->session, item, !item->async); } } @@ -3643,8 +3641,6 @@ soup_session_get_supported_websocket_extensions_for_message (SoupSession *sessio return soup_websocket_extension_manager_get_supported_extensions (SOUP_WEBSOCKET_EXTENSION_MANAGER (extension_manager)); } -static void websocket_connect_async_stop (SoupMessage *msg, gpointer user_data); - static void websocket_connect_async_complete (SoupMessage *msg, gpointer user_data) { @@ -3677,11 +3673,10 @@ websocket_connect_async_stop (SoupMessage *msg, gpointer user_data) GList *accepted_extensions = NULL; GError *error = NULL; - g_signal_handlers_disconnect_matched (msg, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, task); - supported_extensions = soup_session_get_supported_websocket_extensions_for_message (session, msg); if (soup_websocket_client_verify_handshake (item->msg, supported_extensions, &accepted_extensions, &error)) { + g_signal_handlers_disconnect_matched (msg, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, task); stream = soup_session_steal_connection (item->session, item->msg); client = soup_websocket_connection_new (stream, soup_message_get_uri (item->msg), @@ -3696,9 +3691,9 @@ websocket_connect_async_stop (SoupMessage *msg, gpointer user_data) return; } - soup_message_io_finished (item->msg); - g_task_return_error (task, error); - g_object_unref (task); + g_assert (!item->error); + item->error = error; + soup_message_io_finished (item->msg); } /** diff --git a/tests/cache-test.c b/tests/cache-test.c index e842005f..b58bb1d6 100644 --- a/tests/cache-test.c +++ b/tests/cache-test.c @@ -597,9 +597,6 @@ do_refcounting_test (gconstpointer data) g_object_unref (cache); g_free (cache_dir); - - while (g_main_context_pending (NULL)) - g_main_context_iteration (NULL, FALSE); soup_test_session_abort_unref (session); } @@ -942,10 +939,6 @@ task_async_function (GTask *task, g_object_unref (msg); - /* Continue iterating to ensure the item is unqueued and the connection released */ - while (g_main_context_pending (context)) - g_main_context_iteration (context, TRUE); - /* Cache writes are G_PRIORITY_LOW, so they won't have happened yet */ soup_cache_flush ((SoupCache *)soup_session_get_feature (request->session, SOUP_TYPE_CACHE)); diff --git a/tests/connection-test.c b/tests/connection-test.c index 18b75f31..307a695f 100644 --- a/tests/connection-test.c +++ b/tests/connection-test.c @@ -1690,10 +1690,6 @@ do_connection_http_1_1_required_test (void) g_assert_nonnull (body); g_bytes_unref (body); g_object_unref (msg); - - while (g_main_context_pending (NULL)) - g_main_context_iteration (NULL, FALSE); - soup_test_session_abort_unref (session); } diff --git a/tests/http2-test.c b/tests/http2-test.c index 19cee8e1..57f85594 100644 --- a/tests/http2-test.c +++ b/tests/http2-test.c @@ -194,9 +194,6 @@ do_multi_message_async_test (Test *test, gconstpointer data) g_assert_cmpstr (g_bytes_get_data (response1, NULL), ==, "body%201"); g_assert_cmpstr (g_bytes_get_data (response2, NULL), ==, "body%202"); - while (g_main_context_pending (async_context)) - g_main_context_iteration (async_context, FALSE); - g_bytes_unref (response1); g_bytes_unref (response2); g_object_unref (msg1); @@ -316,9 +313,6 @@ do_one_cancel_after_send_request_test (SoupSession *session, g_bytes_unref (body); } - while (g_main_context_pending (NULL)) - g_main_context_iteration (NULL, FALSE); - g_object_unref (cancellable); g_object_unref (ostream); g_object_unref (istream); @@ -414,9 +408,6 @@ do_post_async_test (Test *test, gconstpointer data) g_assert_cmpstr (g_bytes_get_data (response, NULL), ==, "body 1"); - while (g_main_context_pending (async_context)) - g_main_context_iteration (async_context, FALSE); - g_bytes_unref (response); g_bytes_unref (bytes); g_main_context_unref (async_context); @@ -451,9 +442,6 @@ do_post_large_async_test (Test *test, gconstpointer data) g_assert_true (g_bytes_equal (bytes, response)); - while (g_main_context_pending (async_context)) - g_main_context_iteration (async_context, FALSE); - g_bytes_unref (response); g_bytes_unref (bytes); g_main_context_unref (async_context); @@ -489,9 +477,6 @@ do_post_blocked_async_test (Test *test, gconstpointer data) g_assert_cmpstr (g_bytes_get_data (response, NULL), ==, "Part 1 - Part 2"); - while (g_main_context_pending (async_context)) - g_main_context_iteration (async_context, FALSE); - g_bytes_unref (response); g_object_unref (in_stream); g_main_context_unref (async_context); @@ -522,9 +507,6 @@ do_post_file_async_test (Test *test, gconstpointer data) g_assert_true (g_str_has_prefix (g_bytes_get_data (response, NULL), "-----BEGIN CERTIFICATE-----")); - while (g_main_context_pending (async_context)) - g_main_context_iteration (async_context, FALSE); - g_bytes_unref (response); g_object_unref (in_stream); g_object_unref (in_file); @@ -584,25 +566,23 @@ on_send_ready (GObject *source, GAsyncResult *res, gpointer user_data) GInputStream *stream; stream = soup_session_send_finish (sess, res, &error); - g_assert_no_error (error); g_assert_nonnull (stream); - GBytes *result = read_stream_to_bytes_sync (stream); - g_object_unref (stream); - g_assert_nonnull (result); - g_assert_cmpstr (g_bytes_get_data (result, NULL), ==, "Hello world"); - g_bytes_unref (result); - g_assert_nonnull (msg); g_assert_cmpuint (soup_message_get_http_version (msg), ==, SOUP_HTTP_2_0); conn = soup_message_get_connection (msg); - if (last_connection) - g_assert (last_connection == conn); + g_assert_true (last_connection == conn); else last_connection = conn; - + + GBytes *result = read_stream_to_bytes_sync (stream); + g_object_unref (stream); + g_assert_nonnull (result); + g_assert_cmpstr (g_bytes_get_data (result, NULL), ==, "Hello world"); + g_bytes_unref (result); + g_test_message ("Conn (%u) = %p", *complete_count, conn); *complete_count += 1; @@ -635,9 +615,6 @@ do_connections_test (Test *test, gconstpointer data) g_main_context_iteration (async_context, TRUE); } - while (g_main_context_pending (async_context)) - g_main_context_iteration (async_context, FALSE); - /* After no messages reference the connection it should be IDLE and reusable */ g_assert_cmpuint (soup_connection_get_state (last_connection), ==, SOUP_CONNECTION_IDLE); SoupMessage *msg = soup_message_new_from_uri (SOUP_METHOD_GET, uri); @@ -647,9 +624,6 @@ do_connections_test (Test *test, gconstpointer data) while (complete_count != N_TESTS + 1) g_main_context_iteration (async_context, TRUE); - while (g_main_context_pending (async_context)) - g_main_context_iteration (async_context, FALSE); - g_uri_unref (uri); g_main_context_unref (async_context); } @@ -1124,9 +1098,6 @@ do_sniffer_async_test (Test *test, gconstpointer data) do_one_sniffer_test (test->session, "/large", (LARGE_N_CHARS * LARGE_CHARS_REPEAT) + 1, should_content_sniff, async_context); do_one_sniffer_test (test->session, "/no-content", 0, should_content_sniff, async_context); - while (g_main_context_pending (async_context)) - g_main_context_iteration (async_context, FALSE); - g_main_context_unref (async_context); } @@ -1160,9 +1131,6 @@ do_timeout_test (Test *test, gconstpointer data) g_assert_error (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT); g_object_unref (msg); g_uri_unref (uri); - - while (g_main_context_pending (NULL)) - g_main_context_iteration (NULL, FALSE); } static void diff --git a/tests/misc-test.c b/tests/misc-test.c index 85b37598..045161d8 100644 --- a/tests/misc-test.c +++ b/tests/misc-test.c @@ -378,9 +378,6 @@ do_msg_reuse_test (void) g_clear_error (&error); g_object_unref (stream); - while (g_main_context_pending (NULL)) - g_main_context_iteration (NULL, FALSE); - ensure_no_signal_handlers (msg, signal_ids, n_signal_ids); soup_test_session_abort_unref (session); @@ -454,7 +451,6 @@ do_early_abort_test (void) (GAsyncReadyCallback)ea_msg_completed_one, loop); g_object_unref (msg); - g_main_context_iteration (context, FALSE); soup_session_abort (session); while (g_main_context_pending (context)) @@ -474,10 +470,6 @@ do_early_abort_test (void) g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); g_clear_error (&error); g_object_unref (msg); - - while (g_main_context_pending (context)) - g_main_context_iteration (context, FALSE); - soup_test_session_abort_unref (session); g_test_bug ("668098"); @@ -495,10 +487,6 @@ do_early_abort_test (void) g_clear_error (&error); g_object_unref (cancellable); g_object_unref (msg); - - while (g_main_context_pending (context)) - g_main_context_iteration (context, FALSE); - soup_test_session_abort_unref (session); } @@ -698,9 +686,6 @@ do_one_cancel_after_send_request_test (SoupSession *session, g_bytes_unref (body); } - while (g_main_context_pending (NULL)) - g_main_context_iteration (NULL, FALSE); - g_object_unref (cancellable); g_object_unref (ostream); g_object_unref (istream); @@ -991,9 +976,6 @@ do_new_request_on_conflict_test (void) g_object_unref (msg); g_object_unref (data.cancellable); - while (g_main_context_pending (NULL)) - g_main_context_iteration (NULL, FALSE); - data.cancellable = g_cancellable_new (); data.connections[0] = data.connections[1] = 0; data.done = FALSE; @@ -1014,10 +996,6 @@ do_new_request_on_conflict_test (void) g_object_unref (msg); g_object_unref (data.cancellable); - - while (g_main_context_pending (NULL)) - g_main_context_iteration (NULL, FALSE); - g_uri_unref (uri); g_bytes_unref (data.body); soup_test_session_abort_unref (data.session); diff --git a/tests/multipart-test.c b/tests/multipart-test.c index ba61e199..8c80265e 100644 --- a/tests/multipart-test.c +++ b/tests/multipart-test.c @@ -452,8 +452,6 @@ test_multipart (gconstpointer data) soup_session_send_async (session, msg, 0, NULL, no_multipart_handling_cb, NULL); g_main_loop_run (loop); - while (g_main_context_pending (NULL)) - g_main_context_iteration (NULL, FALSE); content_type = soup_message_headers_get_content_type (soup_message_get_response_headers (msg), ¶ms); diff --git a/tests/multithread-test.c b/tests/multithread-test.c index c0378531..7ef67574 100644 --- a/tests/multithread-test.c +++ b/tests/multithread-test.c @@ -365,9 +365,6 @@ do_multithread_connections_test (Test *test, body = soup_test_session_async_send (test->session, msg, NULL, NULL); g_bytes_unref (body); - while (g_main_context_pending (NULL)) - g_main_context_iteration (NULL, FALSE); - g_assert_nonnull (conn); g_assert_cmpuint (soup_connection_get_state (conn), ==, SOUP_CONNECTION_IDLE); diff --git a/tests/test-utils.c b/tests/test-utils.c index 3f599c45..d29d1175 100644 --- a/tests/test-utils.c +++ b/tests/test-utils.c @@ -727,12 +727,8 @@ async_as_sync_callback (GObject *object, gpointer user_data) { AsyncAsSyncData *data = user_data; - GMainContext *context; data->result = g_object_ref (result); - context = g_main_loop_get_context (data->loop); - while (g_main_context_pending (context)) - g_main_context_iteration (context, FALSE); g_main_loop_quit (data->loop); } @@ -772,16 +768,10 @@ soup_test_request_send (SoupSession *session, stream = soup_session_send_finish (session, data.result, error); if (flags & SOUP_TEST_REQUEST_CANCEL_AFTER_SEND_FINISH) { - GMainContext *context; - if (flags & SOUP_TEST_REQUEST_CANCEL_BY_SESSION) soup_session_cancel_message (session, msg); else g_cancellable_cancel (cancellable); - - context = g_main_loop_get_context (data.loop); - while (g_main_context_pending (context)) - g_main_context_iteration (context, FALSE); } g_main_loop_unref (data.loop); -- cgit v1.2.1