summaryrefslogtreecommitdiff
path: root/libsoup/soup-message-queue.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsoup/soup-message-queue.c')
-rw-r--r--libsoup/soup-message-queue.c275
1 files changed, 0 insertions, 275 deletions
diff --git a/libsoup/soup-message-queue.c b/libsoup/soup-message-queue.c
deleted file mode 100644
index 5e04d306..00000000
--- a/libsoup/soup-message-queue.c
+++ /dev/null
@@ -1,275 +0,0 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/*
- * soup-message-queue.c: Message queue
- *
- * Copyright (C) 2003 Novell, Inc.
- * Copyright (C) 2008 Red Hat, Inc.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "soup-message-queue.h"
-#include "soup.h"
-
-/* This is an internal structure used by #SoupSession and its
- * subclasses to keep track of the status of messages currently being
- * processed.
- *
- * The #SoupMessageQueue itself is mostly just a linked list of
- * #SoupMessageQueueItem, with some added cleverness to allow the list
- * to be walked safely while other threads / re-entrant loops are
- * adding items to and removing items from it. In particular, this is
- * handled by refcounting items and then keeping "removed" items in
- * the list until their ref_count drops to 0, but skipping over the
- * "removed" ones when walking the queue.
- **/
-
-struct _SoupMessageQueue {
- SoupSession *session;
-
- SoupMessageQueueItem *head, *tail;
-};
-
-SoupMessageQueue *
-soup_message_queue_new (SoupSession *session)
-{
- SoupMessageQueue *queue;
-
- queue = g_slice_new0 (SoupMessageQueue);
- queue->session = session;
-
- return queue;
-}
-
-void
-soup_message_queue_destroy (SoupMessageQueue *queue)
-{
- g_return_if_fail (queue->head == NULL);
-
- g_slice_free (SoupMessageQueue, queue);
-}
-
-static void
-queue_message_restarted (SoupMessage *msg, gpointer user_data)
-{
- SoupMessageQueueItem *item = user_data;
-
- g_cancellable_reset (item->cancellable);
-}
-
-/**
- * soup_message_queue_append:
- * @queue: a #SoupMessageQueue
- * @msg: a #SoupMessage
- * @callback: the callback for @msg
- * @user_data: the data to pass to @callback
- *
- * Creates a new #SoupMessageQueueItem and appends it to @queue.
- *
- * Returns: the new item, which you must unref with
- * soup_message_queue_unref_item() when you are done with.
- **/
-SoupMessageQueueItem *
-soup_message_queue_append (SoupMessageQueue *queue,
- SoupMessage *msg,
- GCancellable *cancellable,
- SoupSessionCallback callback,
- gpointer user_data)
-{
- SoupMessageQueueItem *item;
-
- item = g_slice_new0 (SoupMessageQueueItem);
- item->session = g_object_ref (queue->session);
- item->queue = queue;
- item->msg = g_object_ref (msg);
- item->callback = callback;
- item->callback_data = user_data;
- item->cancellable = cancellable ? g_object_ref (cancellable) : g_cancellable_new ();
- item->priority = soup_message_get_priority (msg);
-
- g_signal_connect (msg, "restarted",
- G_CALLBACK (queue_message_restarted), item);
-
- /* Note: the initial ref_count of 1 represents the caller's
- * ref; the queue's own ref is indicated by the absence of the
- * "removed" flag.
- */
- item->ref_count = 1;
-
- if (queue->head) {
- SoupMessageQueueItem *it = queue->head;
-
- while (it && it->priority >= item->priority)
- it = it->next;
-
- if (!it) {
- if (queue->tail) {
- queue->tail->next = item;
- item->prev = queue->tail;
- } else
- queue->head = item;
- queue->tail = item;
- } else {
- if (it != queue->head)
- it->prev->next = item;
- else
- queue->head = item;
- item->prev = it->prev;
- it->prev = item;
- item->next = it;
- }
- } else
- queue->head = queue->tail = item;
-
- return item;
-}
-
-/**
- * soup_message_queue_item_ref:
- * @item: a #SoupMessageQueueItem
- *
- * Refs @item.
- **/
-void
-soup_message_queue_item_ref (SoupMessageQueueItem *item)
-{
- item->ref_count++;
-}
-
-/**
- * soup_message_queue_item_unref:
- * @item: a #SoupMessageQueueItem
- *
- * Unrefs @item; use this on a #SoupMessageQueueItem that you are done
- * with (but that you aren't passing to
- * soup_message_queue_item_next()).
- **/
-void
-soup_message_queue_item_unref (SoupMessageQueueItem *item)
-{
- /* Decrement the ref_count; if it's still non-zero OR if the
- * item is still in the queue, then return.
- */
- if (--item->ref_count || !item->removed)
- return;
-
- g_warn_if_fail (item->conn == NULL);
-
- /* OK, @item is dead. Rewrite @queue around it */
- if (item->prev)
- item->prev->next = item->next;
- else
- item->queue->head = item->next;
- if (item->next)
- item->next->prev = item->prev;
- else
- item->queue->tail = item->prev;
-
- /* And free it */
- g_signal_handlers_disconnect_by_func (item->msg,
- queue_message_restarted, item);
- g_object_unref (item->session);
- g_object_unref (item->msg);
- g_object_unref (item->cancellable);
- g_clear_error (&item->error);
- g_clear_object (&item->task);
- g_slice_free (SoupMessageQueueItem, item);
-}
-
-/**
- * soup_message_queue_lookup:
- * @queue: a #SoupMessageQueue
- * @msg: a #SoupMessage
- *
- * Finds the #SoupMessageQueueItem for @msg in @queue. You must unref
- * the item with soup_message_queue_unref_item() when you are done
- * with it.
- *
- * Returns: (nullable): the queue item for @msg, or %NULL
- **/
-SoupMessageQueueItem *
-soup_message_queue_lookup (SoupMessageQueue *queue, SoupMessage *msg)
-{
- SoupMessageQueueItem *item;
-
- item = queue->tail;
- while (item && (item->removed || item->msg != msg))
- item = item->prev;
-
- if (item)
- item->ref_count++;
-
- return item;
-}
-
-/**
- * soup_message_queue_first:
- * @queue: a #SoupMessageQueue
- *
- * Gets the first item in @queue. You must unref the item by calling
- * soup_message_queue_unref_item() on it when you are done.
- * (soup_message_queue_next() does this for you automatically, so you
- * only need to unref the item yourself if you are not going to
- * finishing walking the queue.)
- *
- * Returns: the first item in @queue.
- **/
-SoupMessageQueueItem *
-soup_message_queue_first (SoupMessageQueue *queue)
-{
- SoupMessageQueueItem *item;
-
- item = queue->head;
- while (item && item->removed)
- item = item->next;
-
- if (item)
- item->ref_count++;
-
- return item;
-}
-
-/**
- * soup_message_queue_next:
- * @queue: a #SoupMessageQueue
- * @item: a #SoupMessageQueueItem
- *
- * Unrefs @item and gets the next item after it in @queue. As with
- * soup_message_queue_first(), you must unref the returned item
- * yourself with soup_message_queue_unref_item() if you do not finish
- * walking the queue.
- *
- * Returns: the next item in @queue.
- **/
-SoupMessageQueueItem *
-soup_message_queue_next (SoupMessageQueue *queue, SoupMessageQueueItem *item)
-{
- SoupMessageQueueItem *next;
-
- next = item->next;
- while (next && next->removed)
- next = next->next;
- if (next)
- next->ref_count++;
-
- soup_message_queue_item_unref (item);
- return next;
-}
-
-/**
- * soup_message_queue_remove:
- * @queue: a #SoupMessageQueue
- * @item: a #SoupMessageQueueItem
- *
- * Removes @item from @queue. Note that you probably also need to call
- * soup_message_queue_unref_item() after this.
- **/
-void
-soup_message_queue_remove (SoupMessageQueue *queue, SoupMessageQueueItem *item)
-{
- g_return_if_fail (!item->removed);
-
- item->removed = TRUE;
-}