Hi, On Fri, Aug 12, 2011 at 04:50:28PM +0200, Hans de Goede wrote: > - if (c->xmit_buffer_size) { > - spice_channel_write(channel, c->xmit_buffer, c->xmit_buffer_size); > + if (c->xmit_buffer) { > + /* > + * Take ownership of the buffer, so that if spice_channel_write calls > + * g_io_wait and thus yields to the main context, and that then calls > + * spice_channel_buffered_write it does not mess with the buffer > + * being written out. > + */ > + guint8 *buffer = c->xmit_buffer; > + int size = c->xmit_buffer_size; > + > + c->xmit_buffer = NULL; > c->xmit_buffer_size = 0; > + c->xmit_buffer_capacity = 0; > + > + spice_channel_write(channel, buffer, size); > + g_free(buffer);
I don't know if you're planning to emit a lot of messages per second with the USB channel, having something like if (c->xmit_buffer == NULL) c->xmit_buffer = buffer; c->xmit_buffer_capacity = ...; c->xmit_buffer_size = 0; } else { g_free (buffer) } would save some allocations later on. I'm ACKing either version. Christophe
pgp1a2Oa3dLoJ.pgp
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel