[libsoup/carlosgc/session-queue-source: 2/5] session: make SoupMessageQueueSource cancellable




commit 65ea219f31f69b6d8864cd5a3e005a97223e9d23
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Fri Oct 14 10:11:02 2022 +0200

    session: make SoupMessageQueueSource cancellable
    
    And cancel the sources on dispose.

 libsoup/soup-session.c | 27 ++++++++++++++++++++++-----
 1 file changed, 22 insertions(+), 5 deletions(-)
---
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index c888db6b..13fea3ea 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -86,6 +86,7 @@ typedef struct {
        GQueue *queue;
         GMutex queue_sources_mutex;
        GHashTable *queue_sources;
+        GCancellable *queue_sources_cancellable;
         guint in_async_run_queue;
         gboolean needs_queue_sort;
 
@@ -167,7 +168,8 @@ G_DEFINE_QUARK (soup-session-error-quark, soup_session_error)
 
 typedef struct {
        GSource source;
-       SoupSession* session;
+       SoupSession *session;
+        GCancellable *cancellable;
         guint num_items;
 } SoupMessageQueueSource;
 
@@ -176,18 +178,30 @@ queue_dispatch (GSource    *source,
                GSourceFunc callback,
                gpointer    user_data)
 {
-       SoupSession *session = ((SoupMessageQueueSource *)source)->session;
+        SoupMessageQueueSource *queue_source = (SoupMessageQueueSource *)source;
+
+        if (g_cancellable_is_cancelled (queue_source->cancellable))
+                return G_SOURCE_REMOVE;
 
        g_source_set_ready_time (source, -1);
-       async_run_queue (session);
+       async_run_queue (queue_source->session);
        return G_SOURCE_CONTINUE;
 }
 
+static void
+queue_finalize (GSource *source)
+{
+        GCancellable *cancellable = ((SoupMessageQueueSource *)source)->cancellable;
+
+        g_object_unref (cancellable);
+}
+
 static GSourceFuncs queue_source_funcs = {
        NULL, //queue_prepare,
        NULL, //queue_check,
        queue_dispatch,
-       NULL, NULL, NULL
+        queue_finalize,
+       NULL, NULL
 };
 
 static void
@@ -204,6 +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;
+                queue_source->cancellable = g_object_ref (priv->queue_sources_cancellable);
                 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
@@ -272,6 +286,7 @@ soup_session_init (SoupSession *session)
        priv->queue = g_queue_new ();
         g_mutex_init (&priv->queue_sources_mutex);
         priv->queue_sources = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_source_unref);
+        priv->queue_sources_cancellable = g_cancellable_new ();
         soup_session_add_queue_source (session, priv->context);
 
         priv->io_timeout = priv->idle_timeout = 60;
@@ -317,6 +332,7 @@ soup_session_dispose (GObject *object)
        while (priv->features)
                soup_session_remove_feature (session, priv->features->data);
 
+        g_cancellable_cancel (priv->queue_sources_cancellable);
         g_hash_table_foreach (priv->queue_sources, (GHFunc)destroy_queue_source, NULL);
 
        G_OBJECT_CLASS (soup_session_parent_class)->dispose (object);
@@ -333,6 +349,7 @@ soup_session_finalize (GObject *object)
         g_mutex_clear (&priv->queue_mutex);
         g_hash_table_destroy (priv->queue_sources);
         g_mutex_clear (&priv->queue_sources_mutex);
+        g_clear_object (&priv->queue_sources_cancellable);
         g_main_context_unref (priv->context);
 
         g_clear_pointer (&priv->conn_manager, soup_connection_manager_free);


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