see my comments at https://lists.freedesktop.org/archives/spice-devel/2016-March/027794.html On Wed, 2016-03-30 at 18:21 +0100, Frediano Ziglio wrote: > From: Christophe Fergeau <cfergeau@xxxxxxxxxx> > > This pipe item belongs to the char device, not to the spicevmc channel. > --- > server/spicevmc.c | 35 ++++++++++++++++++++++++++++------- > 1 file changed, 28 insertions(+), 7 deletions(-) > > diff --git a/server/spicevmc.c b/server/spicevmc.c > index 666941f..b047b66 100644 > --- a/server/spicevmc.c > +++ b/server/spicevmc.c > @@ -56,7 +56,6 @@ typedef struct SpiceVmcState { > RedChannelClient *rcc; > SpiceCharDeviceState *chardev_st; > SpiceCharDeviceInstance *chardev_sin; > - SpiceVmcPipeItem *pipe_item; > SpiceCharDeviceWriteBuffer *recv_from_client_buf; > uint8_t port_opened; > } SpiceVmcState; > @@ -71,9 +70,11 @@ typedef struct SpiceVmcState { > > typedef struct RedCharDeviceSpiceVmc RedCharDeviceSpiceVmc; > typedef struct RedCharDeviceSpiceVmcClass RedCharDeviceSpiceVmcClass; > +typedef struct RedCharDeviceSpiceVmcPrivate RedCharDeviceSpiceVmcPrivate; > > struct RedCharDeviceSpiceVmc { > RedCharDevice parent; > + RedCharDeviceSpiceVmcPrivate *priv; > }; > > struct RedCharDeviceSpiceVmcClass > @@ -81,6 +82,10 @@ 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, > @@ -88,6 +93,8 @@ static RedCharDevice > *red_char_device_spicevmc_new(SpiceCharDeviceInstance *sin, > > 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; > @@ -135,6 +142,7 @@ static SpiceCharDeviceMsgToClient > *spicevmc_chardev_read_msg_from_dev(SpiceCharD > void > *opaque) > { > SpiceVmcState *state = opaque; > + RedCharDeviceSpiceVmc *dev = RED_CHAR_DEVICE_SPICEVMC(sin->st); > SpiceCharDeviceInterface *sif; > SpiceVmcPipeItem *msg_item; > int n; > @@ -145,14 +153,14 @@ static SpiceCharDeviceMsgToClient > *spicevmc_chardev_read_msg_from_dev(SpiceCharD > return NULL; > } > > - if (!state->pipe_item) { > + if (!dev->priv->pipe_item) { > msg_item = spice_new0(SpiceVmcPipeItem, 1); > msg_item->refs = 1; > pipe_item_init(&msg_item->base, PIPE_ITEM_TYPE_SPICEVMC_DATA); > } else { > - spice_assert(state->pipe_item->buf_used == 0); > - msg_item = state->pipe_item; > - state->pipe_item = NULL; > + spice_assert(dev->priv->pipe_item->buf_used == 0); > + msg_item = dev->priv->pipe_item; > + dev->priv->pipe_item = NULL; > } > > n = sif->read(sin, msg_item->buf, > @@ -162,7 +170,7 @@ static SpiceCharDeviceMsgToClient > *spicevmc_chardev_read_msg_from_dev(SpiceCharD > msg_item->buf_used = n; > return msg_item; > } else { > - state->pipe_item = msg_item; > + dev->priv->pipe_item = msg_item; > return NULL; > } > } > @@ -578,7 +586,6 @@ void spicevmc_device_disconnect(RedsState *reds, > SpiceCharDeviceInstance *sin) > sin->st = NULL; > > reds_unregister_channel(reds, &state->channel); > - free(state->pipe_item); > red_channel_destroy(&state->channel); > } > > @@ -606,13 +613,27 @@ SPICE_GNUC_VISIBLE void > spice_server_port_event(SpiceCharDeviceInstance *sin, ui > } > > 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 * _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel