[Spice-devel] [PATCH spice 2/2] reds: Refactor agent message forwarding
Pavel Grunt
pgrunt at redhat.com
Mon Sep 12 12:58:32 UTC 2016
On Mon, 2016-09-12 at 08:38 -0400, Frediano Ziglio wrote:
> I think the rationale of this is to remove the error return
> parameter and
> make vdi_port_read_buf_process easier/shorter.
Yes, also I have some patches which will make use of the return value
>
> >
> > ---
> > server/reds.c | 55 ++++++++++++++++++++------------------------
> > -----------
> > 1 file changed, 20 insertions(+), 35 deletions(-)
> >
> > diff --git a/server/reds.c b/server/reds.c
> > index 800107b..a13a14a 100644
> > --- a/server/reds.c
> > +++ b/server/reds.c
> > @@ -763,34 +763,18 @@ static void
> > vdi_port_read_buf_release(uint8_t *data,
> > void *opaque)
> > red_pipe_item_unref((RedPipeItem *)opaque);
> > }
> >
> > -/* returns TRUE if the buffer can be forwarded */
> > -static gboolean vdi_port_read_buf_process(RedCharDeviceVDIPort
> > *dev,
> > - RedVDIReadBuf *buf,
> > gboolean
> > *error)
> > +/* returns AGENT_MSG_FILTER_OK if the buffer can be forwarded,
> > + AGENT_MSG_FILTER_PROTO_ERROR on error */
>
>
> Why AGENT_MSG_FILTER_DISCARD is not documented ?
Sorry, fixed locally
>
> > +static int vdi_port_read_buf_process(RedCharDeviceVDIPort *dev,
> > RedVDIReadBuf *buf)
>
>
> Don't we have an enum for this return instead of using int ?
Sure, I will change it - I got inspired by
"agent_msg_filter_process_data" which also returns int
>
> enum {
> AGENT_MSG_FILTER_OK,
> AGENT_MSG_FILTER_DISCARD,
> AGENT_MSG_FILTER_PROTO_ERROR,
> AGENT_MSG_FILTER_MONITORS_CONFIG,
> AGENT_MSG_FILTER_END
> };
>
> mumble... weird enum. Beside AGENT_MSG_FILTER_END which is
> not used there is OK but also a AGENT_MSG_FILTER_MONITORS_CONFIG
> which I suppose it's OK too... but this is not related to this
> patch.
>
> > {
> > - int res;
> > -
> > - *error = FALSE;
> > -
> > switch (dev->priv->vdi_chunk_header.port) {
> > - case VDP_CLIENT_PORT: {
> > - res = agent_msg_filter_process_data(&dev->priv-
> > >read_filter,
> > - buf->data, buf->len);
> > - switch (res) {
> > - case AGENT_MSG_FILTER_OK:
> > - return TRUE;
> > - case AGENT_MSG_FILTER_DISCARD:
> > - return FALSE;
> > - case AGENT_MSG_FILTER_PROTO_ERROR:
> > - *error = TRUE;
> > - return FALSE;
> > - }
> > - }
> > + case VDP_CLIENT_PORT:
> > + return agent_msg_filter_process_data(&dev->priv-
> > >read_filter,
> > buf->data, buf->len);
> > case VDP_SERVER_PORT:
> > - return FALSE;
> > + return AGENT_MSG_FILTER_DISCARD;
> > default:
> > spice_warning("invalid port");
> > - *error = TRUE;
> > - return FALSE;
> > + return AGENT_MSG_FILTER_PROTO_ERROR;
> > }
> > }
> >
> > @@ -881,7 +865,6 @@ static RedPipeItem
> > *vdi_port_read_one_msg_from_device(SpiceCharDeviceInstance *s
> > dev->priv->read_state =
> > VDI_PORT_READ_STATE_READ_DATA;
> > }
> > case VDI_PORT_READ_STATE_READ_DATA: {
> > - gboolean error = FALSE;
> > n = sif->read(reds->vdagent, dev->priv->receive_pos,
> > dev->priv->receive_len);
> > if (!n) {
> > return NULL;
> > @@ -900,12 +883,13 @@ static RedPipeItem
> > *vdi_port_read_one_msg_from_device(SpiceCharDeviceInstance *s
> > } else {
> > dev->priv->read_state =
> > VDI_PORT_READ_STATE_GET_BUFF;
> > }
> > - if (vdi_port_read_buf_process(reds->agent_dev,
> > dispatch_buf,
> > &error)) {
> > + switch (vdi_port_read_buf_process(reds->agent_dev,
> > dispatch_buf)) {
> > + case AGENT_MSG_FILTER_OK:
> > return &dispatch_buf->base;
> > - } else {
> > - if (error) {
> > - reds_agent_remove(reds);
> > - }
> > + default:
> > + case AGENT_MSG_FILTER_PROTO_ERROR:
> > + reds_agent_remove(reds);
>
>
> I would add a fall through comment here, at least to make some
> automatic tools more happy.
Do you mean some comment which is recognized by the automatic tools ?
Can you give an example ?
>
> > + case AGENT_MSG_FILTER_DISCARD:
> > red_pipe_item_unref(&dispatch_buf->base);
> > }
> > }
> > @@ -1275,22 +1259,23 @@ void
> > reds_on_main_channel_migrate(RedsState *reds,
> > MainChannelClient *mcc)
> > if (agent_dev->priv->read_filter.msg_data_to_read ||
> > read_data_len > sizeof(VDAgentMessage)) { /* msg header
> > has been
> > read */
> > RedVDIReadBuf *read_buf = agent_dev->priv-
> > >current_read_buf;
> > - gboolean error = FALSE;
> >
> > spice_debug("push partial read %u (msg first chunk? %d)",
> > read_data_len,
> > !agent_dev->priv-
> > >read_filter.msg_data_to_read);
> >
> > read_buf->len = read_data_len;
> > - if (vdi_port_read_buf_process(reds->agent_dev, read_buf,
> > &error)) {
> > + switch (vdi_port_read_buf_process(reds->agent_dev,
> > read_buf)) {
> > + case AGENT_MSG_FILTER_OK:
> > main_channel_client_push_agent_data(mcc,
> > read_buf->data,
> > read_buf->len,
> > vdi_port_read_buf
> > _release,
> > read_buf);
> > - } else {
> > - if (error) {
> > - reds_agent_remove(reds);
> > - }
> > + break;
> > + default:
> > + case AGENT_MSG_FILTER_PROTO_ERROR:
> > + reds_agent_remove(reds);
> > + case AGENT_MSG_FILTER_DISCARD:
> > red_pipe_item_unref(&read_buf->base);
> > }
> >
>
>
> Looks like copy&paste
I can use some macro to avoid it
> but this is not a regression, caller code of
> vdi_port_read_buf_process were very similar even before.
yes
>
> Frediano
Thanks,
Pavel
More information about the Spice-devel
mailing list