[libvirt-glib 06/13] Use gvir_config_object_attach where appropriate

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]