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

Michal Privoznik mprivozn at redhat.com
Wed Sep 12 16:53:11 UTC 2012


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
> 




More information about the libvir-list mailing list