diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2022-10-14 10:11:02 +0200 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2022-10-14 13:09:49 +0200 |
commit | 8357fc4bbe41b6fea37c93cb202ceddebd78244c (patch) | |
tree | 6997fba0a203b6c8d5e44d894d7fd96bfadbc0f2 /libsoup | |
parent | 48da5ce1b7527450a6edd421c7cd745d6b89cb27 (diff) | |
download | libsoup-8357fc4bbe41b6fea37c93cb202ceddebd78244c.tar.gz |
session: use a weak ref of session in SoupMessageQueueSource
Fixes #308
Diffstat (limited to 'libsoup')
-rw-r--r-- | libsoup/soup-session.c | 27 |
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); } /** |