[Spice-devel] [PATCH spice-server 09/10] red-channel-client: Simplify red_channel_client_wait_pipe_item_sent

Frediano Ziglio fziglio at redhat.com
Tue Sep 12 12:30:40 UTC 2017


> 
> On Mon, Sep 11, 2017 at 11:15:46AM +0100, Frediano Ziglio wrote:
> > Instead of inserting the marker after the item (the tail of the queue
> > is the first item to send) and then have to wait again if for
> > the specific item place the marker before the item so waiting for
> > the marker to be sent assure that we sent also the item.
> > This avoids having to call red_channel_client_wait_outgoing_item
> > and possibly the case where the item was not queued and
> > red_channel_client_wait_outgoing_item returning TRUE even if
> > the item was not sent as required.
> 
> As usual, I'd rework a bit the commit log (more punctuation/new lines, more
> accurate references to typenames/variable names, ..):
> 
> "Currently, red_channel_client_wait_pipe_item_sent() inserts a MarkerItem
> which
> will sent before the item we want to wait for: the tail of the queue is
> the first item to send, and the function uses
> red_channel_client_pipe_add_before_pos(). Then, if the marker has been

I think here should be red_channel_client_pipe_add_after_pos.

> successfully sent, the function calls red_channel_client_wait_outgoing_item
> to wait for 'item' to be sent.
> 
> Instead of doing this, we can add the MarkerItem to the queue so that
> it's sent after 'item' (ie, insert it _before_ 'item' in the queue).
> This way, when the marker is marked as having been sent, we'll also know
> that 'item' has been sent.
> 
> This avoids having to call red_channel_client_wait_outgoing_item
> and possibly the case where the item was not queued and
> red_channel_client_wait_outgoing_item returning TRUE even if
> the item was not sent as required."
> 

Other part is perfect.

> I believe the way this function works now is a result of the last hunk of
> https://cgit.freedesktop.org/spice/spice/commit/?id=c59b2884a2f7fc953fdb263085830b65e8bdcaef
> + the introduction of MarkerItem (I guess when switching to using a
> GQueue).
> 

Not sure... looks like the patch you are referring is doing something else.

> Acked-by: Christophe Fergeau <cfergeau at redhat.com>
> 
> Christophe
> 

Frediano

> > Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> > ---
> >  server/red-channel-client.c | 19 +++++++++++++++----
> >  1 file changed, 15 insertions(+), 4 deletions(-)
> > 
> > diff --git a/server/red-channel-client.c b/server/red-channel-client.c
> > index f0a25ecfd..d9333ba6f 100644
> > --- a/server/red-channel-client.c
> > +++ b/server/red-channel-client.c
> > @@ -1569,6 +1569,19 @@ void
> > red_channel_client_pipe_add_after_pos(RedChannelClient *rcc,
> >      g_queue_insert_after(&rcc->priv->pipe, pipe_item_pos, item);
> >  }
> >  
> > +static void
> > +red_channel_client_pipe_add_before_pos(RedChannelClient *rcc,
> > +                                       RedPipeItem *item,
> > +                                       GList *pipe_item_pos)
> > +{
> > +    spice_assert(pipe_item_pos);
> > +    if (!prepare_pipe_add(rcc, item)) {
> > +        return;
> > +    }
> > +
> > +    g_queue_insert_before(&rcc->priv->pipe, pipe_item_pos, item);
> > +}
> > +
> >  void red_channel_client_pipe_add_after(RedChannelClient *rcc,
> >                                         RedPipeItem *item,
> >                                         RedPipeItem *pos)
> > @@ -1779,7 +1792,7 @@ bool
> > red_channel_client_wait_pipe_item_sent(RedChannelClient *rcc,
> >      red_pipe_item_init(&mark_item->base, RED_PIPE_ITEM_TYPE_MARKER);
> >      mark_item->item_in_pipe = true;
> >      red_pipe_item_ref(&mark_item->base);
> > -    red_channel_client_pipe_add_after_pos(rcc, &mark_item->base,
> > item_pos);
> > +    red_channel_client_pipe_add_before_pos(rcc, &mark_item->base,
> > item_pos);
> >  
> >      for (;;) {
> >          red_channel_client_receive(rcc);
> > @@ -1799,10 +1812,8 @@ bool
> > red_channel_client_wait_pipe_item_sent(RedChannelClient *rcc,
> >          // still on the queue
> >          spice_warning("timeout");
> >          return FALSE;
> > -    } else {
> > -        return red_channel_client_wait_outgoing_item(rcc,
> > -                                                     timeout == -1 ? -1 :
> > end_time - spice_get_monotonic_time_ns());
> >      }
> > +    return TRUE;
> >  }
> >  
> >  bool red_channel_client_wait_outgoing_item(RedChannelClient *rcc,
> > --
> > 2.13.5
> > 
> > _______________________________________________
> > Spice-devel mailing list
> > Spice-devel at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/spice-devel
> 


More information about the Spice-devel mailing list