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(a)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