storage: Introduce _virStorageVolObj[List]
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.
This commit is contained in:
parent
71d80c9726
commit
f77c898d1e
@ -39,11 +39,18 @@ VIR_LOG_INIT("conf.virstorageobj");
|
|||||||
|
|
||||||
static virClassPtr virStoragePoolObjClass;
|
static virClassPtr virStoragePoolObjClass;
|
||||||
static virClassPtr virStoragePoolObjListClass;
|
static virClassPtr virStoragePoolObjListClass;
|
||||||
|
static virClassPtr virStorageVolObjClass;
|
||||||
|
static virClassPtr virStorageVolObjListClass;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
virStoragePoolObjDispose(void *opaque);
|
virStoragePoolObjDispose(void *opaque);
|
||||||
static void
|
static void
|
||||||
virStoragePoolObjListDispose(void *opaque);
|
virStoragePoolObjListDispose(void *opaque);
|
||||||
|
static void
|
||||||
|
virStorageVolObjDispose(void *opaque);
|
||||||
|
static void
|
||||||
|
virStorageVolObjListDispose(void *opaque);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct _virStorageVolDefList {
|
struct _virStorageVolDefList {
|
||||||
@ -51,6 +58,32 @@ struct _virStorageVolDefList {
|
|||||||
virStorageVolDefPtr *objs;
|
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 {
|
struct _virStoragePoolObj {
|
||||||
virObjectLockable parent;
|
virObjectLockable parent;
|
||||||
|
|
||||||
@ -79,6 +112,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
|
static int
|
||||||
virStoragePoolObjOnceInit(void)
|
virStoragePoolObjOnceInit(void)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user