On Fri, Apr 01, 2016 at 03:51:42PM -0500, Jonathon Jongsma wrote: > From: Christophe Fergeau <cfergeau@xxxxxxxxxx> > > This inherits from RedCharDevice. > > Signed-off-by: Christophe Fergeau <cfergeau@xxxxxxxxxx> > --- > server/reds-private.h | 2 +- > server/reds.c | 246 ++++++++++++++++++++++++++++++++------------------ > 2 files changed, 159 insertions(+), 89 deletions(-) > > diff --git a/server/reds-private.h b/server/reds-private.h > index 8842aad..b3dac6d 100644 > --- a/server/reds-private.h > +++ b/server/reds-private.h > @@ -573,7 +599,7 @@ void reds_client_disconnect(RedsState *reds, RedClient *client) > internal_buf->header.opaque = 0; > internal_buf->header.size = 0; > > - red_char_device_write_buffer_add(reds->agent_state->priv->base, > + red_char_device_write_buffer_add(RED_CHAR_DEVICE(reds->agent_state), > char_dev_buf); Alignment issue > } > > @@ -1415,8 +1441,8 @@ int reds_handle_migrate_data(RedsState *reds, MainChannelClient *mcc, > spice_debug("agent was not attached on the source host"); > if (reds->vdagent) { > /* red_char_device_client_remove disables waiting for migration data */ > - red_char_device_client_remove(agent_state->priv->base, > - main_channel_client_get_base(mcc)->client); > + red_char_device_client_remove(RED_CHAR_DEVICE(agent_state), > + main_channel_client_get_base(mcc)->client); and one more (feel free to ignore these comments in this patch and the previous one if this causes too many rebase conflicts). > main_channel_push_agent_connected(reds->main_channel); > } > } > @@ -3106,7 +3119,7 @@ static RedCharDevice *attach_to_red_agent(RedsState *reds, SpiceCharDeviceInstan > main_channel_push_agent_connected(reds->main_channel); > } > > - return state->priv->base; > + return RED_CHAR_DEVICE(state); > } > > SPICE_GNUC_VISIBLE void spice_server_char_device_wakeup(SpiceCharDeviceInstance* sin) > @@ -3363,33 +3376,6 @@ SPICE_GNUC_VISIBLE int spice_server_remove_interface(SpiceBaseInstance *sin) > return 0; > } > > -static void reds_init_vd_agent_resources(RedsState *reds) > -{ > - VDIPortState *state; > - int i; > - > - reds->agent_state = g_new0(VDIPortState, 1); > - state = reds->agent_state; > - ring_init(&state->priv->read_bufs); > - agent_msg_filter_init(&state->priv->write_filter, reds->agent_copypaste, > - reds->agent_file_xfer, > - reds_use_client_monitors_config(reds), TRUE); > - agent_msg_filter_init(&state->priv->read_filter, reds->agent_copypaste, > - reds->agent_file_xfer, > - reds_use_client_monitors_config(reds), TRUE); > - > - state->priv->read_state = VDI_PORT_READ_STATE_READ_HEADER; > - state->priv->receive_pos = (uint8_t *)&state->priv->vdi_chunk_header; > - state->priv->receive_len = sizeof(state->priv->vdi_chunk_header); > - > - for (i = 0; i < REDS_VDI_PORT_NUM_RECEIVE_BUFFS; i++) { > - VDIReadBuf *buf = spice_new0(VDIReadBuf, 1); > - buf->state = state; > - ring_item_init(&buf->link); > - ring_add(&reds->agent_state->priv->read_bufs, &buf->link); > - } > -} > - > static int do_spice_init(RedsState *reds, SpiceCoreInterface *core_interface) > { > spice_info("starting %s", VERSION); > @@ -3402,7 +3388,7 @@ static int do_spice_init(RedsState *reds, SpiceCoreInterface *core_interface) > reds->core = &core_interface_adapter; > reds->listen_socket = -1; > reds->secure_listen_socket = -1; > - reds_init_vd_agent_resources(reds); > + reds->agent_state = red_char_device_vdi_port_new(reds); > ring_init(&reds->clients); > reds->num_clients = 0; > reds->main_dispatcher = main_dispatcher_new(reds, reds->core); > @@ -4279,3 +4265,87 @@ MainDispatcher* reds_get_main_dispatcher(RedsState *reds) > { > return reds->main_dispatcher; > } > + > +static void red_char_device_vdi_port_constructed(GObject *object) > +{ > + RedCharDeviceVDIPort *dev = RED_CHAR_DEVICE_VDIPORT(object); > + RedsState *reds; > + > + G_OBJECT_CLASS(red_char_device_vdi_port_parent_class)->constructed(object); > + > + g_object_get(dev, "spice-server", &reds, NULL); > + > + agent_msg_filter_init(&dev->priv->write_filter, reds->agent_copypaste, > + reds->agent_file_xfer, > + reds_use_client_monitors_config(reds), > + TRUE); > + agent_msg_filter_init(&dev->priv->read_filter, reds->agent_copypaste, > + reds->agent_file_xfer, > + reds_use_client_monitors_config(reds), > + TRUE); > +} > + > +static void > +red_char_device_vdi_port_init(RedCharDeviceVDIPort *self) > +{ > + int i; > + > + self->priv = RED_CHAR_DEVICE_VDIPORT_PRIVATE(self); > + > + ring_init(&self->priv->read_bufs); > + > + self->priv->read_state = VDI_PORT_READ_STATE_READ_HEADER; > + self->priv->receive_pos = (uint8_t *)&self->priv->vdi_chunk_header; > + self->priv->receive_len = sizeof(self->priv->vdi_chunk_header); > + > + for (i = 0; i < REDS_VDI_PORT_NUM_RECEIVE_BUFFS; i++) { > + VDIReadBuf *buf = spice_new0(VDIReadBuf, 1); > + buf->state = self; > + ring_item_init(&buf->link); > + ring_add(&self->priv->read_bufs, &buf->link); > + } > +} > + > +static void > +red_char_device_vdi_port_finalize(GObject *object) > +{ > + RedCharDeviceVDIPort *dev = RED_CHAR_DEVICE_VDIPORT(object); > + > + free(dev->priv->mig_data); > + /* FIXME: need to free the VDIReadBuf allocated previously */ Would indeed be nicer to fix that FIXME :) (I can send a patch for that tomorrow). Otherwise looks good to me. Christophe
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel