[Spice-devel] [PATCH v2] fixup! spicevmc: Change creation of RedCharDeviceSpiceVmc

Frediano Ziglio fziglio at redhat.com
Mon Nov 7 10:49:50 UTC 2016


> 
> ---
> Changes in v2:
>  - pass 'channel' property to char device constructor
>  - assert that 'channel' device is non-null in char device set_property
>  - minor indentation fix
> 
>  server/spicevmc.c | 83
>  ++++++++++++++++++++++++++++++++++++++++---------------
>  1 file changed, 61 insertions(+), 22 deletions(-)
> 
> diff --git a/server/spicevmc.c b/server/spicevmc.c
> index cf743de..532598d 100644
> --- a/server/spicevmc.c
> +++ b/server/spicevmc.c
> @@ -89,7 +89,7 @@ struct RedCharDeviceSpiceVmcClass
>  static GType red_char_device_spicevmc_get_type(void) G_GNUC_CONST;
>  static RedCharDevice *red_char_device_spicevmc_new(SpiceCharDeviceInstance
>  *sin,
>                                                     RedsState *reds,
> -                                                   uint8_t channel_type);
> +                                                   RedVmcChannel *channel);
>  
>  G_DEFINE_TYPE(RedCharDeviceSpiceVmc, red_char_device_spicevmc,
>  RED_TYPE_CHAR_DEVICE)
>  
> @@ -806,7 +806,19 @@ RedCharDevice *spicevmc_device_connect(RedsState *reds,
>                                         SpiceCharDeviceInstance *sin,
>                                         uint8_t channel_type)
>  {
> -    return red_char_device_spicevmc_new(sin, reds, channel_type);
> +    RedCharDevice *dev;
> +    RedVmcChannel *channel = red_vmc_channel_new(reds, channel_type);
> +    if (!channel) {
> +        return NULL;
> +    }
> +
> +    /* char device takes ownership of channel */
> +    dev = red_char_device_spicevmc_new(sin, reds, channel);
> +
> +    channel->chardev_sin = sin;
> +    g_object_unref(channel);
> +
> +    return dev;
>  }
>  
>  /* Must be called from RedClient handling thread. */
> @@ -861,18 +873,56 @@ red_char_device_spicevmc_dispose(GObject *object)
>      }
>  }
>  
> +enum {
> +    PROP0,
> +    PROP_CHANNEL
> +};
> +
> +static void
> +red_char_device_spicevmc_set_property(GObject *object,
> +                                      guint property_id,
> +                                      const GValue *value,
> +                                      GParamSpec *pspec)
> +{
> +    RedCharDeviceSpiceVmc *self = RED_CHAR_DEVICE_SPICEVMC(object);
> +
> +    switch (property_id)
> +    {
> +        case PROP_CHANNEL:
> +            spice_assert(self->channel == NULL);
> +            self->channel = g_value_dup_object(value);
> +            spice_assert(self->channel != NULL);
> +            self->channel->chardev = RED_CHAR_DEVICE(self);
> +
> +            break;
> +        default:
> +            G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
> +    }
> +}
> +
>  static void
>  red_char_device_spicevmc_class_init(RedCharDeviceSpiceVmcClass *klass)
>  {
>      GObjectClass *object_class = G_OBJECT_CLASS(klass);
>      RedCharDeviceClass *char_dev_class = RED_CHAR_DEVICE_CLASS(klass);
>  
> +    object_class->set_property = red_char_device_spicevmc_set_property;
>      object_class->dispose = red_char_device_spicevmc_dispose;
>  
>      char_dev_class->read_one_msg_from_device =
>      spicevmc_chardev_read_msg_from_dev;
>      char_dev_class->send_msg_to_client =
>      spicevmc_chardev_send_msg_to_client;
>      char_dev_class->send_tokens_to_client =
>      spicevmc_char_dev_send_tokens_to_client;
>      char_dev_class->remove_client = spicevmc_char_dev_remove_client;
> +
> +    g_object_class_install_property(object_class,
> +                                    PROP_CHANNEL,
> +                                    g_param_spec_object("channel",
> +                                                        "Channel",
> +                                                        "Channel associated
> with this device",
> +
> RED_TYPE_VMC_CHANNEL,
> +
> G_PARAM_STATIC_STRINGS
> |
> +                                                        G_PARAM_WRITABLE |
> +                                                        G_PARAM_CONSTRUCT));
>  }
>  
>  static void
> @@ -883,25 +933,14 @@ red_char_device_spicevmc_init(RedCharDeviceSpiceVmc
> *self)
>  static RedCharDevice *
>  red_char_device_spicevmc_new(SpiceCharDeviceInstance *sin,
>                               RedsState *reds,
> -                             uint8_t channel_type)
> +                             RedVmcChannel *channel)
>  {
> -    RedCharDeviceSpiceVmc *dev;
> -    RedVmcChannel *channel = red_vmc_channel_new(reds, channel_type);
> -    if (!channel) {
> -        return NULL;
> -    }
> -
> -    dev = g_object_new(RED_TYPE_CHAR_DEVICE_SPICEVMC,
> -                       "sin", sin,
> -                       "spice-server", reds,
> -                       "client-tokens-interval", 0ULL,
> -                       "self-tokens", ~0ULL,
> -                       "opaque", channel,
> -                       NULL);
> -
> -    channel->chardev = RED_CHAR_DEVICE(dev);
> -    channel->chardev_sin = sin;
> -    dev->channel = channel;
> -
> -    return RED_CHAR_DEVICE(dev);
> +    return g_object_new(RED_TYPE_CHAR_DEVICE_SPICEVMC,
> +                        "sin", sin,
> +                        "spice-server", reds,
> +                        "client-tokens-interval", 0ULL,
> +                        "self-tokens", ~0ULL,
> +                        "channel", channel,
> +                        "opaque", channel,
> +                        NULL);
>  }

Acked

Frediano


More information about the Spice-devel mailing list