#include <string.h>
#include "soup-misc.h"
+#include "soup-misc-private.h"
/**
* SECTION:soup-misc
return source;
}
+GSource *
+soup_add_completion_reffed (GMainContext *async_context,
+ GSourceFunc function,
+ gpointer data)
+{
+ GSource *source = g_idle_source_new ();
+
+ g_source_set_priority (source, G_PRIORITY_DEFAULT);
+ g_source_set_callback (source, function, data, NULL);
+ g_source_attach (source, async_context);
+ return source;
+}
+
/**
* soup_add_completion: (skip)
* @async_context: (allow-none): the #GMainContext to dispatch the I/O
soup_add_completion (GMainContext *async_context,
GSourceFunc function, gpointer data)
{
- GSource *source = g_idle_source_new ();
- g_source_set_priority (source, G_PRIORITY_DEFAULT);
- g_source_set_callback (source, function, data, NULL);
- g_source_attach (source, async_context);
+ GSource *source;
+
+ source = soup_add_completion_reffed (async_context, function, data);
g_source_unref (source);
return source;
}
#include "soup-session-private.h"
#include "soup-message-private.h"
#include "soup-message-queue.h"
+#include "soup-misc-private.h"
/**
* SECTION:soup-session-async
typedef struct {
SoupSessionAsync *sa;
+ GSList *sources;
gboolean disposed;
} SoupSessionAsyncPrivate;
soup_session_async_dispose (GObject *object)
{
SoupSessionAsyncPrivate *priv = SOUP_SESSION_ASYNC_GET_PRIVATE (object);
+ GSList *iter;
priv->disposed = TRUE;
+ for (iter = priv->sources; iter; iter = iter->next) {
+ g_source_destroy (iter->data);
+ g_source_unref (iter->data);
+ }
+ g_clear_pointer (&priv->sources, g_slist_free);
G_OBJECT_CLASS (soup_session_async_parent_class)->dispose (object);
}
idle_run_queue (gpointer user_data)
{
SoupSessionAsyncPrivate *priv = user_data;
+ GSource *source;
if (priv->disposed)
return FALSE;
+ source = g_main_current_source ();
+ priv->sources = g_slist_remove (priv->sources, source);
+
/* Ensure that the source is destroyed before running the queue */
- g_source_destroy (g_main_current_source ());
+ g_source_destroy (source);
+ g_source_unref (source);
run_queue (priv->sa);
return FALSE;
if (source)
return;
- source = soup_add_completion (async_context, idle_run_queue, priv);
+ source = soup_add_completion_reffed (async_context, idle_run_queue, priv);
+ priv->sources = g_slist_prepend (priv->sources, source);
}
static void