[libsoup] SoupSessionAsync: destroy the I/O GSource when returning a result



commit 0c825d4a0b89c103ea798fe7fb816e3a0c48534e
Author: Dan Winship <danw gnome org>
Date:   Mon Sep 17 13:53:48 2012 -0400

    SoupSessionAsync: destroy the I/O GSource when returning a result
    
    When a soup_request_send_async() gets cancelled, we were leaving its
    GSource active, causing it to be triggered later, sometimes causing
    criticals. Fix that.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=683404

 libsoup/soup-message-queue.c |    4 ++++
 libsoup/soup-message-queue.h |    1 +
 libsoup/soup-session-async.c |   14 +++++++++-----
 3 files changed, 14 insertions(+), 5 deletions(-)
---
diff --git a/libsoup/soup-message-queue.c b/libsoup/soup-message-queue.c
index e464035..2a60446 100644
--- a/libsoup/soup-message-queue.c
+++ b/libsoup/soup-message-queue.c
@@ -187,6 +187,10 @@ soup_message_queue_item_unref (SoupMessageQueueItem *item)
 		soup_uri_free (item->proxy_uri);
 	if (item->result)
 		g_object_unref (item->result);
+	if (item->io_source) {
+		g_source_destroy (item->io_source);
+		g_source_unref (item->io_source);
+	}
 	soup_message_queue_item_set_connection (item, NULL);
 	g_slice_free (SoupMessageQueueItem, item);
 }
diff --git a/libsoup/soup-message-queue.h b/libsoup/soup-message-queue.h
index cd15381..0f948cc 100644
--- a/libsoup/soup-message-queue.h
+++ b/libsoup/soup-message-queue.h
@@ -41,6 +41,7 @@ struct _SoupMessageQueueItem {
 	SoupURI *proxy_uri;
 	SoupConnection *conn;
 	GSimpleAsyncResult *result;
+	GSource *io_source;
 
 	guint paused            : 1;
 	guint new_api           : 1;
diff --git a/libsoup/soup-session-async.c b/libsoup/soup-session-async.c
index ffc306a..398cc0f 100644
--- a/libsoup/soup-session-async.c
+++ b/libsoup/soup-session-async.c
@@ -478,6 +478,11 @@ send_request_return_result (SoupMessageQueueItem *item,
 	simple = item->result;
 	item->result = NULL;
 
+	if (item->io_source) {
+		g_source_destroy (item->io_source);
+		g_clear_pointer (&item->io_source, g_source_unref);
+	}
+
 	if (error)
 		g_simple_async_result_take_error (simple, error);
 	else if (SOUP_STATUS_IS_TRANSPORT_ERROR (item->msg->status_code)) {
@@ -614,6 +619,7 @@ read_ready_cb (SoupMessage *msg, gpointer user_data)
 {
 	SoupMessageQueueItem *item = user_data;
 
+	g_clear_pointer (&item->io_source, g_source_unref);
 	try_run_until_read (item);
 	return FALSE;
 }
@@ -623,7 +629,6 @@ try_run_until_read (SoupMessageQueueItem *item)
 {
 	GError *error = NULL;
 	GInputStream *stream = NULL;
-	GSource *source;
 
 	if (soup_message_io_run_until_read (item->msg, item->cancellable, &error))
 		stream = soup_message_io_get_response_istream (item->msg, &error);
@@ -653,10 +658,9 @@ try_run_until_read (SoupMessageQueueItem *item)
 	}
 
 	g_clear_error (&error);
-	source = soup_message_io_get_source (item->msg, item->cancellable,
-					     read_ready_cb, item);
-	g_source_attach (source, soup_session_get_async_context (item->session));
-	g_source_unref (source);
+	item->io_source = soup_message_io_get_source (item->msg, item->cancellable,
+						      read_ready_cb, item);
+	g_source_attach (item->io_source, soup_session_get_async_context (item->session));
 }
 
 static void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]