[Spice-devel] [RFC PATCH spice-server v5 16/22] stream-device: Create channel when needed

Jonathon Jongsma jjongsma at redhat.com
Fri Sep 1 21:32:50 UTC 2017


Acked-by: Jonathon Jongsma <jjongsma at redhat.com>


On Wed, 2017-08-30 at 16:28 +0100, Frediano Ziglio wrote:
> This allows a better id allocation as devices are created after
> fixed ones.
> Also will allow to support more easily multiple monitor.
> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  server/stream-device.c | 38 ++++++++++++++++++++++++++++++++------
>  1 file changed, 32 insertions(+), 6 deletions(-)
> 
> diff --git a/server/stream-device.c b/server/stream-device.c
> index 9e401f8e..ae108788 100644
> --- a/server/stream-device.c
> +++ b/server/stream-device.c
> @@ -72,7 +72,7 @@ stream_device_read_msg_from_dev(RedCharDevice
> *self, SpiceCharDeviceInstance *si
>      int n;
>      bool handled = false;
>  
> -    if (dev->has_error) {
> +    if (dev->has_error || !dev->stream_channel) {
>          return NULL;
>      }
>  
> @@ -238,11 +238,7 @@ stream_device_connect(RedsState *reds,
> SpiceCharDeviceInstance *sin)
>  {
>      SpiceCharDeviceInterface *sif;
>  
> -    StreamChannel *stream_channel = stream_channel_new(reds, 1); //
> TODO id
> -
>      StreamDevice *dev = stream_device_new(sin, reds);
> -    dev->stream_channel = stream_channel;
> -    stream_channel_register_start_cb(stream_channel,
> stream_device_stream_start, dev);
>  
>      sif = spice_char_device_get_interface(sin);
>      if (sif->state) {
> @@ -265,6 +261,33 @@ stream_device_dispose(GObject *object)
>  }
>  
>  static void
> +allocate_channels(StreamDevice *dev)
> +{
> +    if (dev->stream_channel) {
> +        return;
> +    }
> +
> +    SpiceServer* reds =
> red_char_device_get_server(RED_CHAR_DEVICE(dev));
> +
> +    int id = reds_get_free_channel_id(reds, SPICE_CHANNEL_DISPLAY);
> +    g_return_if_fail(id >= 0);
> +
> +    StreamChannel *stream_channel = stream_channel_new(reds, id);
> +
> +    dev->stream_channel = stream_channel;
> +
> +    stream_channel_register_start_cb(stream_channel,
> stream_device_stream_start, dev);
> +}
> +
> +static void
> +reset_channels(StreamDevice *dev)
> +{
> +    if (dev->stream_channel) {
> +        stream_channel_reset(dev->stream_channel);
> +    }
> +}
> +
> +static void
>  stream_device_port_event(RedCharDevice *char_dev, uint8_t event)
>  {
>      if (event != SPICE_PORT_EVENT_OPENED && event !=
> SPICE_PORT_EVENT_CLOSED) {
> @@ -275,10 +298,13 @@ stream_device_port_event(RedCharDevice
> *char_dev, uint8_t event)
>  
>      // reset device and channel on close/open
>      dev->opened = (event == SPICE_PORT_EVENT_OPENED);
> +    if (dev->opened) {
> +        allocate_channels(dev);
> +    }
>      dev->hdr_pos = 0;
>      dev->has_error = false;
>      red_char_device_reset(char_dev);
> -    stream_channel_reset(dev->stream_channel);
> +    reset_channels(dev);
>  }
>  
>  static void


More information about the Spice-devel mailing list