[libsoup] Add SoupMessageQueueItemState, remove SoupMessageIOStatus
- From: Dan Winship <danw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsoup] Add SoupMessageQueueItemState, remove SoupMessageIOStatus
- Date: Wed, 9 Jun 2010 15:27:35 +0000 (UTC)
commit dc6395ccdb50e930bf71cd789bcb06e9b25aec44
Author: Dan Winship <danw gnome org>
Date: Sat May 29 16:37:34 2010 +0200
Add SoupMessageQueueItemState, remove SoupMessageIOStatus
SoupMessageIOStatus was always really more about the session than the
message. (SoupServer I/O didn't use it at all.) Replace it with a new
SoupMessageQueueItemState, on the queue item rather than the message.
libsoup/soup-connection.c | 2 +-
libsoup/soup-message-io.c | 2 +-
libsoup/soup-message-private.h | 13 --------
libsoup/soup-message-queue.c | 2 +-
libsoup/soup-message-queue.h | 24 ++++++++++++--
libsoup/soup-message.c | 49 +++-------------------------
libsoup/soup-session-async.c | 67 ++++++++++++++++++++++++---------------
libsoup/soup-session-sync.c | 44 +++++++++++++++++---------
libsoup/soup-session.c | 45 +++++++++++++++++++--------
9 files changed, 132 insertions(+), 116 deletions(-)
---
diff --git a/libsoup/soup-connection.c b/libsoup/soup-connection.c
index 7174e21..159d570 100644
--- a/libsoup/soup-connection.c
+++ b/libsoup/soup-connection.c
@@ -371,7 +371,7 @@ set_current_item (SoupConnection *conn, SoupMessageQueueItem *item)
stop_idle_timer (priv);
- soup_message_set_io_status (item->msg, SOUP_MESSAGE_IO_STATUS_RUNNING);
+ item->state = SOUP_MESSAGE_RUNNING;
priv->cur_item = item;
g_object_notify (G_OBJECT (conn), "message");
diff --git a/libsoup/soup-message-io.c b/libsoup/soup-message-io.c
index 8314f96..3aa4002 100644
--- a/libsoup/soup-message-io.c
+++ b/libsoup/soup-message-io.c
@@ -195,7 +195,7 @@ io_error (SoupSocket *sock, SoupMessage *msg, GError *error)
!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT) &&
request_is_idempotent (msg)) {
/* Connection got closed, but we can safely try again */
- priv->io_status = SOUP_MESSAGE_IO_STATUS_QUEUED;
+ io->item->state = SOUP_MESSAGE_STARTING;
} else if (!SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code))
soup_message_set_status (msg, SOUP_STATUS_IO_ERROR);
diff --git a/libsoup/soup-message-private.h b/libsoup/soup-message-private.h
index eba92df..5525ed7 100644
--- a/libsoup/soup-message-private.h
+++ b/libsoup/soup-message-private.h
@@ -10,16 +10,8 @@
#include "soup-auth.h"
#include "soup-content-sniffer.h"
-typedef enum {
- SOUP_MESSAGE_IO_STATUS_IDLE,
- SOUP_MESSAGE_IO_STATUS_QUEUED,
- SOUP_MESSAGE_IO_STATUS_RUNNING,
- SOUP_MESSAGE_IO_STATUS_FINISHED
-} SoupMessageIOStatus;
-
typedef struct {
gpointer io_data;
- SoupMessageIOStatus io_status;
SoupChunkAllocator chunk_allocator;
gpointer chunk_allocator_data;
@@ -45,8 +37,6 @@ typedef struct {
} SoupMessagePrivate;
#define SOUP_MESSAGE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SOUP_TYPE_MESSAGE, SoupMessagePrivate))
-#define SOUP_MESSAGE_IS_STARTING(msg) (SOUP_MESSAGE_GET_PRIVATE (msg)->io_status == SOUP_MESSAGE_IO_STATUS_QUEUED && !SOUP_STATUS_IS_TRANSPORT_ERROR ((msg)->status_code))
-
void soup_message_cleanup_response (SoupMessage *req);
@@ -95,9 +85,6 @@ void soup_message_set_proxy_auth (SoupMessage *msg,
SoupAuth *soup_message_get_proxy_auth (SoupMessage *msg);
/* I/O */
-void soup_message_set_io_status (SoupMessage *msg,
- SoupMessageIOStatus status);
-SoupMessageIOStatus soup_message_get_io_status (SoupMessage *msg);
void soup_message_io_stop (SoupMessage *msg);
void soup_message_io_pause (SoupMessage *msg);
void soup_message_io_unpause (SoupMessage *msg);
diff --git a/libsoup/soup-message-queue.c b/libsoup/soup-message-queue.c
index 6860524..b421eff 100644
--- a/libsoup/soup-message-queue.c
+++ b/libsoup/soup-message-queue.c
@@ -69,7 +69,7 @@ queue_message_restarted (SoupMessage *msg, gpointer user_data)
soup_uri_free (item->proxy_uri);
item->proxy_uri = NULL;
}
- item->resolved_proxy_addr = FALSE;
+ item->state = SOUP_MESSAGE_STARTING;
}
/**
diff --git a/libsoup/soup-message-queue.h b/libsoup/soup-message-queue.h
index 9588e17..ecb874e 100644
--- a/libsoup/soup-message-queue.h
+++ b/libsoup/soup-message-queue.h
@@ -16,6 +16,24 @@
G_BEGIN_DECLS
+typedef enum {
+ SOUP_MESSAGE_STARTING,
+ SOUP_MESSAGE_RESOLVING_PROXY_URI,
+ SOUP_MESSAGE_RESOLVED_PROXY_URI,
+ SOUP_MESSAGE_RESOLVING_PROXY_ADDRESS,
+ SOUP_MESSAGE_RESOLVED_PROXY_ADDRESS,
+ SOUP_MESSAGE_AWAITING_CONNECTION,
+ SOUP_MESSAGE_GOT_CONNECTION,
+ SOUP_MESSAGE_CONNECTING,
+ SOUP_MESSAGE_CONNECTED,
+ SOUP_MESSAGE_TUNNELING,
+ SOUP_MESSAGE_TUNNELED,
+ SOUP_MESSAGE_READY,
+ SOUP_MESSAGE_RUNNING,
+ SOUP_MESSAGE_RESTARTING,
+ SOUP_MESSAGE_FINISHED
+} SoupMessageQueueItemState;
+
struct _SoupMessageQueueItem {
/*< public >*/
SoupSession *session;
@@ -31,12 +49,11 @@ struct _SoupMessageQueueItem {
guint redirection_count;
- guint resolving_proxy_addr : 1;
- guint resolved_proxy_addr : 1;
+ SoupMessageQueueItemState state;
/*< private >*/
guint removed : 1;
- guint ref_count : 29;
+ guint ref_count : 31;
SoupMessageQueueItem *prev, *next;
};
@@ -61,6 +78,7 @@ void soup_message_queue_item_unref (SoupMessageQueueItem *item)
void soup_message_queue_destroy (SoupMessageQueue *queue);
+
G_END_DECLS
#endif /* SOUP_MESSAGE_QUEUE_H */
diff --git a/libsoup/soup-message.c b/libsoup/soup-message.c
index 93969fd..54c96af 100644
--- a/libsoup/soup-message.c
+++ b/libsoup/soup-message.c
@@ -129,8 +129,6 @@ enum {
};
static void got_body (SoupMessage *req);
-static void restarted (SoupMessage *req);
-static void finished (SoupMessage *req);
static void set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec);
@@ -142,7 +140,6 @@ soup_message_init (SoupMessage *msg)
{
SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (msg);
- priv->io_status = SOUP_MESSAGE_IO_STATUS_IDLE;
priv->http_version = priv->orig_http_version = SOUP_HTTP_1_1;
msg->request_body = soup_message_body_new ();
@@ -198,9 +195,7 @@ soup_message_class_init (SoupMessageClass *message_class)
g_type_class_add_private (message_class, sizeof (SoupMessagePrivate));
/* virtual method definition */
- message_class->got_body = got_body;
- message_class->restarted = restarted;
- message_class->finished = finished;
+ message_class->got_body = got_body;
/* virtual method override */
object_class->finalize = finalize;
@@ -1014,12 +1009,6 @@ soup_message_content_sniffed (SoupMessage *msg, const char *content_type, GHashT
g_signal_emit (msg, signals[CONTENT_SNIFFED], 0, content_type, params);
}
-static void
-restarted (SoupMessage *req)
-{
- soup_message_io_stop (req);
-}
-
/**
* soup_message_restarted:
* @msg: a #SoupMessage
@@ -1033,15 +1022,6 @@ soup_message_restarted (SoupMessage *msg)
g_signal_emit (msg, signals[RESTARTED], 0);
}
-static void
-finished (SoupMessage *req)
-{
- SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (req);
-
- soup_message_io_stop (req);
- priv->io_status = SOUP_MESSAGE_IO_STATUS_FINISHED;
-}
-
/**
* soup_message_finished:
* @msg: a #SoupMessage
@@ -1052,10 +1032,7 @@ finished (SoupMessage *req)
void
soup_message_finished (SoupMessage *msg)
{
- SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (msg);
-
- if (priv->io_status != SOUP_MESSAGE_IO_STATUS_FINISHED)
- g_signal_emit (msg, signals[FINISHED], 0);
+ g_signal_emit (msg, signals[FINISHED], 0);
}
static void
@@ -1074,8 +1051,10 @@ header_handler_metamarshal (GClosure *closure, GValue *return_value,
const char *header_name = marshal_data;
SoupMessageHeaders *hdrs;
+#ifdef FIXME
if (priv->io_status != SOUP_MESSAGE_IO_STATUS_RUNNING)
return;
+#endif
hdrs = priv->server_side ? msg->request_headers : msg->response_headers;
if (soup_message_headers_get_one (hdrs, header_name)) {
@@ -1139,11 +1118,12 @@ status_handler_metamarshal (GClosure *closure, GValue *return_value,
gpointer invocation_hint, gpointer marshal_data)
{
SoupMessage *msg = g_value_get_object (¶m_values[0]);
- SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (msg);
guint status = GPOINTER_TO_UINT (marshal_data);
+#ifdef FIXME
if (priv->io_status != SOUP_MESSAGE_IO_STATUS_RUNNING)
return;
+#endif
if (msg->status_code == status) {
closure->marshal (closure, return_value, n_param_values,
@@ -1617,23 +1597,6 @@ soup_message_set_status_full (SoupMessage *msg,
g_object_notify (G_OBJECT (msg), SOUP_MESSAGE_REASON_PHRASE);
}
-void
-soup_message_set_io_status (SoupMessage *msg,
- SoupMessageIOStatus status)
-{
- SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (msg);
-
- priv->io_status = status;
-}
-
-SoupMessageIOStatus
-soup_message_get_io_status (SoupMessage *msg)
-{
- SoupMessagePrivate *priv = SOUP_MESSAGE_GET_PRIVATE (msg);
-
- return priv->io_status;
-}
-
/**
* SoupChunkAllocator:
* @msg: the #SoupMessage the chunk is being allocated for
diff --git a/libsoup/soup-session-async.c b/libsoup/soup-session-async.c
index 57c0581..ee356ef 100644
--- a/libsoup/soup-session-async.c
+++ b/libsoup/soup-session-async.c
@@ -127,6 +127,7 @@ item_failed (SoupMessageQueueItem *item, guint status)
}
if (!SOUP_STATUS_IS_SUCCESSFUL (status)) {
+ item->state = SOUP_MESSAGE_FINISHED;
if (status != SOUP_STATUS_CANCELLED)
soup_session_cancel_message (item->session, item->msg, status);
soup_message_queue_item_unref (item);
@@ -146,8 +147,7 @@ resolved_proxy_addr (SoupAddress *addr, guint status, gpointer user_data)
return;
item->proxy_addr = g_object_ref (addr);
- item->resolving_proxy_addr = FALSE;
- item->resolved_proxy_addr = TRUE;
+ item->state = SOUP_MESSAGE_AWAITING_CONNECTION;
soup_message_queue_item_unref (item);
@@ -168,6 +168,8 @@ resolved_proxy_uri (SoupProxyURIResolver *proxy_resolver,
if (proxy_uri) {
SoupAddress *proxy_addr;
+ item->state = SOUP_MESSAGE_RESOLVING_PROXY_ADDRESS;
+
item->proxy_uri = soup_uri_copy (proxy_uri);
proxy_addr = soup_address_new (proxy_uri->host,
proxy_uri->port);
@@ -179,8 +181,7 @@ resolved_proxy_uri (SoupProxyURIResolver *proxy_resolver,
return;
}
- item->resolving_proxy_addr = FALSE;
- item->resolved_proxy_addr = TRUE;
+ item->state = SOUP_MESSAGE_AWAITING_CONNECTION;
soup_message_queue_item_unref (item);
/* If we got here we know session still exists */
@@ -191,9 +192,7 @@ static void
resolve_proxy_addr (SoupMessageQueueItem *item,
SoupProxyURIResolver *proxy_resolver)
{
- if (item->resolving_proxy_addr)
- return;
- item->resolving_proxy_addr = TRUE;
+ item->state = SOUP_MESSAGE_RESOLVING_PROXY_URI;
soup_message_queue_item_ref (item);
soup_proxy_uri_resolver_get_proxy_uri_async (
@@ -216,7 +215,7 @@ tunnel_message_completed (SoupMessage *msg, gpointer user_data)
{
SoupMessageQueueItem *item = user_data;
- if (SOUP_MESSAGE_IS_STARTING (msg)) {
+ if (item->state == SOUP_MESSAGE_RESTARTING) {
soup_message_restarted (msg);
if (soup_connection_get_state (item->conn) != SOUP_CONNECTION_DISCONNECTED) {
soup_session_send_queue_item (item->session, item, item->conn, tunnel_message_completed);
@@ -226,6 +225,7 @@ tunnel_message_completed (SoupMessage *msg, gpointer user_data)
soup_message_set_status (msg, SOUP_STATUS_TRY_AGAIN);
}
+ item->state = SOUP_MESSAGE_FINISHED;
soup_message_finished (msg);
}
@@ -306,10 +306,14 @@ got_connection (SoupConnection *conn, guint status, gpointer user_data)
static void
message_completed (SoupMessage *msg, gpointer user_data)
{
- if (SOUP_MESSAGE_IS_STARTING (msg))
+ SoupMessageQueueItem *item = user_data;
+
+ if (item->state == SOUP_MESSAGE_RESTARTING)
soup_message_restarted (msg);
- else
+ else {
+ item->state = SOUP_MESSAGE_FINISHED;
soup_message_finished (msg);
+ }
}
static void
@@ -335,29 +339,34 @@ run_queue (SoupSessionAsync *sa)
if (msg->method == SOUP_METHOD_CONNECT)
continue;
- if (soup_message_io_in_progress (msg))
- continue;
-
- if (!item->resolved_proxy_addr) {
+ if (item->state == SOUP_MESSAGE_STARTING) {
proxy_resolver = (SoupProxyURIResolver *)soup_session_get_feature_for_message (session, SOUP_TYPE_PROXY_URI_RESOLVER, msg);
if (proxy_resolver) {
resolve_proxy_addr (item, proxy_resolver);
continue;
} else
- item->resolved_proxy_addr = TRUE;
+ item->state = SOUP_MESSAGE_AWAITING_CONNECTION;
}
- conn = soup_session_get_connection (session, item,
- &should_prune);
- if (!conn)
- continue;
+ if (item->state == SOUP_MESSAGE_AWAITING_CONNECTION) {
+ conn = soup_session_get_connection (session, item,
+ &should_prune);
+ if (!conn)
+ continue;
- if (soup_connection_get_state (conn) == SOUP_CONNECTION_NEW) {
- soup_connection_connect_async (conn, item->cancellable,
- got_connection,
- g_object_ref (session));
- } else
+ if (soup_connection_get_state (conn) == SOUP_CONNECTION_NEW) {
+ item->state = SOUP_MESSAGE_AWAITING_CONNECTION;
+ soup_connection_connect_async (conn, item->cancellable,
+ got_connection,
+ g_object_ref (session));
+ } else
+ item->state = SOUP_MESSAGE_READY;
+ }
+
+ if (item->state == SOUP_MESSAGE_READY) {
+ item->state = SOUP_MESSAGE_RUNNING;
soup_session_send_queue_item (session, item, conn, message_completed);
+ }
}
if (item)
soup_message_queue_item_unref (item);
@@ -390,7 +399,7 @@ final_finished (SoupMessage *req, gpointer user_data)
g_object_ref (session);
- if (!SOUP_MESSAGE_IS_STARTING (req)) {
+ if (item->state == SOUP_MESSAGE_FINISHED) {
g_signal_handlers_disconnect_by_func (req, final_finished, item);
g_signal_handlers_disconnect_by_func (req, request_restarted, item);
if (item->callback)
@@ -448,6 +457,7 @@ queue_message (SoupSession *session, SoupMessage *req,
static guint
send_message (SoupSession *session, SoupMessage *req)
{
+ SoupMessageQueueItem *item;
GMainContext *async_context =
soup_session_get_async_context (session);
@@ -456,10 +466,15 @@ send_message (SoupSession *session, SoupMessage *req)
queue_message (session, req, NULL, NULL);
- while (soup_message_get_io_status (req) != SOUP_MESSAGE_IO_STATUS_FINISHED &&
+ item = soup_message_queue_lookup (soup_session_get_queue (session), req);
+ g_return_val_if_fail (item != NULL, SOUP_STATUS_MALFORMED);
+
+ while (item->state != SOUP_MESSAGE_FINISHED &&
!SOUP_STATUS_IS_TRANSPORT_ERROR (req->status_code))
g_main_context_iteration (async_context, TRUE);
+ soup_message_queue_item_unref (item);
+
return req->status_code;
}
diff --git a/libsoup/soup-session-sync.c b/libsoup/soup-session-sync.c
index 1743f25..b9db714 100644
--- a/libsoup/soup-session-sync.c
+++ b/libsoup/soup-session-sync.c
@@ -149,17 +149,20 @@ tunnel_connect (SoupSession *session, SoupConnection *conn,
item = soup_session_make_connect_message (session, tunnel_addr);
do {
soup_session_send_queue_item (session, item, conn, NULL);
- if (SOUP_MESSAGE_IS_STARTING (item->msg))
- soup_message_restarted (item->msg) ;
- else
+ if (item->state == SOUP_MESSAGE_RESTARTING) {
+ item->state = SOUP_MESSAGE_STARTING;
+ soup_message_restarted (item->msg);
+ } else {
+ item->state = SOUP_MESSAGE_FINISHED;
soup_message_finished (item->msg);
- } while (SOUP_MESSAGE_IS_STARTING (item->msg) &&
+ }
+ } while (item->state == SOUP_MESSAGE_STARTING &&
soup_connection_get_state (conn) != SOUP_CONNECTION_DISCONNECTED);
/* If the message was requeued but its connection was closed,
* return TRY_AGAIN to our caller.
*/
- if (SOUP_MESSAGE_IS_STARTING (item->msg))
+ if (item->state == SOUP_MESSAGE_STARTING)
status = SOUP_STATUS_TRY_AGAIN;
else
status = item->msg->status_code;
@@ -190,7 +193,8 @@ wait_for_connection (SoupMessageQueueItem *item)
guint status;
proxy_resolver = (SoupProxyURIResolver *)soup_session_get_feature_for_message (session, SOUP_TYPE_PROXY_URI_RESOLVER, msg);
- if (proxy_resolver && !item->resolved_proxy_addr) {
+ if (proxy_resolver && item->state == SOUP_MESSAGE_STARTING) {
+ item->state = SOUP_MESSAGE_RESOLVING_PROXY_URI;
status = soup_proxy_uri_resolver_get_proxy_uri_sync (
proxy_resolver, soup_message_get_uri (msg),
item->cancellable, &item->proxy_uri);
@@ -199,8 +203,10 @@ wait_for_connection (SoupMessageQueueItem *item)
soup_session_cancel_message (session, msg, status);
return NULL;
}
+ item->state = SOUP_MESSAGE_RESOLVED_PROXY_URI;
if (item->proxy_uri) {
+ item->state = SOUP_MESSAGE_RESOLVING_PROXY_ADDRESS;
item->proxy_addr = soup_address_new (
item->proxy_uri->host, item->proxy_uri->port);
status = soup_address_resolve_sync (item->proxy_addr,
@@ -212,7 +218,7 @@ wait_for_connection (SoupMessageQueueItem *item)
}
}
- item->resolved_proxy_addr = TRUE;
+ item->state = SOUP_MESSAGE_AWAITING_CONNECTION;
}
g_mutex_lock (priv->lock);
@@ -223,25 +229,29 @@ wait_for_connection (SoupMessageQueueItem *item)
conn = soup_session_get_connection (session, item, &try_pruning);
if (conn) {
if (soup_connection_get_state (conn) == SOUP_CONNECTION_NEW) {
+ item->state = SOUP_MESSAGE_CONNECTING;
status = soup_connection_connect_sync (conn, item->cancellable);
if (!SOUP_STATUS_IS_SUCCESSFUL (status)) {
soup_session_connection_failed (session, conn, status);
conn = NULL;
- } else if (soup_message_get_io_status (msg) == SOUP_MESSAGE_IO_STATUS_FINISHED) {
+ } else if (item->state == SOUP_MESSAGE_FINISHED) {
/* Message was cancelled while we were
* connecting.
*/
soup_connection_disconnect (conn);
conn = NULL;
} else if ((tunnel_addr = soup_connection_get_tunnel_addr (conn))) {
+ item->state = SOUP_MESSAGE_TUNNELING;
status = tunnel_connect (session, conn, tunnel_addr);
if (!SOUP_STATUS_IS_SUCCESSFUL (status)) {
conn = NULL;
if (status == SOUP_STATUS_TRY_AGAIN)
goto try_again;
- }
- }
+ } else
+ item->state = SOUP_MESSAGE_READY;
+ } else
+ item->state = SOUP_MESSAGE_READY;
}
g_mutex_unlock (priv->lock);
@@ -258,7 +268,7 @@ wait_for_connection (SoupMessageQueueItem *item)
g_cond_wait (priv->cond, priv->lock);
/* See if something bad happened */
- if (soup_message_get_io_status (msg) == SOUP_MESSAGE_IO_STATUS_FINISHED) {
+ if (item->state == SOUP_MESSAGE_FINISHED) {
g_mutex_unlock (priv->lock);
return NULL;
}
@@ -272,19 +282,23 @@ process_queue_item (SoupMessageQueueItem *item)
SoupSessionSyncPrivate *priv = SOUP_SESSION_SYNC_GET_PRIVATE (item->session);
SoupConnection *conn;
+ item->state = SOUP_MESSAGE_STARTING;
do {
conn = wait_for_connection (item);
if (!conn)
break;
+ item->state = SOUP_MESSAGE_RUNNING;
soup_session_send_queue_item (item->session, item, conn, NULL);
- if (SOUP_MESSAGE_IS_STARTING (item->msg))
+ if (item->state == SOUP_MESSAGE_RESTARTING) {
+ item->state = SOUP_MESSAGE_STARTING;
soup_message_restarted (item->msg);
- else
+ } else {
+ item->state = SOUP_MESSAGE_FINISHED;
soup_message_finished (item->msg);
+ }
g_cond_broadcast (priv->cond);
- } while (soup_message_get_io_status (item->msg) !=
- SOUP_MESSAGE_IO_STATUS_FINISHED);
+ } while (item->state != SOUP_MESSAGE_FINISHED);
}
static gboolean
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index 0022c99..22c91ae 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -1290,7 +1290,7 @@ soup_session_connection_failed (SoupSession *session,
g_object_ref (session);
for (item = soup_message_queue_first (priv->queue); item; item = soup_message_queue_next (priv->queue, item)) {
msg = item->msg;
- if (SOUP_MESSAGE_IS_STARTING (msg) &&
+ if (item->state < SOUP_MESSAGE_RUNNING &&
get_host_for_message (session, msg) == host)
soup_session_cancel_message (session, msg, status);
}
@@ -1472,7 +1472,7 @@ message_finished (SoupMessage *msg, gpointer user_data)
item->conn = NULL;
}
- if (!SOUP_MESSAGE_IS_STARTING (msg)) {
+ if (item->state == SOUP_MESSAGE_FINISHED) {
soup_message_queue_remove (priv->queue, item);
g_mutex_lock (priv->host_lock);
@@ -1489,7 +1489,8 @@ message_finished (SoupMessage *msg, gpointer user_data)
0, 0, NULL, NULL, session);
g_signal_emit (session, signals[REQUEST_UNQUEUED], 0, msg);
soup_message_queue_item_unref (item);
- }
+ } else
+ g_warning ("finished an item with state %d", item->state);
}
static void
@@ -1507,8 +1508,6 @@ queue_message (SoupSession *session, SoupMessage *msg,
host->num_messages++;
g_mutex_unlock (priv->host_lock);
- soup_message_set_io_status (msg, SOUP_MESSAGE_IO_STATUS_QUEUED);
-
g_signal_connect_after (msg, "finished",
G_CALLBACK (message_finished), item);
@@ -1562,7 +1561,13 @@ soup_session_queue_message (SoupSession *session, SoupMessage *msg,
static void
requeue_message (SoupSession *session, SoupMessage *msg)
{
- soup_message_set_io_status (msg, SOUP_MESSAGE_IO_STATUS_QUEUED);
+ SoupSessionPrivate *priv = SOUP_SESSION_GET_PRIVATE (session);
+ SoupMessageQueueItem *item;
+
+ item = soup_message_queue_lookup (priv->queue, msg);
+ g_return_if_fail (item != NULL);
+ item->state = SOUP_MESSAGE_RESTARTING;
+ soup_message_queue_item_unref (item);
}
/**
@@ -1654,15 +1659,19 @@ cancel_message (SoupSession *session, SoupMessage *msg, guint status_code)
SoupMessageQueueItem *item;
item = soup_message_queue_lookup (priv->queue, msg);
- if (item) {
- if (item->cancellable)
- g_cancellable_cancel (item->cancellable);
- soup_message_queue_item_unref (item);
- }
+ g_return_if_fail (item != NULL);
+
+ if (item->cancellable)
+ g_cancellable_cancel (item->cancellable);
soup_message_io_stop (msg);
soup_message_set_status (msg, status_code);
- soup_message_finished (msg);
+
+ if (item->state != SOUP_MESSAGE_FINISHED) {
+ item->state = SOUP_MESSAGE_FINISHED;
+ soup_message_finished (msg);
+ }
+ soup_message_queue_item_unref (item);
}
/**
@@ -1695,14 +1704,24 @@ void
soup_session_cancel_message (SoupSession *session, SoupMessage *msg,
guint status_code)
{
+ SoupSessionPrivate *priv;
+ SoupMessageQueueItem *item;
+
g_return_if_fail (SOUP_IS_SESSION (session));
g_return_if_fail (SOUP_IS_MESSAGE (msg));
+ priv = SOUP_SESSION_GET_PRIVATE (session);
+ item = soup_message_queue_lookup (priv->queue, msg);
/* If the message is already ending, don't do anything */
- if (soup_message_get_io_status (msg) == SOUP_MESSAGE_IO_STATUS_FINISHED)
+ if (!item)
return;
+ if (item->state == SOUP_MESSAGE_FINISHED) {
+ soup_message_queue_item_unref (item);
+ return;
+ }
SOUP_SESSION_GET_CLASS (session)->cancel_message (session, msg, status_code);
+ soup_message_queue_item_unref (item);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]