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.
soup_str_case_equal
soup_str_case_hash
<SUBSECTION>
+soup_add_completion
soup_add_idle
soup_add_io_watch
soup_add_timeout
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);
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);
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);
}
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
* 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().
**/
}
/**
+ * 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
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,
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
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);
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
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);
}
}
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);