[libsoup/carlosgc/io-data-ownership: 8/9] Move message io data ownership to SoupConnection




commit f575c34bd01d52aa28295f2b3d3c9480f20c9f36
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Tue Apr 20 13:30:37 2021 +0200

    Move message io data ownership to SoupConnection

 libsoup/soup-connection.c      | 45 ++++++++++++++++++-----------
 libsoup/soup-connection.h      |  8 +++---
 libsoup/soup-message-io.c      | 65 ++++++++++++++++++++----------------------
 libsoup/soup-message-private.h | 17 +++++++----
 libsoup/soup-message.c         | 28 +++++++++++++-----
 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 7a71abf3..4fdb5b4d 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);
@@ -1027,27 +1019,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",
@@ -1058,8 +1038,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 7ef6509e..c39ad4b8 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 ba482168..34d11c5f 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -1429,7 +1429,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
@@ -3619,15 +3619,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;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]