[libsoup] SoupSessionAsync: destroy the I/O GSource when returning a result
- From: Dan Winship <danw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsoup] SoupSessionAsync: destroy the I/O GSource when returning a result
- Date: Mon, 17 Sep 2012 17:56:09 +0000 (UTC)
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]