summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2021-04-20 13:30:37 +0200
committerCarlos Garcia Campos <cgarcia@igalia.com>2021-04-20 13:30:37 +0200
commit3e697251e36a67b33c91f9b8d34161a1d45a32a1 (patch)
treed1f915eea5f8a9048a892c98ccf0a02ee50a3d4c
parentbbe245141742cee0b557fb9c3b1897a50f040b6b (diff)
downloadlibsoup-carlosgc/io-data-ownership.tar.gz
Move message io data ownership to SoupConnectioncarlosgc/io-data-ownership
-rw-r--r--libsoup/soup-connection.c45
-rw-r--r--libsoup/soup-connection.h8
-rw-r--r--libsoup/soup-message-io.c65
-rw-r--r--libsoup/soup-message-private.h17
-rw-r--r--libsoup/soup-message.c28
-rw-r--r--libsoup/soup-session.c7
6 files changed, 98 insertions, 72 deletions
diff --git a/libsoup/soup-connection.c b/libsoup/soup-connection.c
index 51ae2deb..3e52da6d 100644
--- a/libsoup/soup-connection.c
+++ b/libsoup/soup-connection.c
@@ -32,6 +32,7 @@ typedef struct {
gboolean ssl;
SoupMessage *current_msg;
+ SoupClientMessageIOData *io_data;
SoupConnectionState state;
time_t unused_timeout;
GSource *idle_timeout_src;
@@ -84,6 +85,7 @@ soup_connection_finalize (GObject *object)
g_clear_pointer (&priv->proxy_uri, g_uri_unref);
g_clear_pointer (&priv->socket_props, soup_socket_properties_unref);
+ g_clear_pointer (&priv->io_data, soup_client_message_io_data_free);
g_clear_object (&priv->remote_connectable);
g_clear_object (&priv->current_msg);
@@ -893,6 +895,9 @@ soup_connection_steal_iostream (SoupConnection *conn)
g_object_ref (socket), g_object_unref);
g_clear_object (&priv->connection);
+ if (priv->io_data)
+ soup_client_message_io_stolen (priv->io_data);
+
return iostream;
}
@@ -1025,26 +1030,34 @@ soup_connection_get_ever_used (SoupConnection *conn)
return priv->unused_timeout == 0;
}
-void
-soup_connection_send_request (SoupConnection *conn,
- SoupMessageQueueItem *item,
- SoupMessageIOCompletionFn completion_cb,
- gpointer user_data)
+SoupClientMessageIOData *
+soup_connection_setup_message_io (SoupConnection *conn,
+ SoupMessage *msg)
{
- SoupConnectionPrivate *priv;
+ SoupConnectionPrivate *priv = soup_connection_get_instance_private (conn);
- g_return_if_fail (SOUP_IS_CONNECTION (conn));
- g_return_if_fail (item != NULL);
- priv = soup_connection_get_instance_private (conn);
- g_return_if_fail (priv->state != SOUP_CONNECTION_NEW &&
- priv->state != SOUP_CONNECTION_DISCONNECTED);
+ g_assert (priv->state != SOUP_CONNECTION_NEW &&
+ priv->state != SOUP_CONNECTION_DISCONNECTED);
+
+ if (priv->current_msg != msg)
+ set_current_msg (conn, msg);
+ else
+ priv->reusable = FALSE;
- if (item->msg != priv->current_msg)
- set_current_msg (conn, item->msg);
- else
- priv->reusable = FALSE;
+ g_assert (priv->io_data == NULL);
+ priv->io_data = soup_client_message_io_data_new (priv->iostream);
+
+ return priv->io_data;
+}
+
+void
+soup_connection_message_io_finished (SoupConnection *conn,
+ SoupMessage *msg)
+{
+ SoupConnectionPrivate *priv = soup_connection_get_instance_private (conn);
- soup_message_send_request (item, completion_cb, user_data);
+ g_assert (priv->current_msg == msg);
+ g_clear_pointer (&priv->io_data, soup_client_message_io_data_free);
}
GTlsCertificate *
diff --git a/libsoup/soup-connection.h b/libsoup/soup-connection.h
index 97f216b6..bc0550d9 100644
--- a/libsoup/soup-connection.h
+++ b/libsoup/soup-connection.h
@@ -65,10 +65,10 @@ void soup_connection_set_reusable (SoupConnection *conn,
gboolean soup_connection_get_ever_used (SoupConnection *conn);
-void soup_connection_send_request (SoupConnection *conn,
- SoupMessageQueueItem *item,
- SoupMessageIOCompletionFn completion_cb,
- gpointer user_data);
+SoupClientMessageIOData *soup_connection_setup_message_io (SoupConnection *conn,
+ SoupMessage *msg);
+void soup_connection_message_io_finished (SoupConnection *conn,
+ SoupMessage *msg);
GTlsCertificate *soup_connection_get_tls_certificate (SoupConnection *conn);
GTlsCertificateFlags soup_connection_get_tls_certificate_errors (SoupConnection *conn);
diff --git a/libsoup/soup-message-io.c b/libsoup/soup-message-io.c
index 68b437e5..937cd19d 100644
--- a/libsoup/soup-message-io.c
+++ b/libsoup/soup-message-io.c
@@ -67,16 +67,12 @@ soup_client_message_io_data_get_priority (SoupClientMessageIOData *io)
}
void
-soup_message_io_finished (SoupMessage *msg)
+soup_client_message_io_finished (SoupClientMessageIOData *io)
{
- SoupClientMessageIOData *io;
SoupMessageIOCompletionFn completion_cb;
gpointer completion_data;
SoupMessageIOCompletion completion;
-
- io = soup_message_get_io_data (msg);
- if (!io)
- return;
+ SoupMessage *msg;
completion_cb = io->base.completion_cb;
completion_data = io->base.completion_data;
@@ -87,29 +83,25 @@ soup_message_io_finished (SoupMessage *msg)
else
completion = SOUP_MESSAGE_IO_INTERRUPTED;
- g_object_ref (msg);
- soup_message_set_io_data (msg, NULL);
+ msg = g_object_ref (io->item->msg);
+ soup_connection_message_io_finished (io->item->conn, msg);
if (completion_cb)
completion_cb (G_OBJECT (msg), completion, completion_data);
g_object_unref (msg);
}
void
-soup_message_io_stolen (SoupMessage *msg)
+soup_client_message_io_stolen (SoupClientMessageIOData *io)
{
- SoupClientMessageIOData *io;
SoupMessageIOCompletionFn completion_cb;
gpointer completion_data;
-
- io = soup_message_get_io_data (msg);
- if (!io)
- return;
+ SoupMessage *msg;
completion_cb = io->base.completion_cb;
completion_data = io->base.completion_data;
- g_object_ref (msg);
- soup_message_set_io_data (msg, NULL);
+ msg = g_object_ref (io->item->msg);
+ soup_connection_message_io_finished (io->item->conn, msg);
if (completion_cb)
completion_cb (G_OBJECT (msg), SOUP_MESSAGE_IO_STOLEN, completion_data);
g_object_unref (msg);
@@ -1021,27 +1013,15 @@ soup_message_io_get_response_istream (SoupMessage *msg,
}
void
-soup_message_send_request (SoupMessageQueueItem *item,
- SoupMessageIOCompletionFn completion_cb,
- gpointer user_data)
+soup_client_message_io_data_send_item (SoupClientMessageIOData *io,
+ SoupMessageQueueItem *item,
+ SoupMessageIOCompletionFn completion_cb,
+ gpointer user_data)
{
- SoupClientMessageIOData *io;
-
- io = g_slice_new0 (SoupClientMessageIOData);
+ io->item = soup_message_queue_item_ref (item);
io->base.completion_cb = completion_cb;
io->base.completion_data = user_data;
- io->item = soup_message_queue_item_ref (item);
- io->base.iostream = g_object_ref (soup_connection_get_iostream (io->item->conn));
- io->base.istream = SOUP_FILTER_INPUT_STREAM (g_io_stream_get_input_stream (io->base.iostream));
- io->base.ostream = g_io_stream_get_output_stream (io->base.iostream);
-
- io->base.read_header_buf = g_byte_array_new ();
- io->base.write_buf = g_string_new (NULL);
-
- io->base.read_state = SOUP_MESSAGE_IO_STATE_NOT_STARTED;
- io->base.write_state = SOUP_MESSAGE_IO_STATE_HEADERS;
-
io->metrics = soup_message_get_metrics (io->item->msg);
if (io->metrics) {
g_signal_connect_object (io->base.istream, "read-data",
@@ -1052,8 +1032,25 @@ soup_message_send_request (SoupMessageQueueItem *item,
#ifdef HAVE_SYSPROF
io->begin_time_nsec = SYSPROF_CAPTURE_CURRENT_TIME;
#endif
+}
+
+SoupClientMessageIOData *
+soup_client_message_io_data_new (GIOStream *stream)
+{
+ SoupClientMessageIOData *io;
+
+ io = g_slice_new0 (SoupClientMessageIOData);
+ io->base.iostream = g_object_ref (stream);
+ io->base.istream = SOUP_FILTER_INPUT_STREAM (g_io_stream_get_input_stream (io->base.iostream));
+ io->base.ostream = g_io_stream_get_output_stream (io->base.iostream);
+
+ io->base.read_header_buf = g_byte_array_new ();
+ io->base.write_buf = g_string_new (NULL);
+
+ io->base.read_state = SOUP_MESSAGE_IO_STATE_NOT_STARTED;
+ io->base.write_state = SOUP_MESSAGE_IO_STATE_HEADERS;
- soup_message_set_io_data (io->item->msg, io);
+ return io;
}
void
diff --git a/libsoup/soup-message-private.h b/libsoup/soup-message-private.h
index 05e0dcc9..10dd232a 100644
--- a/libsoup/soup-message-private.h
+++ b/libsoup/soup-message-private.h
@@ -33,9 +33,10 @@ typedef guint (*SoupMessageParseHeadersFn)(SoupMessage *msg,
gpointer user_data,
GError **error);
-void soup_message_send_request (SoupMessageQueueItem *item,
- SoupMessageIOCompletionFn completion_cb,
- gpointer user_data);
+void soup_message_send_item (SoupMessage *msg,
+ SoupMessageQueueItem *item,
+ SoupMessageIOCompletionFn completion_cb,
+ gpointer user_data);
/* Auth handling */
void soup_message_set_auth (SoupMessage *msg,
@@ -47,6 +48,13 @@ SoupAuth *soup_message_get_proxy_auth (SoupMessage *msg);
GUri *soup_message_get_uri_for_auth (SoupMessage *msg);
/* I/O */
+SoupClientMessageIOData *soup_client_message_io_data_new (GIOStream *stream);
+void soup_client_message_io_data_send_item (SoupClientMessageIOData *io,
+ SoupMessageQueueItem *item,
+ SoupMessageIOCompletionFn completion_cb,
+ gpointer user_data);
+void soup_client_message_io_finished (SoupClientMessageIOData *io);
+void soup_client_message_io_stolen (SoupClientMessageIOData *io);
void soup_message_io_run (SoupMessage *msg,
gboolean blocking);
void soup_message_io_finished (SoupMessage *msg);
@@ -55,7 +63,6 @@ void soup_message_io_pause (SoupMessage *msg);
void soup_message_io_unpause (SoupMessage *msg);
gboolean soup_message_is_io_paused (SoupMessage *msg);
gboolean soup_message_io_in_progress (SoupMessage *msg);
-void soup_message_io_stolen (SoupMessage *msg);
gboolean soup_message_io_read_headers (SoupMessage *msg,
SoupFilterInputStream *stream,
@@ -123,8 +130,6 @@ void soup_message_set_connection (SoupMessage *msg,
SoupConnection *conn);
SoupClientMessageIOData *soup_message_get_io_data (SoupMessage *msg);
-void soup_message_set_io_data (SoupMessage *msg,
- SoupClientMessageIOData *io);
SoupContentSniffer *soup_message_get_content_sniffer (SoupMessage *msg);
void soup_message_set_content_sniffer (SoupMessage *msg,
diff --git a/libsoup/soup-message.c b/libsoup/soup-message.c
index 87adc6f4..6a1add94 100644
--- a/libsoup/soup-message.c
+++ b/libsoup/soup-message.c
@@ -166,8 +166,6 @@ soup_message_finalize (GObject *object)
soup_message_set_connection (msg, NULL);
- soup_client_message_io_data_free (priv->io_data);
-
g_clear_pointer (&priv->uri, g_uri_unref);
g_clear_pointer (&priv->first_party, g_uri_unref);
g_clear_pointer (&priv->site_for_cookies, g_uri_unref);
@@ -1391,6 +1389,7 @@ soup_message_set_connection (SoupMessage *msg,
if (priv->connection) {
g_signal_handlers_disconnect_by_data (priv->connection, msg);
+ priv->io_data = NULL;
g_object_remove_weak_pointer (G_OBJECT (priv->connection), (gpointer*)&priv->connection);
}
@@ -2145,13 +2144,28 @@ soup_message_get_io_data (SoupMessage *msg)
}
void
-soup_message_set_io_data (SoupMessage *msg,
- SoupClientMessageIOData *io)
+soup_message_io_finished (SoupMessage *msg)
{
- SoupMessagePrivate *priv = soup_message_get_instance_private (msg);
+ SoupMessagePrivate *priv = soup_message_get_instance_private (msg);
+
+ if (!priv->io_data)
+ return;
+
+ g_assert (priv->connection != NULL);
+ soup_client_message_io_finished (g_steal_pointer (&priv->io_data));
+}
+
+void
+soup_message_send_item (SoupMessage *msg,
+ SoupMessageQueueItem *item,
+ SoupMessageIOCompletionFn completion_cb,
+ gpointer user_data)
+{
+ SoupMessagePrivate *priv = soup_message_get_instance_private (msg);
- soup_client_message_io_data_free (priv->io_data);
- priv->io_data = io;
+ priv->io_data = soup_connection_setup_message_io (priv->connection, msg);
+ soup_client_message_io_data_send_item (priv->io_data, item,
+ completion_cb, user_data);
}
SoupContentSniffer *
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index 393f01f1..d307d230 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -1431,7 +1431,7 @@ soup_session_send_queue_item (SoupSession *session,
soup_message_starting (item->msg);
if (item->state == SOUP_MESSAGE_RUNNING)
- soup_connection_send_request (item->conn, item, completion_cb, item);
+ soup_message_send_item (item->msg, item, completion_cb, item);
}
static gboolean
@@ -3625,15 +3625,12 @@ steal_connection (SoupSession *session,
GIOStream *stream;
conn = g_object_ref (item->conn);
- soup_session_set_item_connection (session, item, NULL);
-
host = get_host_for_message (session, item->msg);
g_hash_table_remove (priv->conns, conn);
drop_connection (session, host, conn);
stream = soup_connection_steal_iostream (conn);
- if (!item->connect_only)
- soup_message_io_stolen (item->msg);
+ soup_session_set_item_connection (session, item, NULL);
g_object_unref (conn);
return stream;