[libvirt] [libvirt-glib][PATCH 1/2] gobject: Introduce gvir_connection_get_hypervisor_name

Daniel P. Berrange berrange at redhat.com
Wed Sep 12 10:41:12 UTC 2012


On Tue, Sep 11, 2012 at 07:42:41PM +0200, Michal Privoznik wrote:
> which is basically a wrapper for virConnectGetType().
> ---
>  examples/conn-test.c                         |   12 ++++++
>  libvirt-gobject/libvirt-gobject-connection.c |   53 ++++++++++++++++++++++++++
>  libvirt-gobject/libvirt-gobject-connection.h |    3 +
>  libvirt-gobject/libvirt-gobject.sym          |    5 ++
>  4 files changed, 73 insertions(+), 0 deletions(-)
> 
> diff --git a/examples/conn-test.c b/examples/conn-test.c
> index 8c70997..b90d2b0 100644
> --- a/examples/conn-test.c
> +++ b/examples/conn-test.c
> @@ -31,11 +31,23 @@ do_connection_open(GObject *source,
>  {
>      GVirConnection *conn = GVIR_CONNECTION(source);
>      GError *err = NULL;
> +    gchar *hv_name = NULL;
>  
>      if (!gvir_connection_open_finish(conn, res, &err)) {
>          g_error("%s", err->message);
> +        goto cleanup;
>      }
>      g_print("Connected to libvirt\n");
> +
> +    if (!(hv_name = gvir_connection_get_hypervisor_name(conn, &err))) {
> +        g_error("%s", err->message);
> +        goto cleanup;
> +    }
> +
> +    g_print("Hypervisor name: %s\n", hv_name);
> +
> +cleanup:
> +    g_free(hv_name);
>      g_object_unref(conn);
>  }
>  
> diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c
> index d826905..f0be875 100644
> --- a/libvirt-gobject/libvirt-gobject-connection.c
> +++ b/libvirt-gobject/libvirt-gobject-connection.c
> @@ -1025,6 +1025,59 @@ const gchar *gvir_connection_get_uri(GVirConnection *conn)
>      return conn->priv->uri;
>  }
>  
> +/**
> + * gvir_connection_get_hypervisor_name:
> + * @conn: a #GVirConnection
> + * @err: return location for any #GError
> + *
> + * Get name of current hypervisor used.
> + *
> + * Return value: new string that should be freed when no longer needed,
> + * or NULL upon error.
> + */
> +gchar *
> +gvir_connection_get_hypervisor_name(GVirConnection *conn,
> +                                    GError **err)
> +{
> +    GVirConnectionPrivate *priv;
> +    virConnectPtr vconn = NULL;
> +    gchar *ret = NULL;
> +    const char *type;
> +
> +    g_return_val_if_fail(GVIR_IS_CONNECTION(conn), NULL);
> +
> +    priv = conn->priv;
> +    g_mutex_lock(priv->lock);
> +    if (!priv->conn) {
> +        g_set_error_literal(err, GVIR_CONNECTION_ERROR, 0,
> +                            "Connection is not open");
> +        g_mutex_unlock(priv->lock);
> +        goto cleanup;
> +    }
> +
> +    vconn = priv->conn;
> +    /* Stop another thread closing the connection just at the minute */
> +    virConnectRef(vconn);
> +    g_mutex_unlock(priv->lock);
> +
> +    type = virConnectGetType(priv->conn);
> +    if (!type) {
> +        gvir_set_error_literal(err, GVIR_CONNECTION_ERROR, 0,
> +                               "Unable to get hypervisor name");
> +        goto cleanup;
> +    }
> +
> +    ret = g_strdup(type);
> +
> +cleanup:
> +    if (vconn) {
> +        g_mutex_lock(priv->lock);
> +        virConnectClose(vconn);
> +        g_mutex_unlock(priv->lock);
> +    }

There's no need to lock/unlock here, since you're not touching
anything in 'priv', and virConnectPtr has its own locking as
needed.


ACK to the rest

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