[Spice-devel] [PATCH spice-gtk 1/5] Add GIOStream-based pipe
Marc-André Lureau
mlureau at redhat.com
Mon Feb 23 07:09:49 PST 2015
Hi
----- Original Message -----
> > Because that field is for peer closing. I can rename it peer_closed
> > perhaps? (peer->peer_closed...)
>
> You lost me here. Do you mean PipeInputStream::closed means that the
> peer PipeOutputStream has been closed? If that's what you mean, then it
> definitely should be peer_closed.
I don't mind, for me the field means the pipe is closing, either side. However, since it's internal to the pipe implementation and is only set by the peer, I guess it could be closed peer_closed too. That really doesn't change much of the meaning of this code anyway.
> > Yes, I am not sure what that means in practice. There are also default
> > _async fallback for other methods, this might be outdated comment?
>
> Maybe in some places, gio is only checking if one of the async method is
> implemented, and then directly calls random other async methods. Is this
> _async implementation strictly needed anyway?
Probably not strictly required. I remember I based the code on gmemoryoutputstream and though it was a good idea to close sync and avoid threads (there are no pending IO handling either in giopipe)
However, note that close_async() has a default implementation, so it doesn't change much the checking for async implementation when overriding it.
> > >> +static gssize
> > >> +pipe_output_stream_write (GOutputStream *stream,
> > >> + const void *buffer,
> > >> + gsize count,
> > >> + GCancellable *cancellable,
> > >> + GError **error)
> > >> +{
> > >> + PipeOutputStream *self = PIPE_OUTPUT_STREAM(stream);
> > >> + PipeInputStream *peer = self->peer;
> > >> +
> > >> + //g_debug("write %p :%"G_GSIZE_FORMAT, stream, count);
> > >> + if (g_output_stream_is_closed (stream) || self->closed) {
> > >> + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_CLOSED,
> > >> + "Stream is already closed");
> > >> + return -1;
> > >> + }
> > >> +
> > >> + /* this abuses pollable stream, writing sync would likely lead to
> > >> + crashes, since the buffer pointer would become invalid, a
> > >> + generic solution would need a copy..
> > >> + */
> > >> + g_return_val_if_fail(self->buffer == buffer || self->buffer ==
> > >> NULL, -1);
> > >> + self->buffer = buffer;
> > >> + self->count = count;
> > >> +
> > >> + pipe_input_stream_check_source(self->peer);
> > >
> > > This call will trigger a sync call to pipe_input_stream_read() if I
> > > followed everything properly? A comment mentioning that might make the
> > > code easier to follow.
> >
> > It's not sync, it will "schedule peer source". As said in the comment,
> > this abuses pollable stream, since it keeps a pointer to the buffer
> > and assumes the function will be resumed with the same data (there are
> > preconditions checks for that)
>
> Yup, the comment was not crystal clear, bit more understandable after looking
> at the next patches...
>
> Christophe
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
More information about the Spice-devel
mailing list