[libvirt] [libvirt-glib] [PATCH 3/4] GVirDomain: Add async version of _create_snapshot

Christophe Fergeau cfergeau at redhat.com
Mon Aug 18 10:19:46 UTC 2014


On Fri, Aug 15, 2014 at 12:05:46PM +0200, Timm Bäder wrote:
> ---
>  libvirt-gobject/libvirt-gobject-domain.c | 67 ++++++++++++++++++++++++++++++++
>  libvirt-gobject/libvirt-gobject-domain.h | 11 ++++++
>  libvirt-gobject/libvirt-gobject.sym      |  2 +
>  3 files changed, 80 insertions(+)
> 
> diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c
> index aa2a170..29b82d0 100644
> --- a/libvirt-gobject/libvirt-gobject-domain.c
> +++ b/libvirt-gobject/libvirt-gobject-domain.c
> @@ -61,6 +61,11 @@ enum {
>      LAST_SIGNAL
>  };
>  
> +typedef struct {
> +    guint create_flags;
> +    GVirConfigDomainSnapshot *snapshot_config;
> +} SnapshotCreateData;
> +
>  static gint signals[LAST_SIGNAL];
>  
>  #define GVIR_DOMAIN_ERROR gvir_domain_error_quark()
> @@ -1524,6 +1529,68 @@ gvir_domain_create_snapshot(GVirDomain *dom,
>  }
>  
>  
> +static void _create_snapshot_async_thread(GTask *task,
> +                                          gpointer source_object,
> +                                          gpointer task_data,
> +                                          GCancellable *cancellable) {
> +    GError *error = NULL;
> +    GVirDomainSnapshot *snapshot;
> +    SnapshotCreateData *create_data = task_data;
> +
> +    snapshot = gvir_domain_create_snapshot(source_object,
> +                                           create_data->snapshot_config,
> +                                           create_data->create_flags,
> +                                           &error);
> +    if (snapshot)
> +      g_task_return_pointer(task, snapshot, g_object_unref);
> +    else
> +      g_task_return_error(task, error);
> +}
> +
> +/**
> + * gvir_domain_create_snapshot_async:
> + * @dom: The #GVirDomain
> + * @custom_conf: (allow-none): Configuration of snapshot or %NULL
> + * @flags: Bitwise-OR of #GVirDomainSnapshotCreateFlags
> + * @callback: (scope async): Complection callback
> + * @user_data: (closure): Opaque data for callback
> + */
> +void gvir_domain_create_snapshot_async(GVirDomain *dom,
> +                                       GVirConfigDomainSnapshot *custom_conf,
> +                                       guint flags,
> +                                       GAsyncReadyCallback callback,
> +                                       gpointer user_data) {

No GCancellable either?

> +    SnapshotCreateData *create_data;
> +    GTask *task;
> +
> +    g_return_if_fail(GVIR_IS_DOMAIN(dom));
> +    g_return_if_fail(GVIR_CONFIG_IS_DOMAIN_SNAPSHOT(custom_conf));
> +
> +    create_data = g_slice_new(SnapshotCreateData);
> +    create_data->create_flags = flags;
> +    create_data->snapshot_config = custom_conf;

I'd take a ref on snapshot_config as we don't really know what the
caller will do with it once we return from this method.

> +
> +    task = g_task_new(dom, NULL, callback, user_data);
> +    g_task_set_task_data(task, create_data, NULL);

You need to have pass a GDestroyNotify argument as you allocated
create_data in this function.

Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140818/3b63f9cc/attachment-0001.sig>


More information about the libvir-list mailing list