[Spice-devel] [PATCH spice v3 2/2] reds: Simplify vdi_port_read_buf_process
Frediano Ziglio
fziglio at redhat.com
Fri Sep 16 11:22:07 UTC 2016
>
> Reuse and handle the return value from agent_msg_filter_process_data
> ---
> v3: discard AGENT_MSG_FILTER_MONITORS_CONFIG
> ---
> server/reds.c | 66
> ++++++++++++++++++++++++++---------------------------------
> 1 file changed, 29 insertions(+), 37 deletions(-)
>
> diff --git a/server/reds.c b/server/reds.c
> index 3addc1e..8e9dc7b 100644
> --- a/server/reds.c
> +++ b/server/reds.c
> @@ -763,36 +763,23 @@ 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 the #AgentMsgFilterResult value:
> + AGENT_MSG_FILTER_OK if the buffer can be forwarded,
> + AGENT_MSG_FILTER_PROTO_ERROR on error
> + other values can be discarded
> +*/
> +static AgentMsgFilterResult vdi_port_read_buf_process(RedCharDeviceVDIPort
> *dev,
> + RedVDIReadBuf *buf)
> {
> - AgentMsgFilterResult 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_MONITORS_CONFIG:
> - /* fall through */
> - 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;
> }
> }
>
> @@ -883,7 +870,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;
> @@ -902,12 +888,15 @@ 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);
> - }
> + case AGENT_MSG_FILTER_PROTO_ERROR:
> + reds_agent_remove(reds);
> + /* fall through */
> + case AGENT_MSG_FILTER_MONITORS_CONFIG:
> + /* fall through */
> + case AGENT_MSG_FILTER_DISCARD:
> red_pipe_item_unref(&dispatch_buf->base);
> }
> }
> @@ -1277,22 +1266,25 @@ 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;
> + case AGENT_MSG_FILTER_PROTO_ERROR:
> + reds_agent_remove(reds);
> + /* fall through */
> + case AGENT_MSG_FILTER_MONITORS_CONFIG:
> + /* fall through */
> + case AGENT_MSG_FILTER_DISCARD:
> red_pipe_item_unref(&read_buf->base);
> }
>
Acked-by: Frediano Ziglio <fziglio at redhat.com>
Frediano
More information about the Spice-devel
mailing list