
On Fri, Oct 07, 2011 at 11:40:58AM +0200, Christophe Fergeau wrote:
GVirConfigObject also contains an xmlNodePtr which is more useful since it indicates the position of the current config object in the source XML file. Since xmlNode has a 'doc' member, having both an xmlNodePtr and an xmlDocPtr in GVirConfigObject is redundant. --- libvirt-gconfig/libvirt-gconfig-object.c | 50 +++++++++++++---------------- libvirt-gconfig/libvirt-gconfig-object.h | 1 - libvirt-gconfig/libvirt-gconfig.sym | 1 - 3 files changed, 22 insertions(+), 30 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index 66102ec..b7829c9 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -43,10 +43,6 @@ struct _GVirConfigObjectPrivate gchar *doc; gchar *schema;
- /* FIXME: docHandle is node->doc, can probably be removed to avoid the - * 2 getting out of sync - */ - xmlDocPtr docHandle; xmlNodePtr node; };
@@ -117,15 +113,17 @@ static void gvir_config_object_set_property(GObject *object, priv->schema = g_value_dup_string(value); break;
- case PROP_NODE: - priv->node = g_value_get_pointer(value); - if ((priv->docHandle != NULL) && (priv->docHandle != priv->node->doc)) - xmlFreeDoc(priv->docHandle); - if (priv->node) - priv->docHandle = priv->node->doc; - else - priv->docHandle = NULL; + case PROP_NODE: { + xmlNodePtr node; + node = g_value_get_pointer(value); + if ((priv->node != NULL) + && (priv->node->doc != NULL) + && (priv->node->doc != node->doc)) { + xmlFreeDoc(priv->node->doc); + } + priv->node = node; break; + }
default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); @@ -143,8 +141,12 @@ static void gvir_config_object_finalize(GObject *object) g_free(priv->doc); g_free(priv->schema);
- if (priv->docHandle) - xmlFreeDoc(priv->docHandle); + /* FIXME: all objects describing a given XML document will share the + * same document so we can't destroy it here like this, we need some + * refcounting to know when to destroy it. + */ + if (priv->node) + xmlFreeDoc(priv->node->doc);
This could be reason for creating a trivial GObject to wrap the xmlDocPtr instance, gaining ref counting. ACK 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 :|