[libvirt] [libvirt-glib PATCHv5 1/7] gobject: Simplify gvir_connection_list*() implementations

Christophe Fergeau cfergeau at redhat.com
Tue Jul 7 14:43:54 UTC 2015


Hey,

A 'changes since v4' section would have been nice

ACK series.

Christophe

On Tue, Jul 07, 2015 at 03:17:31PM +0100, Zeeshan Ali (Khattak) wrote:
> Make use of virConnectListAll* functions to avoid making 4 calls and
> hence avoid race conditions and complicated code.
> ---
>  libvirt-gobject/libvirt-gobject-connection.c | 203 ++++-----------------------
>  1 file changed, 28 insertions(+), 175 deletions(-)
> 
> diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c
> index cf073a5..e088427 100644
> --- a/libvirt-gobject/libvirt-gobject-connection.c
> +++ b/libvirt-gobject/libvirt-gobject-connection.c
> @@ -680,48 +680,6 @@ void gvir_connection_close(GVirConnection *conn)
>      g_signal_emit(conn, signals[VIR_CONNECTION_CLOSED], 0);
>  }
>  
> -typedef gint (* CountFunction) (virConnectPtr vconn);
> -typedef gint (* ListFunction) (virConnectPtr vconn, gchar **lst, gint max);
> -
> -static gchar ** fetch_list(virConnectPtr vconn,
> -                           const char *name,
> -                           CountFunction count_func,
> -                           ListFunction list_func,
> -                           GCancellable *cancellable,
> -                           gint *length,
> -                           GError **err)
> -{
> -    gchar **lst = NULL;
> -    gint n = 0;
> -
> -    if ((n = count_func(vconn)) < 0) {
> -        gvir_set_error(err, GVIR_CONNECTION_ERROR,
> -                       0,
> -                       _("Unable to count %s"), name);
> -        goto error;
> -    }
> -
> -    if (n) {
> -        if (g_cancellable_set_error_if_cancelled(cancellable, err))
> -            goto error;
> -
> -        lst = g_new0(gchar *, n);
> -        if ((n = list_func(vconn, lst, n)) < 0) {
> -            gvir_set_error(err, GVIR_CONNECTION_ERROR,
> -                           0,
> -                           _("Unable to list %s %d"), name, n);
> -            goto error;
> -        }
> -    }
> -
> -    *length = n;
> -    return lst;
> -
> -error:
> -    g_free(lst);
> -    return NULL;
> -}
> -
>  /**
>   * gvir_connection_fetch_domains:
>   * @conn: a #GVirConnection
> @@ -733,14 +691,11 @@ gboolean gvir_connection_fetch_domains(GVirConnection *conn,
>  {
>      GVirConnectionPrivate *priv;
>      GHashTable *doms;
> -    gchar **inactive = NULL;
> -    gint ninactive = 0;
> -    gint *active = NULL;
> -    gint nactive = 0;
> +    virDomainPtr *domains = NULL;
> +    gint ndomains = 0;
>      gboolean ret = FALSE;
>      gint i;
>      virConnectPtr vconn = NULL;
> -    GError *lerr = NULL;
>  
>      g_return_val_if_fail(GVIR_IS_CONNECTION(conn), FALSE);
>      g_return_val_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable),
> @@ -761,81 +716,28 @@ gboolean gvir_connection_fetch_domains(GVirConnection *conn,
>      virConnectRef(vconn);
>      g_mutex_unlock(priv->lock);
>  
> -    if (g_cancellable_set_error_if_cancelled(cancellable, err))
> -        goto cleanup;
> -
> -    if ((nactive = virConnectNumOfDomains(vconn)) < 0) {
> -        gvir_set_error_literal(err, GVIR_CONNECTION_ERROR,
> -                               0,
> -                               _("Unable to count domains"));
> +    ndomains = virConnectListAllDomains(vconn, &domains, 0);
> +    if (ndomains < 0) {
> +        gvir_set_error(err, GVIR_CONNECTION_ERROR,
> +                       0,
> +                       _("Failed to fetch list of domains"));
>          goto cleanup;
>      }
> -    if (nactive) {
> -        if (g_cancellable_set_error_if_cancelled(cancellable, err))
> -            goto cleanup;
> -
> -        active = g_new(gint, nactive);
> -        if ((nactive = virConnectListDomains(vconn, active, nactive)) < 0) {
> -            gvir_set_error_literal(err, GVIR_CONNECTION_ERROR,
> -                                   0,
> -                                   _("Unable to list domains"));
> -            goto cleanup;
> -        }
> -    }
>  
>      if (g_cancellable_set_error_if_cancelled(cancellable, err))
>          goto cleanup;
>  
> -    inactive = fetch_list(vconn,
> -                          "Domains",
> -                          virConnectNumOfDefinedDomains,
> -                          virConnectListDefinedDomains,
> -                          cancellable,
> -                          &ninactive,
> -                          &lerr);
> -    if (lerr) {
> -        g_propagate_error(err, lerr);
> -        lerr = NULL;
> -        goto cleanup;
> -    }
> -
>      doms = g_hash_table_new_full(g_str_hash,
>                                   g_str_equal,
>                                   NULL,
>                                   g_object_unref);
>  
> -    for (i = 0 ; i < nactive ; i++) {
> -        if (g_cancellable_set_error_if_cancelled(cancellable, err))
> -            goto cleanup;
> -
> -        virDomainPtr vdom = virDomainLookupByID(vconn, active[i]);
> +    for (i = 0 ; i < ndomains; i++) {
>          GVirDomain *dom;
> -        if (!vdom)
> -            continue;
>  
>          dom = GVIR_DOMAIN(g_object_new(GVIR_TYPE_DOMAIN,
> -                                       "handle", vdom,
> +                                       "handle", domains[i],
>                                         NULL));
> -        virDomainFree(vdom);
> -
> -        g_hash_table_insert(doms,
> -                            (gpointer)gvir_domain_get_uuid(dom),
> -                            dom);
> -    }
> -
> -    for (i = 0 ; i < ninactive ; i++) {
> -        if (g_cancellable_set_error_if_cancelled(cancellable, err))
> -            goto cleanup;
> -
> -        virDomainPtr vdom = virDomainLookupByName(vconn, inactive[i]);
> -        GVirDomain *dom;
> -        if (!vdom)
> -            continue;
> -
> -        dom = GVIR_DOMAIN(g_object_new(GVIR_TYPE_DOMAIN,
> -                                       "handle", vdom,
> -                                       NULL));
> -        virDomainFree(vdom);
>  
>          g_hash_table_insert(doms,
>                              (gpointer)gvir_domain_get_uuid(dom),
> @@ -852,10 +754,11 @@ gboolean gvir_connection_fetch_domains(GVirConnection *conn,
>      ret = TRUE;
>  
>  cleanup:
> -    g_free(active);
> -    for (i = 0 ; i < ninactive ; i++)
> -        g_free(inactive[i]);
> -    g_free(inactive);
> +    if (ndomains > 0) {
> +        for (i = 0 ; i < ndomains; i++)
> +            virDomainFree(domains[i]);
> +        free(domains);
> +    }
>      return ret;
>  }
>  
> @@ -870,14 +773,11 @@ gboolean gvir_connection_fetch_storage_pools(GVirConnection *conn,
>  {
>      GVirConnectionPrivate *priv;
>      GHashTable *pools;
> -    gchar **inactive = NULL;
> -    gint ninactive = 0;
> -    gchar **active = NULL;
> -    gint nactive = 0;
> +    virStoragePoolPtr *vpools = NULL;
> +    gint npools = 0;
>      gboolean ret = FALSE;
>      gint i;
>      virConnectPtr vconn = NULL;
> -    GError *lerr = NULL;
>  
>      g_return_val_if_fail(GVIR_IS_CONNECTION(conn), FALSE);
>      g_return_val_if_fail((cancellable == NULL) || G_IS_CANCELLABLE(cancellable),
> @@ -901,77 +801,31 @@ gboolean gvir_connection_fetch_storage_pools(GVirConnection *conn,
>      if (g_cancellable_set_error_if_cancelled(cancellable, err))
>          goto cleanup;
>  
> -    active = fetch_list(vconn,
> -                        "Storage Pools",
> -                        virConnectNumOfStoragePools,
> -                        virConnectListStoragePools,
> -                        cancellable,
> -                        &nactive,
> -                        &lerr);
> -    if (lerr) {
> -        g_propagate_error(err, lerr);
> -        lerr = NULL;
> +    npools = virConnectListAllStoragePools(vconn, &vpools, 0);
> +    if (npools < 0) {
> +        gvir_set_error(err, GVIR_CONNECTION_ERROR,
> +                       0,
> +                       _("Failed to fetch list of pools"));
>          goto cleanup;
>      }
>  
>      if (g_cancellable_set_error_if_cancelled(cancellable, err))
>          goto cleanup;
>  
> -    inactive = fetch_list(vconn,
> -                          "Storage Pools",
> -                          virConnectNumOfDefinedStoragePools,
> -                          virConnectListDefinedStoragePools,
> -                          cancellable,
> -                          &ninactive,
> -                          &lerr);
> -    if (lerr) {
> -        g_propagate_error(err, lerr);
> -        lerr = NULL;
> -        goto cleanup;
> -    }
> -
>      pools = g_hash_table_new_full(g_str_hash,
>                                    g_str_equal,
>                                    NULL,
>                                    g_object_unref);
>  
> -    for (i = 0 ; i < nactive ; i++) {
> -        if (g_cancellable_set_error_if_cancelled(cancellable, err))
> -            goto cleanup;
> -
> -        virStoragePoolPtr vpool;
> +    for (i = 0 ; i < npools; i++) {
>          GVirStoragePool *pool;
>  
> -        vpool = virStoragePoolLookupByName(vconn, active[i]);
> -        if (!vpool)
> -            continue;
> -
> -        pool = GVIR_STORAGE_POOL(g_object_new(GVIR_TYPE_STORAGE_POOL,
> -                                              "handle", vpool,
> -                                              NULL));
> -        virStoragePoolFree(vpool);
> -
> -        g_hash_table_insert(pools,
> -                            (gpointer)gvir_storage_pool_get_uuid(pool),
> -                            pool);
> -    }
> -
> -    for (i = 0 ; i < ninactive ; i++) {
>          if (g_cancellable_set_error_if_cancelled(cancellable, err))
>              goto cleanup;
>  
> -        virStoragePoolPtr vpool;
> -        GVirStoragePool *pool;
> -
> -        vpool = virStoragePoolLookupByName(vconn, inactive[i]);
> -        if (!vpool)
> -            continue;
> -
>          pool = GVIR_STORAGE_POOL(g_object_new(GVIR_TYPE_STORAGE_POOL,
> -                                              "handle", vpool,
> +                                              "handle", vpools[i],
>                                                NULL));
> -        virStoragePoolFree(vpool);
> -
>          g_hash_table_insert(pools,
>                              (gpointer)gvir_storage_pool_get_uuid(pool),
>                              pool);
> @@ -987,12 +841,11 @@ gboolean gvir_connection_fetch_storage_pools(GVirConnection *conn,
>      ret = TRUE;
>  
>  cleanup:
> -    for (i = 0 ; i < nactive ; i++)
> -        g_free(active[i]);
> -    g_free(active);
> -    for (i = 0 ; i < ninactive ; i++)
> -        g_free(inactive[i]);
> -    g_free(inactive);
> +    if (npools > 0) {
> +        for (i = 0 ; i < npools; i++)
> +            virStoragePoolFree(vpools[i]);
> +        free(vpools);
> +    }
>      return ret;
>  }
>  
> -- 
> 2.4.3
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
-------------- 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/20150707/21dc433d/attachment-0001.sig>


More information about the libvir-list mailing list