util: storage: Turn virStorageSource into a virObject

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@redhat.com>
Reviewed-by: Erik Skultety <eskultet@redhat.com>
This commit is contained in:
Peter Krempa 2019-02-15 09:46:03 +01:00
parent dcda2bf4c1
commit 53a0fa7366
2 changed files with 33 additions and 10 deletions

View File

@ -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,49 @@ virStorageSourceClear(virStorageSourcePtr def)
virStorageSourceInitiatorClear(&def->initiator);
memset(def, 0, sizeof(*def));
/* clear everything except the class header as the object APIs
* will break otherwise */
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);
}

View File

@ -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;