summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2022-10-14 10:11:02 +0200
committerCarlos Garcia Campos <cgarcia@igalia.com>2022-10-14 13:09:49 +0200
commit8357fc4bbe41b6fea37c93cb202ceddebd78244c (patch)
tree6997fba0a203b6c8d5e44d894d7fd96bfadbc0f2
parent48da5ce1b7527450a6edd421c7cd745d6b89cb27 (diff)
downloadlibsoup-8357fc4bbe41b6fea37c93cb202ceddebd78244c.tar.gz
session: use a weak ref of session in SoupMessageQueueSource
Fixes #308
-rw-r--r--libsoup/soup-session.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index c888db6b..e61255b4 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -167,7 +167,7 @@ G_DEFINE_QUARK (soup-session-error-quark, soup_session_error)
typedef struct {
GSource source;
- SoupSession* session;
+ GWeakRef session;
guint num_items;
} SoupMessageQueueSource;
@@ -176,18 +176,33 @@ queue_dispatch (GSource *source,
GSourceFunc callback,
gpointer user_data)
{
- SoupSession *session = ((SoupMessageQueueSource *)source)->session;
+ SoupMessageQueueSource *queue_source = (SoupMessageQueueSource *)source;
+ SoupSession *session = g_weak_ref_get (&queue_source->session);
+
+ if (!session)
+ return G_SOURCE_REMOVE;
g_source_set_ready_time (source, -1);
async_run_queue (session);
+ g_object_unref (session);
+
return G_SOURCE_CONTINUE;
}
+static void
+queue_finalize (GSource *source)
+{
+ SoupMessageQueueSource *queue_source = (SoupMessageQueueSource *)source;
+
+ g_weak_ref_clear (&queue_source->session);
+}
+
static GSourceFuncs queue_source_funcs = {
NULL, //queue_prepare,
NULL, //queue_check,
queue_dispatch,
- NULL, NULL, NULL
+ queue_finalize,
+ NULL, NULL
};
static void
@@ -203,7 +218,7 @@ soup_session_add_queue_source (SoupSession *session,
source = g_source_new (&queue_source_funcs, sizeof (SoupMessageQueueSource));
queue_source = (SoupMessageQueueSource *)source;
- queue_source->session = session;
+ g_weak_ref_init (&queue_source->session, session);
queue_source->num_items = 0;
g_source_set_name (source, "SoupMessageQueue");
g_source_set_can_recurse (source, TRUE);
@@ -212,7 +227,6 @@ soup_session_add_queue_source (SoupSession *session,
}
queue_source->num_items++;
-
}
static void
@@ -1814,7 +1828,6 @@ async_run_queue (SoupSession *session)
GList *items = NULL;
GList *i;
- g_object_ref (session);
g_atomic_int_inc (&priv->in_async_run_queue);
soup_connection_manager_cleanup (priv->conn_manager, FALSE);
@@ -1837,8 +1850,6 @@ async_run_queue (SoupSession *session)
g_mutex_unlock (&priv->queue_mutex);
g_atomic_int_set (&priv->needs_queue_sort, FALSE);
}
-
- g_object_unref (session);
}
/**