[libsoup/carlosgc/session-queue-source: 2/5] session: make SoupMessageQueueSource cancellable
- From: Carlos Garcia Campos <carlosgc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsoup/carlosgc/session-queue-source: 2/5] session: make SoupMessageQueueSource cancellable
- Date: Fri, 14 Oct 2022 09:01:14 +0000 (UTC)
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]