From: Dan Winship Date: Sat, 26 Jul 2008 14:19:18 +0000 (+0000) Subject: Add this to schedule a callback in a GMainContext "right away", as opposed X-Git-Tag: LIBSOUP_2_23_6~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fb649a87fc9a6419535c05696567f37cd9d2e3cb;p=platform%2Fupstream%2Flibsoup.git Add this to schedule a callback in a GMainContext "right away", as opposed * libsoup/soup-misc.c (soup_add_completion): Add this to schedule a callback in a GMainContext "right away", as opposed to soup_add_idle(), which uses a lower priority and therefore may not end up calling the callback for a long time if the application is busy with I/O. #536676, Benjamin Otte. * libsoup/soup-dns.c (resolver_thread, async_cancel) (soup_dns_lookup_resolve_async): * libsoup/soup-message-io.c (soup_message_io_unpause): * libsoup/soup-session-sync.c (queue_message_thread): * libsoup/soup-session-async.c (do_idle_run_queue): * libsoup/soup-socket.c (async_cancel) (soup_socket_connect_async): * tests/test-utils.c (test_server_shutdown): Use soup_add_completion() rather than soup_add_idle(). * docs/reference/libsoup-2.4-sections.txt: add soup_add_completion svn path=/trunk/; revision=1147 --- diff --git a/ChangeLog b/ChangeLog index 881279d..6febbf1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,25 @@ 2008-07-26 Dan Winship + * libsoup/soup-misc.c (soup_add_completion): Add this to schedule + a callback in a GMainContext "right away", as opposed to + soup_add_idle(), which uses a lower priority and therefore may not + end up calling the callback for a long time if the application is + busy with I/O. #536676, Benjamin Otte. + + * libsoup/soup-dns.c (resolver_thread, async_cancel) + (soup_dns_lookup_resolve_async): + * libsoup/soup-message-io.c (soup_message_io_unpause): + * libsoup/soup-session-sync.c (queue_message_thread): + * libsoup/soup-session-async.c (do_idle_run_queue): + * libsoup/soup-socket.c (async_cancel) + (soup_socket_connect_async): + * tests/test-utils.c (test_server_shutdown): Use + soup_add_completion() rather than soup_add_idle(). + + * docs/reference/libsoup-2.4-sections.txt: add soup_add_completion + +2008-07-26 Dan Winship + * libsoup/soup-message-client-io.c (get_request_headers): don't add a Host header to the message if the caller already added one. #539803, Marc Maurer. diff --git a/docs/reference/libsoup-2.4-sections.txt b/docs/reference/libsoup-2.4-sections.txt index b9e8297..3d1f615 100644 --- a/docs/reference/libsoup-2.4-sections.txt +++ b/docs/reference/libsoup-2.4-sections.txt @@ -563,6 +563,7 @@ soup_header_free_param_list soup_str_case_equal soup_str_case_hash +soup_add_completion soup_add_idle soup_add_io_watch soup_add_timeout diff --git a/libsoup/soup-dns.c b/libsoup/soup-dns.c index 204c2f2..0736433 100644 --- a/libsoup/soup-dns.c +++ b/libsoup/soup-dns.c @@ -553,7 +553,7 @@ resolver_thread (gpointer user_data) lookup = async_lookups->data; async_lookups = g_slist_remove (async_lookups, lookup); - soup_add_idle (lookup->async_context, do_async_callback, lookup); + soup_add_completion (lookup->async_context, do_async_callback, lookup); } soup_dns_cache_entry_unref (entry); @@ -633,7 +633,7 @@ async_cancel (GCancellable *cancellable, gpointer user_data) if (g_slist_find (entry->async_lookups, lookup)) { entry->async_lookups = g_slist_remove (entry->async_lookups, lookup); - soup_add_idle (lookup->async_context, do_async_callback, lookup); + soup_add_completion (lookup->async_context, do_async_callback, lookup); } g_mutex_unlock (soup_dns_lock); @@ -680,7 +680,7 @@ soup_dns_lookup_resolve_async (SoupDNSLookup *lookup, FALSE, NULL); } } else - soup_add_idle (lookup->async_context, do_async_callback, lookup); + soup_add_completion (lookup->async_context, do_async_callback, lookup); g_mutex_unlock (soup_dns_lock); } diff --git a/libsoup/soup-message-io.c b/libsoup/soup-message-io.c index 74c7901..18cff91 100644 --- a/libsoup/soup-message-io.c +++ b/libsoup/soup-message-io.c @@ -973,7 +973,7 @@ soup_message_io_unpause (SoupMessage *msg) NULL); if (non_blocking) { if (!io->unpause_source) { - io->unpause_source = soup_add_idle ( + io->unpause_source = soup_add_completion ( async_context, io_unpause_internal, msg); } } else diff --git a/libsoup/soup-misc.c b/libsoup/soup-misc.c index 60cc07c..575dfaa 100644 --- a/libsoup/soup-misc.c +++ b/libsoup/soup-misc.c @@ -150,6 +150,10 @@ soup_add_io_watch (GMainContext *async_context, * Adds an idle event as with g_idle_add(), but using the given * @async_context. * + * If you want @function to run "right away", use + * soup_add_completion(), since that sets a higher priority on the + * #GSource than soup_add_idle() does. + * * Return value: a #GSource, which can be removed from @async_context * with g_source_destroy(). **/ @@ -165,6 +169,32 @@ soup_add_idle (GMainContext *async_context, } /** + * soup_add_completion: + * @async_context: the #GMainContext to dispatch the idle event in, or + * %NULL for the default context + * @function: the callback to invoke + * @data: user data to pass to @function + * + * Adds @function to be executed from inside @async_context with the + * default priority. Use this when you want to complete an action in + * @async_context's main loop, as soon as possible. + * + * Return value: a #GSource, which can be removed from @async_context + * with g_source_destroy(). + **/ +GSource * +soup_add_completion (GMainContext *async_context, + GSourceFunc function, gpointer data) +{ + GSource *source = g_idle_source_new (); + g_source_set_priority (source, G_PRIORITY_DEFAULT); + g_source_set_callback (source, function, data, NULL); + g_source_attach (source, async_context); + g_source_unref (source); + return source; +} + +/** * soup_add_timeout: * @async_context: the #GMainContext to dispatch the timeout in, or * %NULL for the default context diff --git a/libsoup/soup-misc.h b/libsoup/soup-misc.h index b869054..37d71f4 100644 --- a/libsoup/soup-misc.h +++ b/libsoup/soup-misc.h @@ -19,6 +19,9 @@ GSource *soup_add_io_watch (GMainContext *async_context, GSource *soup_add_idle (GMainContext *async_context, GSourceFunc function, gpointer data); +GSource *soup_add_completion (GMainContext *async_context, + GSourceFunc function, + gpointer data); GSource *soup_add_timeout (GMainContext *async_context, guint interval, GSourceFunc function, diff --git a/libsoup/soup-session-async.c b/libsoup/soup-session-async.c index 060b4cf..6ec97fb 100644 --- a/libsoup/soup-session-async.c +++ b/libsoup/soup-session-async.c @@ -233,8 +233,8 @@ idle_run_queue (gpointer user_data) static void do_idle_run_queue (SoupSession *session) { - soup_add_idle (soup_session_get_async_context (session), - idle_run_queue, g_object_ref (session)); + soup_add_completion (soup_session_get_async_context (session), + idle_run_queue, g_object_ref (session)); } static void diff --git a/libsoup/soup-session-sync.c b/libsoup/soup-session-sync.c index 9fd8b3c..44e7237 100644 --- a/libsoup/soup-session-sync.c +++ b/libsoup/soup-session-sync.c @@ -157,8 +157,8 @@ queue_message_thread (gpointer data) soup_session_send_message (sad->session, sad->msg); if (sad->callback) { - soup_add_idle (soup_session_get_async_context (sad->session), - queue_message_callback, sad); + soup_add_completion (soup_session_get_async_context (sad->session), + queue_message_callback, sad); } else async_data_free (sad); diff --git a/libsoup/soup-socket.c b/libsoup/soup-socket.c index 4bc2d28..c8cc5d1 100644 --- a/libsoup/soup-socket.c +++ b/libsoup/soup-socket.c @@ -562,8 +562,8 @@ async_cancel (GCancellable *cancellable, gpointer user_data) if (priv->watch_src) g_source_destroy (priv->watch_src); disconnect_internal (priv); - priv->watch_src = soup_add_idle (priv->async_context, - idle_connect_result, sacd); + priv->watch_src = soup_add_completion (priv->async_context, + idle_connect_result, sacd); } static guint @@ -661,8 +661,8 @@ soup_socket_connect_async (SoupSocket *sock, GCancellable *cancellable, sacd); } } else { - priv->watch_src = soup_add_idle (priv->async_context, - idle_connect_result, sacd); + priv->watch_src = soup_add_completion (priv->async_context, + idle_connect_result, sacd); } } diff --git a/tests/test-utils.c b/tests/test-utils.c index 2e501e5..f0f2860 100644 --- a/tests/test-utils.c +++ b/tests/test-utils.c @@ -272,8 +272,8 @@ static void test_server_shutdown (void) { if (server_thread) { - soup_add_idle (soup_server_get_async_context (test_server), - idle_quit_server, test_server); + soup_add_completion (soup_server_get_async_context (test_server), + idle_quit_server, test_server); g_thread_join (server_thread); } else soup_server_quit (test_server);