Currently, red_char_device_reset() stops the device, clears all pending messages, and clears its device instance. After this function is called, the char device will not work again until it is assigned a new device instance and restarted. This is fine for the vdagent char device, which is currently the only user of this function. But for the stream device, we want to be able to reset the char device to a working state (e.g. clear all pending messages, etc) without stopping or disabling the char device. So this function will now only reset the char device to a clean working state, and the _stop() and _reset_dev_instance() calls will be moved up to the caller. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- server/char-device.c | 2 -- server/reds.c | 6 +++++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/server/char-device.c b/server/char-device.c index 658f9f36..f8a098bd 100644 --- a/server/char-device.c +++ b/server/char-device.c @@ -823,7 +823,6 @@ void red_char_device_reset(RedCharDevice *dev) GList *client_item; RedCharDeviceWriteBuffer *buf; - red_char_device_stop(dev); dev->priv->wait_for_migrate_data = FALSE; spice_debug("char device %p", dev); while ((buf = g_queue_pop_tail(&dev->priv->write_queue))) { @@ -845,7 +844,6 @@ void red_char_device_reset(RedCharDevice *dev) dev_client->num_client_tokens += dev_client->num_client_tokens_free; dev_client->num_client_tokens_free = 0; } - red_char_device_reset_dev_instance(dev, NULL); } void red_char_device_wakeup(RedCharDevice *dev) diff --git a/server/reds.c b/server/reds.c index 1a50a4fd..7db674a3 100644 --- a/server/reds.c +++ b/server/reds.c @@ -440,6 +440,7 @@ static void reds_reset_vdp(RedsState *reds) { RedCharDeviceVDIPort *dev = reds->agent_dev; SpiceCharDeviceInterface *sif; + RedCharDevice *char_dev; dev->priv->read_state = VDI_PORT_READ_STATE_READ_HEADER; dev->priv->receive_pos = (uint8_t *)&dev->priv->vdi_chunk_header; @@ -472,7 +473,10 @@ static void reds_reset_vdp(RedsState *reds) * The tokens are also reset to avoid mismatch in upon agent reconnection. */ dev->priv->agent_attached = FALSE; - red_char_device_reset(RED_CHAR_DEVICE(dev)); + char_dev = RED_CHAR_DEVICE(dev); + red_char_device_stop(char_dev); + red_char_device_reset(char_dev); + red_char_device_reset_dev_instance(char_dev, NULL); sif = spice_char_device_get_interface(reds->vdagent); if (sif->state) { -- 2.13.5 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel