[libvirt] [libvirt-glib 1/9] doc: add some missing return value documentation

From: Marc-André Lureau <marcandre.lureau@gmail.com> --- libvirt-gobject/libvirt-gobject-stream.c | 1 + libvirt-gobject/libvirt-gobject-stream.h | 2 ++ 2 files changed, 3 insertions(+), 0 deletions(-) diff --git a/libvirt-gobject/libvirt-gobject-stream.c b/libvirt-gobject/libvirt-gobject-stream.c index 255ad73..519d733 100644 --- a/libvirt-gobject/libvirt-gobject-stream.c +++ b/libvirt-gobject/libvirt-gobject-stream.c @@ -191,6 +191,7 @@ stream_sink(virStreamPtr st G_GNUC_UNUSED, * @stream: the stream * @func: (scope notified): the callback for writing data to application * @user_data: (closure): data to be passed to @callback + * Returns: the number of bytes consumed or -1 upon error * * Receive the entire data stream, sending the data to the * requested data sink. This is simply a convenient alternative diff --git a/libvirt-gobject/libvirt-gobject-stream.h b/libvirt-gobject/libvirt-gobject-stream.h index 27fa8b7..fd9c9bb 100644 --- a/libvirt-gobject/libvirt-gobject-stream.h +++ b/libvirt-gobject/libvirt-gobject-stream.h @@ -65,6 +65,8 @@ struct _GVirStreamClass * @buf: data pointer * @nbytes: data size * @user_data: user data passed to the function + * Returns: the number of bytes filled, 0 upon end + * of file, or -1 upon error */ typedef gint (* GVirStreamSinkFunc) (GVirStream *stream, const gchar *buf, -- 1.7.6.2

--- libvirt-glib/libvirt-glib-event.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-) diff --git a/libvirt-glib/libvirt-glib-event.c b/libvirt-glib/libvirt-glib-event.c index 65af739..a785c93 100644 --- a/libvirt-glib/libvirt-glib-event.c +++ b/libvirt-glib/libvirt-glib-event.c @@ -359,7 +359,8 @@ cleanup: } -void gvir_event_register(void) { +static gpointer event_register_once(gpointer data G_GNUC_UNUSED) +{ eventlock = g_mutex_new(); virEventRegisterImpl(gvir_event_handle_add, gvir_event_handle_update, @@ -367,5 +368,13 @@ void gvir_event_register(void) { gvir_event_timeout_add, gvir_event_timeout_update, gvir_event_timeout_remove); + return NULL; +} + +void gvir_event_register(void) +{ + static GOnce once = G_ONCE_INIT; + + g_once(&once, event_register_once, NULL); } -- 1.7.6.2

--- .mailmap | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) create mode 100644 .mailmap diff --git a/.mailmap b/.mailmap new file mode 100644 index 0000000..482a46e --- /dev/null +++ b/.mailmap @@ -0,0 +1,5 @@ +# Format of each line: +# <Preferred address in AUTHORS> <other alias used by same author> + +<berrange@redhat.com> <dan@berrange.com> +<marcandre.lureau@redhat.com> <marcandre.lureau@gmail.com> -- 1.7.6.2

--- libvirt-gobject/libvirt-gobject-connection.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c index c0c47da..aa4a320 100644 --- a/libvirt-gobject/libvirt-gobject-connection.c +++ b/libvirt-gobject/libvirt-gobject-connection.c @@ -505,7 +505,7 @@ gboolean gvir_connection_fetch_domains(GVirConnection *conn, NULL)); g_hash_table_insert(doms, - g_strdup(gvir_domain_get_uuid(dom)), + gvir_domain_get_uuid(dom), dom); } @@ -523,7 +523,7 @@ gboolean gvir_connection_fetch_domains(GVirConnection *conn, NULL)); g_hash_table_insert(doms, - g_strdup(gvir_domain_get_uuid(dom)), + gvir_domain_get_uuid(dom), dom); } @@ -604,7 +604,7 @@ gboolean gvir_connection_fetch_storage_pools(GVirConnection *conn, pools = g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, + NULL, g_object_unref); for (i = 0 ; i < nactive ; i++) { @@ -623,7 +623,7 @@ gboolean gvir_connection_fetch_storage_pools(GVirConnection *conn, NULL)); g_hash_table_insert(pools, - g_strdup(gvir_storage_pool_get_uuid(pool)), + gvir_storage_pool_get_uuid(pool), pool); } @@ -643,7 +643,7 @@ gboolean gvir_connection_fetch_storage_pools(GVirConnection *conn, NULL)); g_hash_table_insert(pools, - g_strdup(gvir_storage_pool_get_uuid(pool)), + gvir_storage_pool_get_uuid(pool), pool); } @@ -1046,7 +1046,7 @@ GVirDomain *gvir_connection_create_domain(GVirConnection *conn, g_mutex_lock(priv->lock); g_hash_table_insert(priv->domains, - g_strdup(gvir_domain_get_uuid(domain)), + gvir_domain_get_uuid(domain), domain); g_mutex_unlock(priv->lock); -- 1.7.6.2

--- libvirt-gobject/libvirt-gobject-domain.c | 59 ++++++++++++++++++++++++++++++ 1 files changed, 59 insertions(+), 0 deletions(-) diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index 75e7eb9..001c787 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -49,6 +49,16 @@ enum { PROP_HANDLE, }; +enum { + VIR_STARTED, + VIR_SUSPENDED, + VIR_RESUMED, + VIR_STOPPED, + VIR_UPDATED, + LAST_SIGNAL +}; + +static gint signals[LAST_SIGNAL]; #define GVIR_DOMAIN_ERROR gvir_domain_error_quark() @@ -133,6 +143,55 @@ static void gvir_domain_class_init(GVirDomainClass *klass) G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + signals[VIR_STARTED] = g_signal_new("vir-started", + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | + G_SIGNAL_NO_HOOKS | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 1, G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE); + + signals[VIR_SUSPENDED] = g_signal_new("vir-suspended", + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | + G_SIGNAL_NO_HOOKS | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 1, G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE); + + signals[VIR_RESUMED] = g_signal_new("vir-resumed", + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | + G_SIGNAL_NO_HOOKS | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 1, G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE); + + signals[VIR_STOPPED] = g_signal_new("vir-stopped", + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | + G_SIGNAL_NO_HOOKS | G_SIGNAL_DETAILED, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 1, G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE); + + signals[VIR_UPDATED] = g_signal_new("vir-updated", + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, + 0, + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, + 0); + g_type_class_add_private(klass, sizeof(GVirDomainPrivate)); } -- 1.7.6.2

--- libvirt-gobject/libvirt-gobject-connection.c | 36 +++++++++++++++------- libvirt-gobject/libvirt-gobject-network-filter.c | 14 ++++---- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c index aa4a320..4cbebe0 100644 --- a/libvirt-gobject/libvirt-gobject-connection.c +++ b/libvirt-gobject/libvirt-gobject-connection.c @@ -55,6 +55,15 @@ enum { PROP_HANDLE, }; +enum { + VIR_CONNECTION_OPENED, + VIR_CONNECTION_CLOSED, + VIR_DOMAIN_ADDED, + VIR_DOMAIN_REMOVED, + LAST_SIGNAL +}; + +static gint signals[LAST_SIGNAL]; #define GVIR_CONNECTION_ERROR gvir_connection_error_quark() @@ -137,7 +146,7 @@ static GVirStream* gvir_connection_stream_new(GVirConnection *self G_GNUC_UNUSED static void gvir_connection_class_init(GVirConnectionClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS(klass); object_class->finalize = gvir_connection_finalize; object_class->get_property = gvir_connection_get_property; @@ -158,7 +167,7 @@ static void gvir_connection_class_init(GVirConnectionClass *klass) G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); - g_signal_new("vir-connection-opened", + signals[VIR_CONNECTION_OPENED] = g_signal_new("vir-connection-opened", G_OBJECT_CLASS_TYPE(object_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(GVirConnectionClass, vir_connection_opened), @@ -166,7 +175,8 @@ static void gvir_connection_class_init(GVirConnectionClass *klass) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - g_signal_new("vir-connection-closed", + + signals[VIR_CONNECTION_CLOSED] = g_signal_new("vir-connection-closed", G_OBJECT_CLASS_TYPE(object_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(GVirConnectionClass, vir_connection_closed), @@ -175,22 +185,25 @@ static void gvir_connection_class_init(GVirConnectionClass *klass) G_TYPE_NONE, 0); - g_signal_new("vir-domain-added", + signals[VIR_DOMAIN_ADDED] = g_signal_new("vir-domain-added", G_OBJECT_CLASS_TYPE(object_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(GVirConnectionClass, vir_domain_added), NULL, NULL, - g_cclosure_marshal_VOID__VOID, + g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, - 0); - g_signal_new("vir-domain-removed", + 1, + G_TYPE_OBJECT); + + signals[VIR_DOMAIN_REMOVED] = g_signal_new("vir-domain-removed", G_OBJECT_CLASS_TYPE(object_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(GVirConnectionClass, vir_domain_removed), NULL, NULL, - g_cclosure_marshal_VOID__VOID, + g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, - 0); + 1, + G_TYPE_OBJECT); g_object_class_install_property(object_class, PROP_HANDLE, @@ -266,7 +279,8 @@ gboolean gvir_connection_open(GVirConnection *conn, g_mutex_unlock(priv->lock); - g_signal_emit_by_name(conn, "vir-connection-opened"); + g_signal_emit(conn, signals[VIR_CONNECTION_OPENED], 0); + return TRUE; } @@ -371,7 +385,7 @@ void gvir_connection_close(GVirConnection *conn) g_mutex_unlock(priv->lock); - g_signal_emit_by_name(conn, "vir-connection-closed"); + g_signal_emit(conn, signals[VIR_CONNECTION_CLOSED], 0); } typedef gint (* CountFunction) (virConnectPtr vconn); diff --git a/libvirt-gobject/libvirt-gobject-network-filter.c b/libvirt-gobject/libvirt-gobject-network-filter.c index 467627f..020cdc0 100644 --- a/libvirt-gobject/libvirt-gobject-network-filter.c +++ b/libvirt-gobject/libvirt-gobject-network-filter.c @@ -64,8 +64,8 @@ static void gvir_network_filter_get_property(GObject *object, GValue *value, GParamSpec *pspec) { - GVirNetworkFilter *conn = GVIR_NETWORK_FILTER(object); - GVirNetworkFilterPrivate *priv = conn->priv; + GVirNetworkFilter *nf = GVIR_NETWORK_FILTER(object); + GVirNetworkFilterPrivate *priv = nf->priv; switch (prop_id) { case PROP_HANDLE: @@ -83,8 +83,8 @@ static void gvir_network_filter_set_property(GObject *object, const GValue *value, GParamSpec *pspec) { - GVirNetworkFilter *conn = GVIR_NETWORK_FILTER(object); - GVirNetworkFilterPrivate *priv = conn->priv; + GVirNetworkFilter *nf = GVIR_NETWORK_FILTER(object); + GVirNetworkFilterPrivate *priv = nf->priv; switch (prop_id) { case PROP_HANDLE: @@ -101,10 +101,10 @@ static void gvir_network_filter_set_property(GObject *object, static void gvir_network_filter_finalize(GObject *object) { - GVirNetworkFilter *conn = GVIR_NETWORK_FILTER(object); - GVirNetworkFilterPrivate *priv = conn->priv; + GVirNetworkFilter *nf = GVIR_NETWORK_FILTER(object); + GVirNetworkFilterPrivate *priv = nf->priv; - DEBUG("Finalize GVirNetworkFilter=%p", conn); + DEBUG("Finalize GVirNetworkFilter=%p", nf); virNWFilterFree(priv->handle); -- 1.7.6.2

The string is not so large, we avoid fragmentation and duplication (especially in hashtable) --- libvirt-gobject/libvirt-gobject-connection.c | 12 +++++----- libvirt-gobject/libvirt-gobject-domain.c | 26 ++++++++++++++++------ libvirt-gobject/libvirt-gobject-domain.h | 2 +- libvirt-gobject/libvirt-gobject-network-filter.c | 26 ++++++++++++++++------ libvirt-gobject/libvirt-gobject-network-filter.h | 2 +- libvirt-gobject/libvirt-gobject-network.c | 24 ++++++++++++++------ libvirt-gobject/libvirt-gobject-network.h | 2 +- libvirt-gobject/libvirt-gobject-secret.c | 26 ++++++++++++++++------ libvirt-gobject/libvirt-gobject-secret.h | 2 +- libvirt-gobject/libvirt-gobject-storage-pool.c | 26 ++++++++++++++++------ libvirt-gobject/libvirt-gobject-storage-pool.h | 2 +- 11 files changed, 104 insertions(+), 46 deletions(-) diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c index 4cbebe0..e99a08d 100644 --- a/libvirt-gobject/libvirt-gobject-connection.c +++ b/libvirt-gobject/libvirt-gobject-connection.c @@ -502,7 +502,7 @@ gboolean gvir_connection_fetch_domains(GVirConnection *conn, doms = g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, + NULL, g_object_unref); for (i = 0 ; i < nactive ; i++) { @@ -519,7 +519,7 @@ gboolean gvir_connection_fetch_domains(GVirConnection *conn, NULL)); g_hash_table_insert(doms, - gvir_domain_get_uuid(dom), + (gpointer)gvir_domain_get_uuid(dom), dom); } @@ -537,7 +537,7 @@ gboolean gvir_connection_fetch_domains(GVirConnection *conn, NULL)); g_hash_table_insert(doms, - gvir_domain_get_uuid(dom), + (gpointer)gvir_domain_get_uuid(dom), dom); } @@ -637,7 +637,7 @@ gboolean gvir_connection_fetch_storage_pools(GVirConnection *conn, NULL)); g_hash_table_insert(pools, - gvir_storage_pool_get_uuid(pool), + (gpointer)gvir_storage_pool_get_uuid(pool), pool); } @@ -657,7 +657,7 @@ gboolean gvir_connection_fetch_storage_pools(GVirConnection *conn, NULL)); g_hash_table_insert(pools, - gvir_storage_pool_get_uuid(pool), + (gpointer)gvir_storage_pool_get_uuid(pool), pool); } @@ -1060,7 +1060,7 @@ GVirDomain *gvir_connection_create_domain(GVirConnection *conn, g_mutex_lock(priv->lock); g_hash_table_insert(priv->domains, - gvir_domain_get_uuid(domain), + (gpointer)gvir_domain_get_uuid(domain), domain); g_mutex_unlock(priv->lock); diff --git a/libvirt-gobject/libvirt-gobject-domain.c b/libvirt-gobject/libvirt-gobject-domain.c index 001c787..41545f2 100644 --- a/libvirt-gobject/libvirt-gobject-domain.c +++ b/libvirt-gobject/libvirt-gobject-domain.c @@ -39,6 +39,7 @@ extern gboolean debugFlag; struct _GVirDomainPrivate { virDomainPtr handle; + gchar uuid[VIR_UUID_STRING_BUFLEN]; }; G_DEFINE_TYPE(GVirDomain, gvir_domain, G_TYPE_OBJECT); @@ -122,6 +123,20 @@ static void gvir_domain_finalize(GObject *object) } +static void gvir_domain_constructed(GObject *object) +{ + GVirDomain *conn = GVIR_DOMAIN(object); + GVirDomainPrivate *priv = conn->priv; + + G_OBJECT_CLASS(gvir_domain_parent_class)->constructed(object); + + /* xxx we may want to turn this into an initable */ + if (virDomainGetUUIDString(priv->handle, priv->uuid) < 0) { + g_error("Failed to get domain UUID on %p", priv->handle); + } +} + + static void gvir_domain_class_init(GVirDomainClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -129,6 +144,7 @@ static void gvir_domain_class_init(GVirDomainClass *klass) object_class->finalize = gvir_domain_finalize; object_class->get_property = gvir_domain_get_property; object_class->set_property = gvir_domain_set_property; + object_class->constructed = gvir_domain_constructed; g_object_class_install_property(object_class, PROP_HANDLE, @@ -269,15 +285,11 @@ const gchar *gvir_domain_get_name(GVirDomain *dom) } -gchar *gvir_domain_get_uuid(GVirDomain *dom) +const gchar *gvir_domain_get_uuid(GVirDomain *dom) { - GVirDomainPrivate *priv = dom->priv; - char *uuid = g_new(gchar, VIR_UUID_STRING_BUFLEN); + g_return_val_if_fail(GVIR_IS_DOMAIN(dom), NULL); - if (virDomainGetUUIDString(priv->handle, uuid) < 0) { - g_error("Failed to get domain UUID on %p", priv->handle); - } - return uuid; + return dom->priv->uuid; } gint gvir_domain_get_id(GVirDomain *dom, diff --git a/libvirt-gobject/libvirt-gobject-domain.h b/libvirt-gobject/libvirt-gobject-domain.h index 292f42e..4fb8541 100644 --- a/libvirt-gobject/libvirt-gobject-domain.h +++ b/libvirt-gobject/libvirt-gobject-domain.h @@ -91,7 +91,7 @@ GType gvir_domain_info_get_type(void); GType gvir_domain_handle_get_type(void); const gchar *gvir_domain_get_name(GVirDomain *dom); -gchar *gvir_domain_get_uuid(GVirDomain *dom); +const gchar *gvir_domain_get_uuid(GVirDomain *dom); gint gvir_domain_get_id(GVirDomain *dom, GError **err); diff --git a/libvirt-gobject/libvirt-gobject-network-filter.c b/libvirt-gobject/libvirt-gobject-network-filter.c index 020cdc0..eb10ce9 100644 --- a/libvirt-gobject/libvirt-gobject-network-filter.c +++ b/libvirt-gobject/libvirt-gobject-network-filter.c @@ -39,6 +39,7 @@ extern gboolean debugFlag; struct _GVirNetworkFilterPrivate { virNWFilterPtr handle; + gchar uuid[VIR_UUID_STRING_BUFLEN]; }; G_DEFINE_TYPE(GVirNetworkFilter, gvir_network_filter, G_TYPE_OBJECT); @@ -112,6 +113,20 @@ static void gvir_network_filter_finalize(GObject *object) } +static void gvir_network_filter_constructed(GObject *object) +{ + GVirNetworkFilter *nf = GVIR_NETWORK_FILTER(object); + GVirNetworkFilterPrivate *priv = nf->priv; + + G_OBJECT_CLASS(gvir_network_filter_parent_class)->constructed(object); + + /* xxx we may want to turn this into an initable */ + if (virNWFilterGetUUIDString(priv->handle, priv->uuid) < 0) { + g_error("Failed to get network filter UUID on %p", priv->handle); + } +} + + static void gvir_network_filter_class_init(GVirNetworkFilterClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -119,6 +134,7 @@ static void gvir_network_filter_class_init(GVirNetworkFilterClass *klass) object_class->finalize = gvir_network_filter_finalize; object_class->get_property = gvir_network_filter_get_property; object_class->set_property = gvir_network_filter_set_property; + object_class->constructed = gvir_network_filter_constructed; g_object_class_install_property(object_class, PROP_HANDLE, @@ -183,15 +199,11 @@ const gchar *gvir_network_filter_get_name(GVirNetworkFilter *filter) } -gchar *gvir_network_filter_get_uuid(GVirNetworkFilter *filter) +const gchar *gvir_network_filter_get_uuid(GVirNetworkFilter *filter) { - GVirNetworkFilterPrivate *priv = filter->priv; - char *uuid = g_new(gchar, VIR_UUID_STRING_BUFLEN); + g_return_val_if_fail(GVIR_IS_NETWORK_FILTER(filter), NULL); - if (virNWFilterGetUUIDString(priv->handle, uuid) < 0) { - g_error("Failed to get network_filter UUID on %p", priv->handle); - } - return uuid; + return filter->priv->uuid; } diff --git a/libvirt-gobject/libvirt-gobject-network-filter.h b/libvirt-gobject/libvirt-gobject-network-filter.h index b2b00df..f2c63cf 100644 --- a/libvirt-gobject/libvirt-gobject-network-filter.h +++ b/libvirt-gobject/libvirt-gobject-network-filter.h @@ -62,7 +62,7 @@ GType gvir_network_filter_get_type(void); GType gvir_network_filter_handle_get_type(void); const gchar *gvir_network_filter_get_name(GVirNetworkFilter *filter); -gchar *gvir_network_filter_get_uuid(GVirNetworkFilter *filter); +const gchar *gvir_network_filter_get_uuid(GVirNetworkFilter *filter); GVirConfigNetworkFilter *gvir_network_filter_get_config (GVirNetworkFilter *filter, diff --git a/libvirt-gobject/libvirt-gobject-network.c b/libvirt-gobject/libvirt-gobject-network.c index c9dd82d..158afa4 100644 --- a/libvirt-gobject/libvirt-gobject-network.c +++ b/libvirt-gobject/libvirt-gobject-network.c @@ -39,6 +39,7 @@ extern gboolean debugFlag; struct _GVirNetworkPrivate { virNetworkPtr handle; + gchar uuid[VIR_UUID_STRING_BUFLEN]; }; G_DEFINE_TYPE(GVirNetwork, gvir_network, G_TYPE_OBJECT); @@ -111,6 +112,18 @@ static void gvir_network_finalize(GObject *object) G_OBJECT_CLASS(gvir_network_parent_class)->finalize(object); } +static void gvir_network_constructed(GObject *object) +{ + GVirNetwork *net = GVIR_NETWORK(object); + GVirNetworkPrivate *priv = net->priv; + + G_OBJECT_CLASS(gvir_network_parent_class)->constructed(object); + + /* xxx we may want to turn this into an initable */ + if (virNetworkGetUUIDString(priv->handle, priv->uuid) < 0) { + g_error("Failed to get network UUID on %p", priv->handle); + } +} static void gvir_network_class_init(GVirNetworkClass *klass) { @@ -119,6 +132,7 @@ static void gvir_network_class_init(GVirNetworkClass *klass) object_class->finalize = gvir_network_finalize; object_class->get_property = gvir_network_get_property; object_class->set_property = gvir_network_set_property; + object_class->constructed = gvir_network_constructed; g_object_class_install_property(object_class, PROP_HANDLE, @@ -183,15 +197,11 @@ const gchar *gvir_network_get_name(GVirNetwork *network) } -gchar *gvir_network_get_uuid(GVirNetwork *network) +const gchar *gvir_network_get_uuid(GVirNetwork *network) { - GVirNetworkPrivate *priv = network->priv; - char *uuid = g_new(gchar, VIR_UUID_STRING_BUFLEN); + g_return_val_if_fail(GVIR_IS_NETWORK(network), NULL); - if (virNetworkGetUUIDString(priv->handle, uuid) < 0) { - g_error("Failed to get network UUID on %p", priv->handle); - } - return uuid; + return network->priv->uuid; } /** diff --git a/libvirt-gobject/libvirt-gobject-network.h b/libvirt-gobject/libvirt-gobject-network.h index 23437d0..79f37e7 100644 --- a/libvirt-gobject/libvirt-gobject-network.h +++ b/libvirt-gobject/libvirt-gobject-network.h @@ -66,7 +66,7 @@ GType gvir_network_get_type(void); GType gvir_network_handle_get_type(void); const gchar *gvir_network_get_name(GVirNetwork *network); -gchar *gvir_network_get_uuid(GVirNetwork *network); +const gchar *gvir_network_get_uuid(GVirNetwork *network); GVirConfigNetwork *gvir_network_get_config(GVirNetwork *network, guint64 flags, diff --git a/libvirt-gobject/libvirt-gobject-secret.c b/libvirt-gobject/libvirt-gobject-secret.c index 112333d..ffff521 100644 --- a/libvirt-gobject/libvirt-gobject-secret.c +++ b/libvirt-gobject/libvirt-gobject-secret.c @@ -39,6 +39,7 @@ extern gboolean debugFlag; struct _GVirSecretPrivate { virSecretPtr handle; + gchar uuid[VIR_UUID_STRING_BUFLEN]; }; G_DEFINE_TYPE(GVirSecret, gvir_secret, G_TYPE_OBJECT); @@ -112,6 +113,20 @@ static void gvir_secret_finalize(GObject *object) } +static void gvir_secret_constructed(GObject *object) +{ + GVirSecret *conn = GVIR_SECRET(object); + GVirSecretPrivate *priv = conn->priv; + + G_OBJECT_CLASS(gvir_secret_parent_class)->constructed(object); + + /* xxx we may want to turn this into an initable */ + if (virSecretGetUUIDString(priv->handle, priv->uuid) < 0) { + g_error("Failed to get secret UUID on %p", priv->handle); + } +} + + static void gvir_secret_class_init(GVirSecretClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -119,6 +134,7 @@ static void gvir_secret_class_init(GVirSecretClass *klass) object_class->finalize = gvir_secret_finalize; object_class->get_property = gvir_secret_get_property; object_class->set_property = gvir_secret_set_property; + object_class->constructed = gvir_secret_constructed; g_object_class_install_property(object_class, PROP_HANDLE, @@ -170,15 +186,11 @@ GType gvir_secret_handle_get_type(void) } -gchar *gvir_secret_get_uuid(GVirSecret *secret) +const gchar *gvir_secret_get_uuid(GVirSecret *secret) { - GVirSecretPrivate *priv = secret->priv; - char *uuid = g_new(gchar, VIR_UUID_STRING_BUFLEN); + g_return_val_if_fail(GVIR_IS_SECRET(secret), NULL); - if (virSecretGetUUIDString(priv->handle, uuid) < 0) { - g_error("Failed to get secret UUID on %p", priv->handle); - } - return uuid; + return secret->priv->uuid; } diff --git a/libvirt-gobject/libvirt-gobject-secret.h b/libvirt-gobject/libvirt-gobject-secret.h index 0023245..443ffde 100644 --- a/libvirt-gobject/libvirt-gobject-secret.h +++ b/libvirt-gobject/libvirt-gobject-secret.h @@ -63,7 +63,7 @@ GType gvir_secret_get_type(void); GType gvir_secret_handle_get_type(void); const gchar *gvir_secret_get_name(GVirSecret *secret); -gchar *gvir_secret_get_uuid(GVirSecret *secret); +const gchar *gvir_secret_get_uuid(GVirSecret *secret); GVirConfigSecret *gvir_secret_get_config(GVirSecret *secret, guint64 flags, diff --git a/libvirt-gobject/libvirt-gobject-storage-pool.c b/libvirt-gobject/libvirt-gobject-storage-pool.c index 0959642..0e796f9 100644 --- a/libvirt-gobject/libvirt-gobject-storage-pool.c +++ b/libvirt-gobject/libvirt-gobject-storage-pool.c @@ -39,6 +39,7 @@ extern gboolean debugFlag; struct _GVirStoragePoolPrivate { virStoragePoolPtr handle; + gchar uuid[VIR_UUID_STRING_BUFLEN]; }; G_DEFINE_TYPE(GVirStoragePool, gvir_storage_pool, G_TYPE_OBJECT); @@ -112,6 +113,20 @@ static void gvir_storage_pool_finalize(GObject *object) } +static void gvir_storage_pool_constructed(GObject *object) +{ + GVirStoragePool *conn = GVIR_STORAGE_POOL(object); + GVirStoragePoolPrivate *priv = conn->priv; + + G_OBJECT_CLASS(gvir_storage_pool_parent_class)->constructed(object); + + /* xxx we may want to turn this into an initable */ + if (virStoragePoolGetUUIDString(priv->handle, priv->uuid) < 0) { + g_error("Failed to get storage pool UUID on %p", priv->handle); + } +} + + static void gvir_storage_pool_class_init(GVirStoragePoolClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -119,6 +134,7 @@ static void gvir_storage_pool_class_init(GVirStoragePoolClass *klass) object_class->finalize = gvir_storage_pool_finalize; object_class->get_property = gvir_storage_pool_get_property; object_class->set_property = gvir_storage_pool_set_property; + object_class->constructed = gvir_storage_pool_constructed; g_object_class_install_property(object_class, PROP_HANDLE, @@ -183,15 +199,11 @@ const gchar *gvir_storage_pool_get_name(GVirStoragePool *pool) } -gchar *gvir_storage_pool_get_uuid(GVirStoragePool *pool) +const gchar *gvir_storage_pool_get_uuid(GVirStoragePool *pool) { - GVirStoragePoolPrivate *priv = pool->priv; - char *uuid = g_new(gchar, VIR_UUID_STRING_BUFLEN); + g_return_val_if_fail(GVIR_IS_STORAGE_POOL(pool), NULL); - if (virStoragePoolGetUUIDString(priv->handle, uuid) < 0) { - g_error("Failed to get storage_pool UUID on %p", priv->handle); - } - return uuid; + return pool->priv->uuid; } diff --git a/libvirt-gobject/libvirt-gobject-storage-pool.h b/libvirt-gobject/libvirt-gobject-storage-pool.h index ffd5db7..e91827e 100644 --- a/libvirt-gobject/libvirt-gobject-storage-pool.h +++ b/libvirt-gobject/libvirt-gobject-storage-pool.h @@ -63,7 +63,7 @@ GType gvir_storage_pool_get_type(void); GType gvir_storage_pool_handle_get_type(void); const gchar *gvir_storage_pool_get_name(GVirStoragePool *pool); -gchar *gvir_storage_pool_get_uuid(GVirStoragePool *pool); +const gchar *gvir_storage_pool_get_uuid(GVirStoragePool *pool); GVirConfigStoragePool *gvir_storage_pool_get_config(GVirStoragePool *pool, guint64 flags, -- 1.7.6.2

On Wed, Sep 28, 2011 at 9:30 PM, Marc-André Lureau <marcandre.lureau@gmail.com> wrote:
The string is not so large, we avoid fragmentation and duplication (especially in hashtable)
"static" is the wrong word, I meant const. -- Marc-André Lureau

--- libvirt-gobject/libvirt-gobject-connection.c | 126 ++++++++++++++++++++++++++ 1 files changed, 126 insertions(+), 0 deletions(-) diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c index e99a08d..34781e6 100644 --- a/libvirt-gobject/libvirt-gobject-connection.c +++ b/libvirt-gobject/libvirt-gobject-connection.c @@ -148,6 +148,8 @@ static void gvir_connection_class_init(GVirConnectionClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS(klass); + gvir_event_register(); + object_class->finalize = gvir_connection_finalize; object_class->get_property = gvir_connection_get_property; object_class->set_property = gvir_connection_set_property; @@ -244,6 +246,125 @@ GVirConnection *gvir_connection_new(const char *uri) } +static int domain_event_cb(virConnectPtr conn G_GNUC_UNUSED, + virDomainPtr dom, + int event, + int detail, + void *opaque) +{ + gchar uuid[VIR_UUID_STRING_BUFLEN]; + GVirConnection *gconn = opaque; + GVirDomain *gdom; + GVirConnectionPrivate *priv = gconn->priv; + + if (virDomainGetUUIDString(dom, uuid) < 0) { + g_warning("Failed to get domain UUID on %p", dom); + return 0; + } + + DEBUG("%s: %s event:%d, detail:%d", G_STRFUNC, uuid, event, detail); + + g_mutex_lock(priv->lock); + gdom = g_hash_table_lookup(priv->domains, uuid); + g_mutex_unlock(priv->lock); + + if (gdom == NULL) { + gdom = GVIR_DOMAIN(g_object_new(GVIR_TYPE_DOMAIN, "handle", dom, NULL)); + + g_mutex_lock(priv->lock); + g_hash_table_insert(priv->domains, (gpointer)gvir_domain_get_uuid(gdom), gdom); + g_mutex_unlock(priv->lock); + } + + switch (event) { + case VIR_DOMAIN_EVENT_DEFINED: + if (detail == VIR_DOMAIN_EVENT_DEFINED_ADDED) + g_signal_emit(gconn, signals[VIR_DOMAIN_ADDED], 0, gdom); + else if (detail == VIR_DOMAIN_EVENT_DEFINED_UPDATED) + g_signal_emit_by_name(gdom, "vir-updated"); + else + g_warn_if_reached(); + break; + + case VIR_DOMAIN_EVENT_UNDEFINED: + if (detail == VIR_DOMAIN_EVENT_UNDEFINED_REMOVED) { + g_mutex_lock(priv->lock); + g_hash_table_steal(priv->domains, uuid); + g_mutex_unlock(priv->lock); + + g_signal_emit(gconn, signals[VIR_DOMAIN_REMOVED], 0, gdom); + g_object_unref(gdom); + } else + g_warn_if_reached(); + break; + + case VIR_DOMAIN_EVENT_STARTED: + if (detail == VIR_DOMAIN_EVENT_STARTED_BOOTED) + g_signal_emit_by_name(gdom, "vir-started::booted"); + else if (detail == VIR_DOMAIN_EVENT_STARTED_MIGRATED) + g_signal_emit_by_name(gdom, "vir-started::migrated"); + else if (detail == VIR_DOMAIN_EVENT_STARTED_RESTORED) + g_signal_emit_by_name(gdom, "vir-started::restored"); + else if (detail == VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT) + g_signal_emit_by_name(gdom, "vir-started::from-snapshot"); + else + g_warn_if_reached(); + break; + + case VIR_DOMAIN_EVENT_SUSPENDED: + if (detail == VIR_DOMAIN_EVENT_SUSPENDED_PAUSED) + g_signal_emit_by_name(gdom, "vir-suspended::paused"); + else if (detail == VIR_DOMAIN_EVENT_SUSPENDED_MIGRATED) + g_signal_emit_by_name(gdom, "vir-suspended::migrated"); + else if (detail == VIR_DOMAIN_EVENT_SUSPENDED_IOERROR) + g_signal_emit_by_name(gdom, "vir-suspended::ioerror"); + else if (detail == VIR_DOMAIN_EVENT_SUSPENDED_WATCHDOG) + g_signal_emit_by_name(gdom, "vir-suspended::watchdog"); + else if (detail == VIR_DOMAIN_EVENT_SUSPENDED_RESTORED) + g_signal_emit_by_name(gdom, "vir-suspended::restored"); + else if (detail == VIR_DOMAIN_EVENT_SUSPENDED_FROM_SNAPSHOT) + g_signal_emit_by_name(gdom, "vir-suspended::from-snapshot"); + else + g_warn_if_reached(); + break; + + case VIR_DOMAIN_EVENT_RESUMED: + if (detail == VIR_DOMAIN_EVENT_RESUMED_UNPAUSED) + g_signal_emit_by_name(gdom, "vir-resumed::unpaused"); + else if (detail == VIR_DOMAIN_EVENT_RESUMED_MIGRATED) + g_signal_emit_by_name(gdom, "vir-resumed::migrated"); + else if (detail == VIR_DOMAIN_EVENT_RESUMED_FROM_SNAPSHOT) + g_signal_emit_by_name(gdom, "vir-resumed::from-snapshot"); + else + g_warn_if_reached(); + break; + + case VIR_DOMAIN_EVENT_STOPPED: + if (detail == VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN) + g_signal_emit_by_name(gdom, "vir-stopped::shutdown"); + else if (detail == VIR_DOMAIN_EVENT_STOPPED_DESTROYED) + g_signal_emit_by_name(gdom, "vir-stopped::destroyed"); + else if (detail == VIR_DOMAIN_EVENT_STOPPED_CRASHED) + g_signal_emit_by_name(gdom, "vir-stopped::crashed"); + else if (detail == VIR_DOMAIN_EVENT_STOPPED_MIGRATED) + g_signal_emit_by_name(gdom, "vir-stopped::migrated"); + else if (detail == VIR_DOMAIN_EVENT_STOPPED_SAVED) + g_signal_emit_by_name(gdom, "vir-stopped::saved"); + else if (detail == VIR_DOMAIN_EVENT_STOPPED_FAILED) + g_signal_emit_by_name(gdom, "vir-stopped::failed"); + else if (detail == VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT) + g_signal_emit_by_name(gdom, "vir-stopped::from-snapshot"); + else + g_warn_if_reached(); + break; + + default: + g_warn_if_reached(); + } + + return 0; +} + /** * gvir_connection_open: * @conn: the connection @@ -277,6 +398,10 @@ gboolean gvir_connection_open(GVirConnection *conn, return FALSE; } + if (virConnectDomainEventRegister(priv->conn, domain_event_cb, conn, NULL) == -1) { + g_warning("Failed to register domain events, ignoring"); + } + g_mutex_unlock(priv->lock); g_signal_emit(conn, signals[VIR_CONNECTION_OPENED], 0); @@ -378,6 +503,7 @@ void gvir_connection_close(GVirConnection *conn) } if (priv->conn) { + virConnectDomainEventDeregister(priv->conn, domain_event_cb); virConnectClose(priv->conn); priv->conn = NULL; } -- 1.7.6.2

On Wed, Sep 28, 2011 at 09:30:57PM +0200, Marc-André Lureau wrote:
--- libvirt-gobject/libvirt-gobject-connection.c | 126 ++++++++++++++++++++++++++ 1 files changed, 126 insertions(+), 0 deletions(-)
diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c index e99a08d..34781e6 100644 --- a/libvirt-gobject/libvirt-gobject-connection.c +++ b/libvirt-gobject/libvirt-gobject-connection.c
@@ -277,6 +398,10 @@ gboolean gvir_connection_open(GVirConnection *conn, return FALSE; }
+ if (virConnectDomainEventRegister(priv->conn, domain_event_cb, conn, NULL) == -1) { + g_warning("Failed to register domain events, ignoring"); + } +
You might have noticed that we jump through some horrific hoops in gvir_connection_fetch_domains(). The reason for this is so that we can issue fake event notifications for start/stopped/added/removed when virConnectDomainEventRegister() is not available. Not all hypervisors support the virConnectDomainEventRegister() API, so we need that fallback code. When you succesfully call virConnectDomainEventRegister(), we should disable the event emitting part at the end of gvir_connection_fetch_domains() to avoid duplicate events. 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 :|

--- libvirt-gobject/libvirt-gobject-domain-snapshot.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/libvirt-gobject/libvirt-gobject-domain-snapshot.c b/libvirt-gobject/libvirt-gobject-domain-snapshot.c index 0f9e826..cc17b60 100644 --- a/libvirt-gobject/libvirt-gobject-domain-snapshot.c +++ b/libvirt-gobject/libvirt-gobject-domain-snapshot.c @@ -187,6 +187,8 @@ const gchar *gvir_domain_snapshot_get_name(GVirDomainSnapshot *snapshot) if (snapshot || !snapshot) return NULL; #endif + + g_return_val_if_reached(NULL); } -- 1.7.6.2

On Wed, Sep 28, 2011 at 09:30:50PM +0200, Marc-André Lureau wrote:
From: Marc-André Lureau <marcandre.lureau@gmail.com>
--- libvirt-gobject/libvirt-gobject-stream.c | 1 + libvirt-gobject/libvirt-gobject-stream.h | 2 ++ 2 files changed, 3 insertions(+), 0 deletions(-)
ACK, to all 9 patches. 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 :|
participants (2)
-
Daniel P. Berrange
-
Marc-André Lureau