[Spice-devel] [PATCH spice-gtk 5/9] Make sure spice_channel_iterate_write() always flushes *all* pending writes

Hans de Goede hdegoede at redhat.com
Wed Dec 14 06:14:05 PST 2011

This patch changes 1 line, and fixes 2 bugs in this one line:
1) We keep the xmit_buffer around for reuse (re-filling) later, so checking
   if we've a xmit_buffer to determine wether we should do a write is wrong,
   instead we should check if the xmit_buffer has data in it.
2) If the write blocks, and we switch to another co-routine context, this
   context may queue more writes, we check for this and throw away the
   buffer we've been consuming when this happens, since the other context
   will then have allocated a new buffer. But when this happens, we do *not*
   consume the new buffer. So the queued data will not get transmitted
   until the co-routine gets woken up by either another write, or by
   receiving data to read.
   This patch fixes this by changing the if to a while.

Note that the code in question gets completely removed by the next patch in
this series. As I noticed this while rewriting the code in question, still
I decided to do a separate patch to fix this to:
1) Document this issue in the old code
2) Otherwise the move from the if to the while will happen in the new code
   which may confuse readers of that patch.

Signed-off-by: Hans de Goede <hdegoede at redhat.com>
 gtk/spice-channel.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/gtk/spice-channel.c b/gtk/spice-channel.c
index 8ea5a3b..6a21831 100644
--- a/gtk/spice-channel.c
+++ b/gtk/spice-channel.c
@@ -1807,7 +1807,7 @@ static void spice_channel_iterate_write(SpiceChannel *channel)
     SpiceChannelPrivate *c = channel->priv;
-    if (c->xmit_buffer) {
+    while (c->xmit_buffer_size) {
          * Take ownership of the buffer, so that if spice_channel_write calls
          * g_io_wait and thus yields to the main context, and that then calls

More information about the Spice-devel mailing list