[libvirt] [PATCH 3/4] storage: Introduce _virStorageVolObj[List]

John Ferlan jferlan at redhat.com
Tue Jan 9 20:05:52 UTC 2018


Prepare for hash table volume lists by creating the object infrastructure
for a Volume Object and Volume Object List

The _virStorageVolObj will contain just a pointer to the "current"
(and live) volume definition.

The _virStorageVolObjList will contain three hash tables, one for
each of the lookup options allowed for a volume.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/conf/virstorageobj.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 130 insertions(+)

diff --git a/src/conf/virstorageobj.c b/src/conf/virstorageobj.c
index 1eaa53423..8a1c6f782 100644
--- a/src/conf/virstorageobj.c
+++ b/src/conf/virstorageobj.c
@@ -39,11 +39,18 @@ VIR_LOG_INIT("conf.virstorageobj");
 
 static virClassPtr virStoragePoolObjClass;
 static virClassPtr virStoragePoolObjListClass;
+static virClassPtr virStorageVolObjClass;
+static virClassPtr virStorageVolObjListClass;
 
 static void
 virStoragePoolObjDispose(void *opaque);
 static void
 virStoragePoolObjListDispose(void *opaque);
+static void
+virStorageVolObjDispose(void *opaque);
+static void
+virStorageVolObjListDispose(void *opaque);
+
 
 
 struct _virStorageVolDefList {
@@ -51,6 +58,32 @@ struct _virStorageVolDefList {
     virStorageVolDefPtr *objs;
 };
 
+typedef struct _virStorageVolObj virStorageVolObj;
+typedef virStorageVolObj *virStorageVolObjPtr;
+struct _virStorageVolObj {
+    virObjectLockable parent;
+
+    virStorageVolDefPtr voldef;
+};
+
+typedef struct _virStorageVolObjList virStorageVolObjList;
+typedef virStorageVolObjList *virStorageVolObjListPtr;
+struct _virStorageVolObjList {
+    virObjectRWLockable parent;
+
+    /* key string -> virStorageVolObj mapping
+     * for (1), lockless lookup-by-key */
+    virHashTable *objsKey;
+
+    /* name string -> virStorageVolObj mapping
+     * for (1), lockless lookup-by-name */
+    virHashTable *objsName;
+
+    /* path string -> virStorageVolObj mapping
+     * for (1), lockless lookup-by-path */
+    virHashTable *objsPath;
+};
+
 struct _virStoragePoolObj {
     virObjectLockable parent;
 
@@ -80,6 +113,103 @@ struct _virStoragePoolObjList {
 
 
 static int
+virStorageVolObjOnceInit(void)
+{
+    if (!(virStorageVolObjClass = virClassNew(virClassForObjectLockable(),
+                                              "virStorageVolObj",
+                                              sizeof(virStorageVolObj),
+                                              virStorageVolObjDispose)))
+        return -1;
+
+    if (!(virStorageVolObjListClass = virClassNew(virClassForObjectRWLockable(),
+                                                  "virStorageVolObjList",
+                                                  sizeof(virStorageVolObjList),
+                                                  virStorageVolObjListDispose)))
+        return -1;
+
+    return 0;
+}
+
+VIR_ONCE_GLOBAL_INIT(virStorageVolObj)
+
+
+static virStorageVolObjPtr ATTRIBUTE_UNUSED
+virStorageVolObjNew(void)
+{
+    virStorageVolObjPtr obj;
+
+    if (virStorageVolObjInitialize() < 0)
+        return NULL;
+
+    if (!(obj = virObjectLockableNew(virStorageVolObjClass)))
+        return NULL;
+
+    virObjectLock(obj);
+    return obj;
+}
+
+
+static void ATTRIBUTE_UNUSED
+virStorageVolObjEndAPI(virStorageVolObjPtr *obj)
+{
+    if (!*obj)
+        return;
+
+    virObjectUnlock(*obj);
+    virObjectUnref(*obj);
+    *obj = NULL;
+}
+
+
+static void
+virStorageVolObjDispose(void *opaque)
+{
+    virStorageVolObjPtr obj = opaque;
+
+    if (!obj)
+        return;
+
+    virStorageVolDefFree(obj->voldef);
+}
+
+
+static virStorageVolObjListPtr ATTRIBUTE_UNUSED
+virStorageVolObjListNew(void)
+{
+    virStorageVolObjListPtr vols;
+
+    if (virStorageVolObjInitialize() < 0)
+        return NULL;
+
+    if (!(vols = virObjectRWLockableNew(virStorageVolObjListClass)))
+        return NULL;
+
+    if (!(vols->objsKey = virHashCreate(10, virObjectFreeHashData)) ||
+        !(vols->objsName = virHashCreate(10, virObjectFreeHashData)) ||
+        !(vols->objsPath = virHashCreate(10, virObjectFreeHashData))) {
+        virObjectUnref(vols);
+        return NULL;
+    }
+
+    return vols;
+}
+
+
+static void
+virStorageVolObjListDispose(void *opaque)
+{
+    virStorageVolObjListPtr vols = opaque;
+
+    if (!vols)
+        return;
+
+    virHashFree(vols->objsKey);
+    virHashFree(vols->objsName);
+    virHashFree(vols->objsPath);
+}
+
+
+static int
 virStoragePoolObjOnceInit(void)
 {
     if (!(virStoragePoolObjClass = virClassNew(virClassForObjectLockable(),
-- 
2.13.6




More information about the libvir-list mailing list