This allows us to properly refcount the underlying xmlDocPtr (and
the associated xmlNodes) to avoid trying to free twice the same
xmlNodes when disposing of GVirConfigObject referencing the same
nodes.
---
 libvirt-gconfig/libvirt-gconfig-domain.c |   31 ++++++++++++++---------------
 1 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c 
b/libvirt-gconfig/libvirt-gconfig-domain.c
index 2c21219..d9cb2e9 100644
--- a/libvirt-gconfig/libvirt-gconfig-domain.c
+++ b/libvirt-gconfig/libvirt-gconfig-domain.c
@@ -266,25 +266,21 @@ void gvir_config_domain_set_features(GVirConfigDomain 
*domain,
 void gvir_config_domain_set_clock(GVirConfigDomain *domain,
                                   GVirConfigDomainClock *klock)
 {
-    xmlNodePtr clock_node;
-
     g_return_if_fail(GVIR_IS_CONFIG_DOMAIN(domain));
     g_return_if_fail(GVIR_IS_CONFIG_DOMAIN_CLOCK(klock));
 
-    clock_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(klock));
-    gvir_config_object_set_child(GVIR_CONFIG_OBJECT(domain), clock_node);
+    gvir_config_object_attach(GVIR_CONFIG_OBJECT(domain),
+                              GVIR_CONFIG_OBJECT(klock));
 }
 
 void gvir_config_domain_set_os(GVirConfigDomain *domain,
                                GVirConfigDomainOs *os)
 {
-    xmlNodePtr os_node;
-
     g_return_if_fail(GVIR_IS_CONFIG_DOMAIN(domain));
     g_return_if_fail(GVIR_IS_CONFIG_DOMAIN_OS(os));
 
-    os_node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(os));
-    gvir_config_object_set_child(GVIR_CONFIG_OBJECT(domain), os_node);
+    gvir_config_object_attach(GVIR_CONFIG_OBJECT(domain),
+                              GVIR_CONFIG_OBJECT(os));
 }
 
 /**
@@ -294,18 +290,21 @@ void gvir_config_domain_set_os(GVirConfigDomain *domain,
 void gvir_config_domain_set_devices(GVirConfigDomain *domain,
                                     GList *devices)
 {
-    xmlNodePtr devices_node;
+    GVirConfigObject *devices_node;
     GList *it;
 
     g_return_if_fail(GVIR_IS_CONFIG_DOMAIN(domain));
 
-    devices_node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(domain),
-                                                    "devices");
+    devices_node = gvir_config_object_new(GVIR_TYPE_CONFIG_OBJECT,
+                                          "devices", NULL);
     for (it = devices; it != NULL; it = it->next) {
-        GVirConfigDomainDevice *device = GVIR_CONFIG_DOMAIN_DEVICE(it->data);
-        xmlNodePtr node;
-
-        node = gvir_config_object_get_xml_node(GVIR_CONFIG_OBJECT(device));
-        xmlAddChild(devices_node, node);
+        if (!GVIR_IS_CONFIG_DOMAIN_DEVICE(it->data)) {
+            g_warn_if_reached();
+            continue;
+        }
+        gvir_config_object_attach(devices_node, GVIR_CONFIG_OBJECT(it->data));
     }
+
+    gvir_config_object_attach(GVIR_CONFIG_OBJECT(domain), devices_node);
+    g_object_unref(G_OBJECT(devices_node));
 }
-- 
1.7.7.3

--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to