[libvirt] [PATCH 2/5] util: storage: Turn virStorageSource into a virObject

Peter Krempa pkrempa at redhat.com
Fri Feb 15 12:42:10 UTC 2019


To allow tracking a single virStorageSource in multiple structures
without extra hassle allow refcounting by turining it into an object.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/util/virstoragefile.c | 40 +++++++++++++++++++++++++++++----------
 src/util/virstoragefile.h |  2 ++
 2 files changed, 32 insertions(+), 10 deletions(-)

diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index 7f52a5fdc7..56c6510c5e 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -47,6 +47,8 @@

 VIR_LOG_INIT("util.storagefile");

+static virClassPtr virStorageSourceClass;
+
 VIR_ENUM_IMPL(virStorage, VIR_STORAGE_TYPE_LAST,
               "none",
               "file",
@@ -2558,30 +2560,48 @@ virStorageSourceClear(virStorageSourcePtr def)

     virStorageSourceInitiatorClear(&def->initiator);

-    memset(def, 0, sizeof(*def));
+    /* clear everything except the class header */
+    memset((char *) def + sizeof(def->parent), 0,
+           sizeof(*def) - sizeof(def->parent));
+}
+
+
+static void
+virStorageSourceDispose(void *obj)
+{
+    virStorageSourcePtr src = obj;
+
+    virStorageSourceClear(src);
 }


+static int
+virStorageSourceOnceInit(void)
+{
+    if (!VIR_CLASS_NEW(virStorageSource, virClassForObject()))
+        return -1;
+
+    return 0;
+}
+
+
+VIR_ONCE_GLOBAL_INIT(virStorageSource);
+
+
 virStorageSourcePtr
 virStorageSourceNew(void)
 {
-    virStorageSourcePtr ret = NULL;
-
-    if (VIR_ALLOC(ret) < 0)
+    if (virStorageSourceInitialize() < 0)
         return NULL;

-    return ret;
+    return virObjectNew(virStorageSourceClass);
 }


 void
 virStorageSourceFree(virStorageSourcePtr def)
 {
-    if (!def)
-        return;
-
-    virStorageSourceClear(def);
-    VIR_FREE(def);
+    virObjectUnref(def);
 }


diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h
index 48af06653e..dc75d2d36f 100644
--- a/src/util/virstoragefile.h
+++ b/src/util/virstoragefile.h
@@ -242,6 +242,8 @@ typedef virStorageSource *virStorageSourcePtr;
  * IMPORTANT: When adding fields to this struct it's also necessary to add
  * appropriate code to the virStorageSourceCopy deep copy function */
 struct _virStorageSource {
+    virObject parent;
+
     unsigned int id; /* backing chain identifier, 0 is unset */
     int type; /* virStorageType */
     char *path;
-- 
2.20.1




More information about the libvir-list mailing list