[libvirt] [PATCH v6 3/8] snapshot: Break out virDomainSnapshotObj into its own file

Eric Blake eblake at redhat.com
Fri Mar 15 05:02:28 UTC 2019


snapshot_conf.h was mixing three separate types: the snapshot
definition, the snapshot object, and the snapshot object list.
Separate out the snapshot object code into its own file, which
includes moving a typedef to avoid circular inclusions.

Mostly straight code motion, although I fixed a comment along
the way.

Signed-off-by: Eric Blake <eblake at redhat.com>
---
 src/conf/snapshot_conf.h        |  20 +-----
 src/conf/virconftypes.h         |   3 +
 src/conf/virdomainsnapshotobj.h |  50 +++++++++++++
 src/conf/Makefile.inc.am        |   2 +
 src/conf/snapshot_conf.c        |  85 ----------------------
 src/conf/virdomainsnapshotobj.c | 122 ++++++++++++++++++++++++++++++++
 src/libvirt_private.syms        |   9 ++-
 7 files changed, 184 insertions(+), 107 deletions(-)
 create mode 100644 src/conf/virdomainsnapshotobj.h
 create mode 100644 src/conf/virdomainsnapshotobj.c

diff --git a/src/conf/snapshot_conf.h b/src/conf/snapshot_conf.h
index 6d79dbb0da..444de05a71 100644
--- a/src/conf/snapshot_conf.h
+++ b/src/conf/snapshot_conf.h
@@ -24,6 +24,7 @@

 # include "internal.h"
 # include "domain_conf.h"
+# include "virdomainsnapshotobj.h"

 /* Items related to snapshot state */

@@ -71,8 +72,6 @@ struct _virDomainSnapshotDiskDef {
 };

 /* Stores the complete snapshot metadata */
-typedef struct _virDomainSnapshotDef virDomainSnapshotDef;
-typedef virDomainSnapshotDef *virDomainSnapshotDefPtr;
 struct _virDomainSnapshotDef {
     /* Public XML.  */
     char *name;
@@ -95,16 +94,6 @@ struct _virDomainSnapshotDef {
     bool current; /* At most one snapshot in the list should have this set */
 };

-struct _virDomainSnapshotObj {
-    virDomainSnapshotDefPtr def; /* non-NULL except for metaroot */
-
-    virDomainSnapshotObjPtr parent; /* non-NULL except for metaroot, before
-                                       virDomainSnapshotUpdateRelations, or
-                                       after virDomainSnapshotDropParent */
-    virDomainSnapshotObjPtr sibling; /* NULL if last child of parent */
-    size_t nchildren;
-    virDomainSnapshotObjPtr first_child; /* NULL if no children */
-};

 virDomainSnapshotObjListPtr virDomainSnapshotObjListNew(void);
 void virDomainSnapshotObjListFree(virDomainSnapshotObjListPtr snapshots);
@@ -172,14 +161,7 @@ void virDomainSnapshotObjListRemove(virDomainSnapshotObjListPtr snapshots,
 int virDomainSnapshotForEach(virDomainSnapshotObjListPtr snapshots,
                              virHashIterator iter,
                              void *data);
-int virDomainSnapshotForEachChild(virDomainSnapshotObjPtr snapshot,
-                                  virHashIterator iter,
-                                  void *data);
-int virDomainSnapshotForEachDescendant(virDomainSnapshotObjPtr snapshot,
-                                       virHashIterator iter,
-                                       void *data);
 int virDomainSnapshotUpdateRelations(virDomainSnapshotObjListPtr snapshots);
-void virDomainSnapshotDropParent(virDomainSnapshotObjPtr snapshot);

 # define VIR_DOMAIN_SNAPSHOT_FILTERS_METADATA \
                (VIR_DOMAIN_SNAPSHOT_LIST_METADATA     | \
diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h
index c4896ff769..a271c4e7f7 100644
--- a/src/conf/virconftypes.h
+++ b/src/conf/virconftypes.h
@@ -215,6 +215,9 @@ typedef virDomainShmemDef *virDomainShmemDefPtr;
 typedef struct _virDomainSmartcardDef virDomainSmartcardDef;
 typedef virDomainSmartcardDef *virDomainSmartcardDefPtr;

+typedef struct _virDomainSnapshotDef virDomainSnapshotDef;
+typedef virDomainSnapshotDef *virDomainSnapshotDefPtr;
+
 typedef struct _virDomainSnapshotObj virDomainSnapshotObj;
 typedef virDomainSnapshotObj *virDomainSnapshotObjPtr;

diff --git a/src/conf/virdomainsnapshotobj.h b/src/conf/virdomainsnapshotobj.h
new file mode 100644
index 0000000000..957f1b2ea8
--- /dev/null
+++ b/src/conf/virdomainsnapshotobj.h
@@ -0,0 +1,50 @@
+/*
+ * virdomainsnapshotobj.h: handle snapshot objects
+ *                  (derived from snapshot_conf.h)
+ *
+ * Copyright (C) 2006-2019 Red Hat, Inc.
+ * Copyright (C) 2006-2008 Daniel P. Berrange
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LIBVIRT_VIRDOMAINSNAPSHOTOBJ_H
+# define LIBVIRT_VIRDOMAINSNAPSHOTOBJ_H
+
+# include "internal.h"
+# include "virconftypes.h"
+# include "virhash.h"
+
+struct _virDomainSnapshotObj {
+    virDomainSnapshotDefPtr def; /* non-NULL except for metaroot */
+
+    virDomainSnapshotObjPtr parent; /* non-NULL except for metaroot, before
+                                       virDomainSnapshotUpdateRelations, or
+                                       after virDomainSnapshotDropParent */
+    virDomainSnapshotObjPtr sibling; /* NULL if last child of parent */
+    size_t nchildren;
+    virDomainSnapshotObjPtr first_child; /* NULL if no children */
+};
+
+
+int virDomainSnapshotForEachChild(virDomainSnapshotObjPtr snapshot,
+                                  virHashIterator iter,
+                                  void *data);
+int virDomainSnapshotForEachDescendant(virDomainSnapshotObjPtr snapshot,
+                                       virHashIterator iter,
+                                       void *data);
+void virDomainSnapshotDropParent(virDomainSnapshotObjPtr snapshot);
+
+#endif /* LIBVIRT_VIRDOMAINSNAPSHOTOBJ_H */
diff --git a/src/conf/Makefile.inc.am b/src/conf/Makefile.inc.am
index 64d4436c6b..be941ee7e2 100644
--- a/src/conf/Makefile.inc.am
+++ b/src/conf/Makefile.inc.am
@@ -29,6 +29,8 @@ DOMAIN_CONF_SOURCES = \
 	conf/virconftypes.h \
 	conf/virdomainobjlist.c \
 	conf/virdomainobjlist.h \
+	conf/virdomainsnapshotobj.c \
+	conf/virdomainsnapshotobj.h \
 	$(NULL)

 OBJECT_EVENT_SOURCES = \
diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
index e2c91a5072..3b0e527bb2 100644
--- a/src/conf/snapshot_conf.c
+++ b/src/conf/snapshot_conf.c
@@ -1299,64 +1299,6 @@ virDomainSnapshotForEach(virDomainSnapshotObjListPtr snapshots,
     return virHashForEach(snapshots->objs, iter, data);
 }

-/* Run iter(data) on all direct children of snapshot, while ignoring all
- * other entries in snapshots.  Return the number of children
- * visited.  No particular ordering is guaranteed.  */
-int
-virDomainSnapshotForEachChild(virDomainSnapshotObjPtr snapshot,
-                              virHashIterator iter,
-                              void *data)
-{
-    virDomainSnapshotObjPtr child = snapshot->first_child;
-
-    while (child) {
-        virDomainSnapshotObjPtr next = child->sibling;
-        (iter)(child, child->def->name, data);
-        child = next;
-    }
-
-    return snapshot->nchildren;
-}
-
-struct snapshot_act_on_descendant {
-    int number;
-    virHashIterator iter;
-    void *data;
-};
-
-static int
-virDomainSnapshotActOnDescendant(void *payload,
-                                 const void *name,
-                                 void *data)
-{
-    virDomainSnapshotObjPtr obj = payload;
-    struct snapshot_act_on_descendant *curr = data;
-
-    (curr->iter)(payload, name, curr->data);
-    curr->number += 1 + virDomainSnapshotForEachDescendant(obj,
-                                                           curr->iter,
-                                                           curr->data);
-    return 0;
-}
-
-/* Run iter(data) on all descendants of snapshot, while ignoring all
- * other entries in snapshots.  Return the number of descendants
- * visited.  No particular ordering is guaranteed.  */
-int
-virDomainSnapshotForEachDescendant(virDomainSnapshotObjPtr snapshot,
-                                   virHashIterator iter,
-                                   void *data)
-{
-    struct snapshot_act_on_descendant act;
-
-    act.number = 0;
-    act.iter = iter;
-    act.data = data;
-    virDomainSnapshotForEachChild(snapshot,
-                                  virDomainSnapshotActOnDescendant, &act);
-
-    return act.number;
-}

 /* Struct and callback function used as a hash table callback; each call
  * inspects the pre-existing snapshot->def->parent field, and adjusts
@@ -1416,33 +1358,6 @@ virDomainSnapshotUpdateRelations(virDomainSnapshotObjListPtr snapshots)
     return act.err;
 }

-/* Prepare to reparent or delete snapshot, by removing it from its
- * current listed parent.  Note that when bulk removing all children
- * of a parent, it is faster to just 0 the count rather than calling
- * this function on each child.  */
-void
-virDomainSnapshotDropParent(virDomainSnapshotObjPtr snapshot)
-{
-    virDomainSnapshotObjPtr prev = NULL;
-    virDomainSnapshotObjPtr curr = NULL;
-
-    snapshot->parent->nchildren--;
-    curr = snapshot->parent->first_child;
-    while (curr != snapshot) {
-        if (!curr) {
-            VIR_WARN("inconsistent snapshot relations");
-            return;
-        }
-        prev = curr;
-        curr = curr->sibling;
-    }
-    if (prev)
-        prev->sibling = snapshot->sibling;
-    else
-        snapshot->parent->first_child = snapshot->sibling;
-    snapshot->parent = NULL;
-    snapshot->sibling = NULL;
-}

 int
 virDomainListSnapshots(virDomainSnapshotObjListPtr snapshots,
diff --git a/src/conf/virdomainsnapshotobj.c b/src/conf/virdomainsnapshotobj.c
new file mode 100644
index 0000000000..487f0cc702
--- /dev/null
+++ b/src/conf/virdomainsnapshotobj.c
@@ -0,0 +1,122 @@
+/*
+ * virdomainsnapshotobj.c: handle snapshot objects
+ *                  (derived from snapshot_conf.c)
+ *
+ * Copyright (C) 2006-2019 Red Hat, Inc.
+ * Copyright (C) 2006-2008 Daniel P. Berrange
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include "internal.h"
+#include "virdomainsnapshotobj.h"
+#include "snapshot_conf.h"
+#include "virlog.h"
+#include "virerror.h"
+
+#define VIR_FROM_THIS VIR_FROM_DOMAIN_SNAPSHOT
+
+VIR_LOG_INIT("conf.virdomainsnapshotobj");
+
+/* Run iter(data) on all direct children of snapshot, while ignoring all
+ * other entries in snapshots.  Return the number of children
+ * visited.  No particular ordering is guaranteed.  */
+int
+virDomainSnapshotForEachChild(virDomainSnapshotObjPtr snapshot,
+                              virHashIterator iter,
+                              void *data)
+{
+    virDomainSnapshotObjPtr child = snapshot->first_child;
+
+    while (child) {
+        virDomainSnapshotObjPtr next = child->sibling;
+        (iter)(child, child->def->name, data);
+        child = next;
+    }
+
+    return snapshot->nchildren;
+}
+
+struct snapshot_act_on_descendant {
+    int number;
+    virHashIterator iter;
+    void *data;
+};
+
+static int
+virDomainSnapshotActOnDescendant(void *payload,
+                                 const void *name,
+                                 void *data)
+{
+    virDomainSnapshotObjPtr obj = payload;
+    struct snapshot_act_on_descendant *curr = data;
+
+    (curr->iter)(payload, name, curr->data);
+    curr->number += 1 + virDomainSnapshotForEachDescendant(obj,
+                                                           curr->iter,
+                                                           curr->data);
+    return 0;
+}
+
+/* Run iter(data) on all descendants of snapshot, while ignoring all
+ * other entries in snapshots.  Return the number of descendants
+ * visited.  The visit is guaranteed to be topological, but no
+ * particular order between siblings is guaranteed.  */
+int
+virDomainSnapshotForEachDescendant(virDomainSnapshotObjPtr snapshot,
+                                   virHashIterator iter,
+                                   void *data)
+{
+    struct snapshot_act_on_descendant act;
+
+    act.number = 0;
+    act.iter = iter;
+    act.data = data;
+    virDomainSnapshotForEachChild(snapshot,
+                                  virDomainSnapshotActOnDescendant, &act);
+
+    return act.number;
+}
+
+
+/* Prepare to reparent or delete snapshot, by removing it from its
+ * current listed parent.  Note that when bulk removing all children
+ * of a parent, it is faster to just 0 the count rather than calling
+ * this function on each child.  */
+void
+virDomainSnapshotDropParent(virDomainSnapshotObjPtr snapshot)
+{
+    virDomainSnapshotObjPtr prev = NULL;
+    virDomainSnapshotObjPtr curr = NULL;
+
+    snapshot->parent->nchildren--;
+    curr = snapshot->parent->first_child;
+    while (curr != snapshot) {
+        if (!curr) {
+            VIR_WARN("inconsistent snapshot relations");
+            return;
+        }
+        prev = curr;
+        curr = curr->sibling;
+    }
+    if (prev)
+        prev->sibling = snapshot->sibling;
+    else
+        snapshot->parent->first_child = snapshot->sibling;
+    snapshot->parent = NULL;
+    snapshot->sibling = NULL;
+}
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 9582b72262..d775fe8551 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -890,11 +890,8 @@ virDomainSnapshotDefFormat;
 virDomainSnapshotDefFree;
 virDomainSnapshotDefIsExternal;
 virDomainSnapshotDefParseString;
-virDomainSnapshotDropParent;
 virDomainSnapshotFindByName;
 virDomainSnapshotForEach;
-virDomainSnapshotForEachChild;
-virDomainSnapshotForEachDescendant;
 virDomainSnapshotFormatConvertXMLFlags;
 virDomainSnapshotIsExternal;
 virDomainSnapshotLocationTypeFromString;
@@ -992,6 +989,12 @@ virDomainObjListRemoveLocked;
 virDomainObjListRename;


+# conf/virdomainsnapshotobj.h
+virDomainSnapshotDropParent;
+virDomainSnapshotForEachChild;
+virDomainSnapshotForEachDescendant;
+
+
 # conf/virinterfaceobj.h
 virInterfaceObjEndAPI;
 virInterfaceObjGetDef;
-- 
2.20.1




More information about the libvir-list mailing list