[libvirt] [PATCH libvirt-glib] Allow cancelling gvir_stream_send_all & gvir_stream_receive_all

Marc-André Lureau marcandre.lureau at gmail.com
Tue Dec 6 21:39:30 UTC 2011


is libvirt doing something with errno? It's not indicated in
http://libvirt.org/html/libvirt-libvirt.html#virStreamSinkFunc
documentation.

otherwise looks good, ack

On Tue, Dec 6, 2011 at 4:55 PM, Christophe Fergeau <cfergeau at redhat.com> wrote:
> I don't know much about GCancellable, ... :-/ Makes sense to me though.
> Marc-André, do you have time to have a look at this patch?
>
> Thanks,
>
> Christophe
>
> On Tue, Dec 06, 2011 at 11:43:37AM +0000, Daniel P. Berrange wrote:
>> From: "Daniel P. Berrange" <berrange at redhat.com>
>>
>> Add GCancellable parameters to gvir_stream_send_all and
>> gvir_stream_receive_all to allow I/O to be interrupted
>> before completion
>> ---
>>  libvirt-gobject/libvirt-gobject-stream.c |   23 +++++++++++++++++++++--
>>  libvirt-gobject/libvirt-gobject-stream.h |    2 ++
>>  2 files changed, 23 insertions(+), 2 deletions(-)
>>
>> diff --git a/libvirt-gobject/libvirt-gobject-stream.c b/libvirt-gobject/libvirt-gobject-stream.c
>> index c1ae765..7204f98 100644
>> --- a/libvirt-gobject/libvirt-gobject-stream.c
>> +++ b/libvirt-gobject/libvirt-gobject-stream.c
>> @@ -26,6 +26,7 @@
>>
>>  #include <libvirt/virterror.h>
>>  #include <string.h>
>> +#include <errno.h>
>>
>>  #include "libvirt-glib/libvirt-glib.h"
>>  #include "libvirt-gobject/libvirt-gobject.h"
>> @@ -330,6 +331,7 @@ struct stream_sink_helper {
>>      GVirStream *self;
>>      GVirStreamSinkFunc func;
>>      gpointer user_data;
>> +    GCancellable *cancellable;
>>  };
>>
>>  static int
>> @@ -340,12 +342,18 @@ stream_sink(virStreamPtr st G_GNUC_UNUSED,
>>  {
>>    struct stream_sink_helper *helper = opaque;
>>
>> +  if (g_cancellable_is_cancelled(helper->cancellable)) {
>> +      errno = EIO;
>> +      return -1;
>> +  }
>> +
>>    return helper->func(helper->self, bytes, nbytes, helper->user_data);
>>  }
>>
>>  /**
>>   * gvir_stream_receive_all:
>>   * @stream: the stream
>> + * @cancellable: cancellation notifier
>>   * @func: (scope notified): the callback for writing data to application
>>   * @user_data: (closure): data to be passed to @callback
>>   * Returns: the number of bytes consumed or -1 upon error
>> @@ -356,6 +364,7 @@ stream_sink(virStreamPtr st G_GNUC_UNUSED,
>>   */
>>  gssize
>>  gvir_stream_receive_all(GVirStream *self,
>> +                        GCancellable *cancellable,
>>                          GVirStreamSinkFunc func,
>>                          gpointer user_data,
>>                          GError **err)
>> @@ -363,7 +372,8 @@ gvir_stream_receive_all(GVirStream *self,
>>      struct stream_sink_helper helper = {
>>          .self = self,
>>          .func = func,
>> -        .user_data = user_data
>> +        .user_data = user_data,
>> +        .cancellable = cancellable,
>>      };
>>      int r;
>>
>> @@ -433,6 +443,7 @@ struct stream_source_helper {
>>      GVirStream *self;
>>      GVirStreamSourceFunc func;
>>      gpointer user_data;
>> +    GCancellable *cancellable;
>>  };
>>
>>  static int
>> @@ -443,12 +454,18 @@ stream_source(virStreamPtr st G_GNUC_UNUSED,
>>  {
>>    struct stream_source_helper *helper = opaque;
>>
>> +  if (g_cancellable_is_cancelled(helper->cancellable)) {
>> +      errno = EIO;
>> +      return -1;
>> +  }
>> +
>>    return helper->func(helper->self, bytes, nbytes, helper->user_data);
>>  }
>>
>>  /**
>>   * gvir_stream_send_all:
>>   * @stream: the stream
>> + * @cancellable: cancellation notifier
>>   * @func: (scope notified): the callback for writing data to application
>>   * @user_data: (closure): data to be passed to @callback
>>   * Returns: the number of bytes consumed or -1 upon error
>> @@ -459,6 +476,7 @@ stream_source(virStreamPtr st G_GNUC_UNUSED,
>>   */
>>  gssize
>>  gvir_stream_send_all(GVirStream *self,
>> +                     GCancellable *cancellable,
>>                       GVirStreamSourceFunc func,
>>                       gpointer user_data,
>>                       GError **err)
>> @@ -466,7 +484,8 @@ gvir_stream_send_all(GVirStream *self,
>>      struct stream_source_helper helper = {
>>          .self = self,
>>          .func = func,
>> -        .user_data = user_data
>> +        .user_data = user_data,
>> +        .cancellable = cancellable,
>>      };
>>      int r;
>>
>> diff --git a/libvirt-gobject/libvirt-gobject-stream.h b/libvirt-gobject/libvirt-gobject-stream.h
>> index 3caadc3..9a02c7a 100644
>> --- a/libvirt-gobject/libvirt-gobject-stream.h
>> +++ b/libvirt-gobject/libvirt-gobject-stream.h
>> @@ -115,6 +115,7 @@ guint gvir_stream_add_watch_full(GVirStream *stream,
>>                                   GDestroyNotify notify);
>>
>>  gssize gvir_stream_receive_all(GVirStream *stream,
>> +                               GCancellable *cancellable,
>>                                 GVirStreamSinkFunc func,
>>                                 gpointer user_data,
>>                                 GError **error);
>> @@ -125,6 +126,7 @@ gssize gvir_stream_receive(GVirStream *stream,
>>                             GError **error);
>>
>>  gssize gvir_stream_send_all(GVirStream *stream,
>> +                            GCancellable *cancellable,
>>                              GVirStreamSourceFunc func,
>>                              gpointer user_data,
>>                              GError **error);
>> --
>> 1.7.7.3
>>
>> --
>> libvir-list mailing list
>> libvir-list at redhat.com
>> https://www.redhat.com/mailman/listinfo/libvir-list
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list



-- 
Marc-André Lureau




More information about the libvir-list mailing list