[libvirt] [libvirt-glib 2/2] Async API to build & start storage pools

Daniel P. Berrange berrange at redhat.com
Thu Oct 27 08:04:48 UTC 2011


On Wed, Oct 26, 2011 at 07:50:54PM +0300, Zeeshan Ali (Khattak) wrote:
> From: "Zeeshan Ali (Khattak)" <zeeshanak at gnome.org>
> 
> ---
>  libvirt-gobject/libvirt-gobject-storage-pool.c |  160 ++++++++++++++++++++++++
>  libvirt-gobject/libvirt-gobject-storage-pool.h |   16 +++
>  libvirt-gobject/libvirt-gobject.sym            |    4 +
>  3 files changed, 180 insertions(+), 0 deletions(-)
> 
> diff --git a/libvirt-gobject/libvirt-gobject-storage-pool.c b/libvirt-gobject/libvirt-gobject-storage-pool.c
> index 74ecabc..bee0a17 100644
> --- a/libvirt-gobject/libvirt-gobject-storage-pool.c
> +++ b/libvirt-gobject/libvirt-gobject-storage-pool.c
> @@ -541,6 +541,88 @@ gboolean gvir_storage_pool_build (GVirStoragePool *pool,
>      return TRUE;
>  }
>  
> +typedef struct {
> +    guint64 flags;
> +} StoragePoolBuildData;
> +
> +static void
> +gvir_storage_pool_build_helper(GSimpleAsyncResult *res,
> +                               GObject *object,
> +                               GCancellable *cancellable G_GNUC_UNUSED)
> +{
> +    GVirStoragePool *pool = GVIR_STORAGE_POOL(object);
> +    StoragePoolBuildData *data;
> +    GError *err = NULL;
> +
> +    data = (StoragePoolBuildData *) g_object_get_data(G_OBJECT(res),
> +                                                      "StoragePoolBuildData");
> +
> +    if (!gvir_storage_pool_build(pool, data->flags, &err)) {
> +        g_simple_async_result_set_from_error(res, err);
> +        g_error_free(err);
> +    }
> +
> +    g_slice_free (StoragePoolBuildData, data);
> +}
> +
> +/**
> + * gvir_storage_pool_build_async:
> + * @pool: the storage pool to build
> + * @flags:  the flags
> + * @cancellable: (allow-none)(transfer none): cancellation object
> + * @callback: (scope async): completion callback
> + * @user_data: (closure): opaque data for callback
> + */
> +void gvir_storage_pool_build_async (GVirStoragePool *pool,
> +                                    guint64 flags G_GNUC_UNUSED,

flags *is* used in this method.

> +                                    GCancellable *cancellable,
> +                                    GAsyncReadyCallback callback,
> +                                    gpointer user_data)
> +{
> +    GSimpleAsyncResult *res;
> +    StoragePoolBuildData *data;
> +
> +    data = g_new0(StoragePoolBuildData, 1);
> +    data->flags = flags;
> +
> +    res = g_simple_async_result_new(G_OBJECT(pool),
> +                                    callback,
> +                                    user_data,
> +                                    gvir_storage_pool_build);
> +    g_object_set_data(G_OBJECT(res), "StoragePoolBuildData", data);
> +    g_simple_async_result_run_in_thread(res,
> +                                        gvir_storage_pool_build_helper,
> +                                        G_PRIORITY_DEFAULT,
> +                                        cancellable);
> +    g_object_unref(res);
> +}
> +
> +/**
> + * gvir_storage_pool_build_finish:
> + * @pool: the storage pool to build
> + * @result: (transfer none): async method result
> + * @err: return location for any #GError
> + *
> + * Return value: #True on success, #False otherwise.
> + */
> +gboolean gvir_storage_pool_build_finish(GVirStoragePool *pool,
> +                                        GAsyncResult *result,
> +                                        GError **err)
> +{
> +    g_return_val_if_fail(GVIR_IS_STORAGE_POOL(pool), FALSE);
> +    g_return_val_if_fail(G_IS_ASYNC_RESULT(result), FALSE);
> +
> +    if (G_IS_SIMPLE_ASYNC_RESULT(result)) {
> +        GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT(result);
> +        g_warn_if_fail (g_simple_async_result_get_source_tag(simple) ==
> +                        gvir_storage_pool_build);
> +        if (g_simple_async_result_propagate_error(simple, err))
> +            return FALSE;
> +    }
> +
> +    return TRUE;
> +}
> +
>  /**
>   * gvir_storage_pool_start:
>   * @pool: the storage pool to start
> @@ -562,3 +644,81 @@ gboolean gvir_storage_pool_start (GVirStoragePool *pool,
>  
>      return TRUE;
>  }
> +
> +static void
> +gvir_storage_pool_start_helper(GSimpleAsyncResult *res,
> +                               GObject *object,
> +                               GCancellable *cancellable G_GNUC_UNUSED)
> +{
> +    GVirStoragePool *pool = GVIR_STORAGE_POOL(object);
> +    StoragePoolBuildData *data;
> +    GError *err = NULL;
> +
> +    data = (StoragePoolBuildData *) g_object_get_data(G_OBJECT(res),
> +                                                      "StoragePoolBuildData");
> +
> +    if (!gvir_storage_pool_start(pool, data->flags, &err)) {
> +        g_simple_async_result_set_from_error(res, err);
> +        g_error_free(err);
> +    }
> +
> +    g_slice_free (StoragePoolBuildData, data);
> +}
> +
> +/**
> + * gvir_storage_pool_start_async:
> + * @pool: the storage pool to start
> + * @flags:  the flags
> + * @cancellable: (allow-none)(transfer none): cancellation object
> + * @callback: (scope async): completion callback
> + * @user_data: (closure): opaque data for callback
> + */
> +void gvir_storage_pool_start_async (GVirStoragePool *pool,
> +                                    guint64 flags G_GNUC_UNUSED,

Likewise

> +                                    GCancellable *cancellable,
> +                                    GAsyncReadyCallback callback,
> +                                    gpointer user_data)
> +{
> +    GSimpleAsyncResult *res;
> +    StoragePoolBuildData *data;
> +
> +    data = g_new0(StoragePoolBuildData, 1);
> +    data->flags = flags;
> +
> +    res = g_simple_async_result_new(G_OBJECT(pool),
> +                                    callback,
> +                                    user_data,
> +                                    gvir_storage_pool_start);
> +    g_object_set_data(G_OBJECT(res), "StoragePoolBuildData", data);
> +    g_simple_async_result_run_in_thread(res,
> +                                        gvir_storage_pool_start_helper,
> +                                        G_PRIORITY_DEFAULT,
> +                                        cancellable);
> +    g_object_unref(res);
> +}
> +
> +/**
> + * gvir_storage_pool_start_finish:
> + * @pool: the storage pool to start
> + * @result: (transfer none): async method result
> + * @err: return location for any #GError
> + *
> + * Return value: #True on success, #False otherwise.
> + */
> +gboolean gvir_storage_pool_start_finish(GVirStoragePool *pool,
> +                                        GAsyncResult *result,
> +                                        GError **err)
> +{
> +    g_return_val_if_fail(GVIR_IS_STORAGE_POOL(pool), FALSE);
> +    g_return_val_if_fail(G_IS_ASYNC_RESULT(result), FALSE);
> +
> +    if (G_IS_SIMPLE_ASYNC_RESULT(result)) {
> +        GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT(result);
> +        g_warn_if_fail (g_simple_async_result_get_source_tag(simple) ==
> +                        gvir_storage_pool_start);
> +        if (g_simple_async_result_propagate_error(simple, err))
> +            return FALSE;
> +    }
> +
> +    return TRUE;
> +}
> diff --git a/libvirt-gobject/libvirt-gobject-storage-pool.h b/libvirt-gobject/libvirt-gobject-storage-pool.h
> index 7b13ef9..25df1b1 100644
> --- a/libvirt-gobject/libvirt-gobject-storage-pool.h
> +++ b/libvirt-gobject/libvirt-gobject-storage-pool.h
> @@ -91,10 +91,26 @@ GVirStorageVol *gvir_storage_pool_create_volume
>  gboolean gvir_storage_pool_build (GVirStoragePool *pool,
>                                    guint64 flags,
>                                    GError **err);
> +void gvir_storage_pool_build_async (GVirStoragePool *pool,
> +                                    guint64 flags,
> +                                    GCancellable *cancellable,
> +                                    GAsyncReadyCallback callback,
> +                                    gpointer user_data);
> +gboolean gvir_storage_pool_build_finish(GVirStoragePool *pool,
> +                                        GAsyncResult *result,
> +                                        GError **err);
>  
>  gboolean gvir_storage_pool_start (GVirStoragePool *pool,
>                                    guint64 flags,
>                                    GError **err);
> +void gvir_storage_pool_start_async (GVirStoragePool *pool,
> +                                    guint64 flags,
> +                                    GCancellable *cancellable,
> +                                    GAsyncReadyCallback callback,
> +                                    gpointer user_data);
> +gboolean gvir_storage_pool_start_finish(GVirStoragePool *pool,
> +                                        GAsyncResult *result,
> +                                        GError **err);
>  
>  G_END_DECLS
>  
> diff --git a/libvirt-gobject/libvirt-gobject.sym b/libvirt-gobject/libvirt-gobject.sym
> index 4b1b84c..f0e8402 100644
> --- a/libvirt-gobject/libvirt-gobject.sym
> +++ b/libvirt-gobject/libvirt-gobject.sym
> @@ -90,7 +90,11 @@ LIBVIRT_GOBJECT_0.0.1 {
>  	gvir_storage_pool_get_volume;
>  	gvir_storage_pool_create_volume;
>  	gvir_storage_pool_build;
> +	gvir_storage_pool_build_async;
> +	gvir_storage_pool_build_finish;
>  	gvir_storage_pool_start;
> +	gvir_storage_pool_start_async;
> +	gvir_storage_pool_start_finish;
>  
>  	gvir_storage_vol_get_type;
>  	gvir_storage_vol_handle_get_type;
> -- 

ACK with the two G_GNUC_UNUSED attributes removed

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list