[Spice-devel] [PATCH 05/13] spicevmc: Introduce RedCharDeviceSpiceVmc GObject

Jonathon Jongsma jjongsma at redhat.com
Tue Mar 29 19:53:13 UTC 2016



On Tue, 2016-03-29 at 11:53 -0500, Jonathon Jongsma wrote:
> On Wed, 2016-03-23 at 12:48 +0000, Frediano Ziglio wrote:
> > From: Christophe Fergeau <cfergeau at redhat.com>
> > 
> > ---
> >  server/spicevmc.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++-----
> > --
> > -
> >  1 file changed, 88 insertions(+), 14 deletions(-)
> > 
> > diff --git a/server/spicevmc.c b/server/spicevmc.c
> > index f745fdb..0cf2cce 100644
> > --- a/server/spicevmc.c
> > +++ b/server/spicevmc.c
> > @@ -61,6 +61,41 @@ typedef struct SpiceVmcState {
> >      uint8_t port_opened;
> >  } SpiceVmcState;
> >  
> > +#define RED_TYPE_CHAR_DEVICE_SPICEVMC red_char_device_spicevmc_get_type()
> > +
> > +#define RED_CHAR_DEVICE_SPICEVMC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),
> > RED_TYPE_CHAR_DEVICE_SPICEVMC, RedCharDeviceSpiceVmc))
> > +#define RED_CHAR_DEVICE_SPICEVMC_CLASS(klass)
> > (G_TYPE_CHECK_CLASS_CAST((klass), RED_TYPE_CHAR_DEVICE_SPICEVMC,
> > RedCharDeviceSpiceVmcClass))
> > +#define RED_IS_CHAR_DEVICE_SPICEVMC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),
> > RED_TYPE_CHAR_DEVICE_SPICEVMC))
> > +#define RED_IS_CHAR_DEVICE_SPICEVMC_CLASS(klass)
> > (G_TYPE_CHECK_CLASS_TYPE((klass), RED_TYPE_CHAR_DEVICE_SPICEVMC))
> > +#define RED_CHAR_DEVICE_SPICEVMC_GET_CLASS(obj)
> > (G_TYPE_INSTANCE_GET_CLASS((obj), RED_TYPE_CHAR_DEVICE_SPICEVMC,
> > RedCharDeviceSpiceVmcClass))
> > +
> > +typedef struct RedCharDeviceSpiceVmc RedCharDeviceSpiceVmc;
> > +typedef struct RedCharDeviceSpiceVmcClass RedCharDeviceSpiceVmcClass;
> > +typedef struct RedCharDeviceSpiceVmcPrivate RedCharDeviceSpiceVmcPrivate;
> > +
> > +struct RedCharDeviceSpiceVmc {
> > +    RedCharDevice parent;
> > +    RedCharDeviceSpiceVmcPrivate *priv;
> > +};
> > +
> > +struct RedCharDeviceSpiceVmcClass
> > +{
> > +    RedCharDeviceClass parent_class;
> > +};
> > +
> > +struct RedCharDeviceSpiceVmcPrivate {
> > +    SpiceVmcPipeItem *pipe_item;
> > +};
> > +
> > +static GType red_char_device_spicevmc_get_type(void) G_GNUC_CONST;
> > +static RedCharDevice *red_char_device_spicevmc_new(SpiceCharDeviceInstance
> > *sin,
> > +                                                   RedsState *reds,
> > +                                                   void *opaque);
> > +
> > +G_DEFINE_TYPE(RedCharDeviceSpiceVmc, red_char_device_spicevmc,
> > RED_TYPE_CHAR_DEVICE)
> > +
> > +#define RED_CHAR_DEVICE_SPICEVMC_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE
> > ((o), RED_TYPE_CHAR_DEVICE_SPICEVMC, RedCharDeviceSpiceVmcPrivate))
> > +
> >  typedef struct PortInitPipeItem {
> >      PipeItem base;
> >      char* name;
> > @@ -507,7 +542,6 @@ SpiceCharDeviceState *spicevmc_device_connect(RedsState
> > *reds,
> >      SpiceVmcState *state;
> >      ChannelCbs channel_cbs = { NULL, };
> >      ClientCbs client_cbs = { NULL, };
> > -    SpiceCharDeviceCallbacks char_dev_cbs = {NULL, };
> >  
> >      channel_cbs.config_socket = spicevmc_red_channel_client_config_socket;
> >      channel_cbs.on_disconnect = spicevmc_red_channel_client_on_disconnect;
> > @@ -530,19 +564,7 @@ SpiceCharDeviceState *spicevmc_device_connect(RedsState
> > *reds,
> >      client_cbs.connect = spicevmc_connect;
> >      red_channel_register_client_cbs(&state->channel, &client_cbs, NULL);
> >  
> > -    char_dev_cbs.read_one_msg_from_device =
> > spicevmc_chardev_read_msg_from_dev;
> > -    char_dev_cbs.ref_msg_to_client = spicevmc_chardev_ref_msg_to_client;
> > -    char_dev_cbs.unref_msg_to_client =
> > spicevmc_chardev_unref_msg_to_client;
> > -    char_dev_cbs.send_msg_to_client = spicevmc_chardev_send_msg_to_client;
> > -    char_dev_cbs.send_tokens_to_client =
> > spicevmc_char_dev_send_tokens_to_client;
> > -    char_dev_cbs.remove_client = spicevmc_char_dev_remove_client;
> > -
> > -    state->chardev_st = spice_char_device_state_create(sin,
> > -                                                       reds,
> > -                                                       0, /* tokens
> > interval
> > */
> > -                                                       ~0, /* self tokens
> > */
> > -                                                       &char_dev_cbs,
> > -                                                       state);
> > +    state->chardev_st = red_char_device_spicevmc_new(sin, reds, state);
> >      state->chardev_sin = sin;
> >  
> >      reds_register_channel(reds, &state->channel);
> > @@ -590,3 +612,55 @@ SPICE_GNUC_VISIBLE void
> > spice_server_port_event(SpiceCharDeviceInstance *sin, ui
> >  
> >      spicevmc_port_send_event(state->rcc, event);
> >  }
> > +
> > +static void
> > +red_char_device_spicevmc_finalize(GObject *object)
> > +{
> > +    RedCharDeviceSpiceVmc *self = RED_CHAR_DEVICE_SPICEVMC(object);
> > +
> > +    free(self->priv->pipe_item);
> > +}
> > +
> > +static void
> > +red_char_device_spicevmc_class_init(RedCharDeviceSpiceVmcClass *klass)
> > +{
> > +    GObjectClass *object_class = G_OBJECT_CLASS(klass);
> > +
> > +    g_type_class_add_private(klass, sizeof (RedCharDeviceSpiceVmcPrivate));
> > +
> > +    object_class->finalize = red_char_device_spicevmc_finalize;
> > +}
> > +
> > +static void
> > +red_char_device_spicevmc_init(RedCharDeviceSpiceVmc *self)
> > +{
> > +    self->priv = RED_CHAR_DEVICE_SPICEVMC_PRIVATE(self);
> > +}
> > +
> > +static RedCharDevice *
> > +red_char_device_spicevmc_new(SpiceCharDeviceInstance *sin,
> > +                             RedsState *reds,
> > +                             void *opaque)
> > +{
> > +    RedCharDevice *char_dev;
> > +    SpiceCharDeviceCallbacks char_dev_cbs = {
> > +        .read_one_msg_from_device = spicevmc_chardev_read_msg_from_dev,
> > +        .ref_msg_to_client = spicevmc_chardev_ref_msg_to_client,
> > +        .unref_msg_to_client = spicevmc_chardev_unref_msg_to_client,
> > +        .send_msg_to_client = spicevmc_chardev_send_msg_to_client,
> > +        .send_tokens_to_client = spicevmc_char_dev_send_tokens_to_client,
> > +        .remove_client = spicevmc_char_dev_remove_client,
> > +    };
> 
> I think that these should become proper GObject virtual functions eventually,
> but it doesn't need to happen here.
> 
> > +
> > +    char_dev = g_object_new(RED_TYPE_CHAR_DEVICE_SPICEVMC,
> > +                            "sin", sin,
> > +                            "spice-server", reds,
> > +                            "client-tokens-interval", 0ULL,
> > +                            "self-tokens", ~0ULL,
> > +                            "opaque", opaque,
> > +                            NULL);
> > +
> > +    red_char_device_set_callbacks(RED_CHAR_DEVICE(char_dev),
> > +                                  &char_dev_cbs, opaque);
> > +    return char_dev;
> > +}
> 
> Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel



I take back my ACK

this change includes an unused pipe_item variable in
 RedCharDeviceSpiceVmcPrivate that appears like it's supposed to be part of the
next patch. Possibly due to a rebase issue.

Jonathon


More information about the Spice-devel mailing list