[Spice-devel] [spice-server v2 2/3] channel: Remove red_channel_client_disconnect_if_pending_send()

Christophe Fergeau cfergeau at redhat.com
Tue Sep 12 14:15:03 UTC 2017


There is exactly one user in RedChannel, and this can be reimplemented
using already public RedChannelClient API. No need for an extra
function very specialized function with a not great name.

This commit thus removes one method from RedChannelClient public API,
and replaces it with an equivalent private helper in RedChannel.

Signed-off-by: Christophe Fergeau <cfergeau at redhat.com>
---
Changes since v1
- use FOREACH_CLIENT
- slightly better commit log

 server/red-channel-client.c |  9 ---------
 server/red-channel-client.h |  1 -
 server/red-channel.c        | 15 ++++++++++++++-
 3 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/server/red-channel-client.c b/server/red-channel-client.c
index 34202c492..8f7308628 100644
--- a/server/red-channel-client.c
+++ b/server/red-channel-client.c
@@ -1848,15 +1848,6 @@ bool red_channel_client_wait_outgoing_item(RedChannelClient *rcc,
     }
 }
 
-void red_channel_client_disconnect_if_pending_send(RedChannelClient *rcc)
-{
-    if (red_channel_client_is_blocked(rcc) || !g_queue_is_empty(&rcc->priv->pipe)) {
-        red_channel_client_disconnect(rcc);
-    } else {
-        spice_assert(red_channel_client_no_item_being_sent(rcc));
-    }
-}
-
 gboolean red_channel_client_no_item_being_sent(RedChannelClient *rcc)
 {
     return !rcc || (rcc->priv->send_data.size == 0);
diff --git a/server/red-channel-client.h b/server/red-channel-client.h
index f5e04df78..732fbdd59 100644
--- a/server/red-channel-client.h
+++ b/server/red-channel-client.h
@@ -143,7 +143,6 @@ bool red_channel_client_wait_pipe_item_sent(RedChannelClient *rcc,
                                             int64_t timeout);
 bool red_channel_client_wait_outgoing_item(RedChannelClient *rcc,
                                            int64_t timeout);
-void red_channel_client_disconnect_if_pending_send(RedChannelClient *rcc);
 
 RedChannel* red_channel_client_get_channel(RedChannelClient *rcc);
 
diff --git a/server/red-channel.c b/server/red-channel.c
index c24b97722..b8f4f54e8 100644
--- a/server/red-channel.c
+++ b/server/red-channel.c
@@ -627,6 +627,19 @@ uint32_t red_channel_sum_pipes_size(RedChannel *channel)
     return sum;
 }
 
+static void red_channel_disconnect_if_pending_send(RedChannel *channel)
+{
+    RedChannelClient *rcc;
+
+    FOREACH_CLIENT(channel, rcc) {
+        if (red_channel_client_is_blocked(rcc) || !red_channel_client_pipe_is_empty(rcc)) {
+            red_channel_client_disconnect(rcc);
+        } else {
+            spice_assert(red_channel_client_no_item_being_sent(rcc));
+        }
+    }
+}
+
 bool red_channel_wait_all_sent(RedChannel *channel,
                                int64_t timeout)
 {
@@ -654,7 +667,7 @@ bool red_channel_wait_all_sent(RedChannel *channel,
     if (max_pipe_size || blocked) {
         spice_warning("timeout: pending out messages exist (pipe-size %u, blocked %d)",
                       max_pipe_size, blocked);
-        red_channel_apply_clients(channel, red_channel_client_disconnect_if_pending_send);
+        red_channel_disconnect_if_pending_send(channel);
         return FALSE;
     } else {
         spice_assert(red_channel_no_item_being_sent(channel));
-- 
2.13.5



More information about the Spice-devel mailing list