Add this to schedule a callback in a GMainContext "right away", as opposed
authorDan Winship <danw@src.gnome.org>
Sat, 26 Jul 2008 14:19:18 +0000 (14:19 +0000)
committerDan Winship <danw@src.gnome.org>
Sat, 26 Jul 2008 14:19:18 +0000 (14:19 +0000)
* 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

ChangeLog
docs/reference/libsoup-2.4-sections.txt
libsoup/soup-dns.c
libsoup/soup-message-io.c
libsoup/soup-misc.c
libsoup/soup-misc.h
libsoup/soup-session-async.c
libsoup/soup-session-sync.c
libsoup/soup-socket.c
tests/test-utils.c

index 881279d..6febbf1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,25 @@
 2008-07-26  Dan Winship  <danw@gnome.org>
 
+       * 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  <danw@gnome.org>
+
        * 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.
index b9e8297..3d1f615 100644 (file)
@@ -563,6 +563,7 @@ soup_header_free_param_list
 soup_str_case_equal
 soup_str_case_hash
 <SUBSECTION>
+soup_add_completion
 soup_add_idle
 soup_add_io_watch
 soup_add_timeout
index 204c2f2..0736433 100644 (file)
@@ -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);
 }
index 74c7901..18cff91 100644 (file)
@@ -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
index 60cc07c..575dfaa 100644 (file)
@@ -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
index b869054..37d71f4 100644 (file)
@@ -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,
index 060b4cf..6ec97fb 100644 (file)
@@ -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
index 9fd8b3c..44e7237 100644 (file)
@@ -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);
 
index 4bc2d28..c8cc5d1 100644 (file)
@@ -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);
        }
 }
 
index 2e501e5..f0f2860 100644 (file)
@@ -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);