
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