On 12.09.2012 17:54, Christophe Fergeau wrote:
On Wed, Sep 12, 2012 at 05:32:00PM +0200, Michal Privoznik wrote:
> which is basically a wrapper for virConnectGetType().
> ---
>
> The list is sad as it hasn't delivered previous version.
>
> examples/conn-test.c | 12 +++++++
> libvirt-gobject/libvirt-gobject-connection.c | 45 ++++++++++++++++++++++++++
> libvirt-gobject/libvirt-gobject-connection.h | 3 ++
> libvirt-gobject/libvirt-gobject.sym | 5 +++
> 4 files changed, 65 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_error() calls abort(), so this goto cleanup; is not really useful
> }
> 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..75bf041 100644
> --- a/libvirt-gobject/libvirt-gobject-connection.c
> +++ b/libvirt-gobject/libvirt-gobject-connection.c
> @@ -1025,6 +1025,51 @@ 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;
> + gchar *ret = NULL;
> + const char *type;
> +
> + g_return_val_if_fail(GVIR_IS_CONNECTION(conn), NULL);
> + g_return_val_if_fail(err == NULL || *err == NULL, NULL);
> +
> + priv = conn->priv;
> + /* Stop another thread closing the connection just at the minute */
> + virConnectRef(priv->conn);
I'm not sure what this achieves? Another thread could close priv->conn
right before this call, so why ref it just now? Do calls to
virConnectGetType need to be protected with a ref?
I though it would be nice to have a reference counter increased through
this API so other thread don't close it right in the middle.
But now as I am rethinking this again - it is already done on libvirt level.
IOW in a racy situation it just make this API more probable to fetch
result. It depends if the last virConnectClose() is scheduled before of
after virConnectRef().
So yeah, I should have dropped it. Fixed on my local branch now.
Michal
> + if (!priv->conn) {
> + g_set_error_literal(err, GVIR_CONNECTION_ERROR, 0,
> + "Connection is not open");
opened
Christophe