diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2021-04-20 13:30:37 +0200 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2021-04-20 13:30:37 +0200 |
commit | 3e697251e36a67b33c91f9b8d34161a1d45a32a1 (patch) | |
tree | d1f915eea5f8a9048a892c98ccf0a02ee50a3d4c | |
parent | bbe245141742cee0b557fb9c3b1897a50f040b6b (diff) | |
download | libsoup-carlosgc/io-data-ownership.tar.gz |
Move message io data ownership to SoupConnectioncarlosgc/io-data-ownership
-rw-r--r-- | libsoup/soup-connection.c | 45 | ||||
-rw-r--r-- | libsoup/soup-connection.h | 8 | ||||
-rw-r--r-- | libsoup/soup-message-io.c | 65 | ||||
-rw-r--r-- | libsoup/soup-message-private.h | 17 | ||||
-rw-r--r-- | libsoup/soup-message.c | 28 | ||||
-rw-r--r-- | libsoup/soup-session.c | 7 |
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; |