Add a pair of hash tables to the object - a primary and a secondary one.
If the consumer requested only a primary, then only it will be created.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/libvirt_private.syms | 2 ++
src/util/virobject.c | 78 +++++++++++++++++++++++++++++++++++++++++++++---
src/util/virobject.h | 22 +++++++++++++-
3 files changed, 97 insertions(+), 5 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 6861155..9b3345a 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2235,6 +2235,8 @@ virObjectListFreeCount;
virObjectLock;
virObjectLockableNew;
virObjectNew;
+virObjectPoolableHashTableGetPrimary;
+virObjectPoolableHashTableGetSecondary;
virObjectPoolableHashTableNew;
virObjectRef;
virObjectUnlock;
diff --git a/src/util/virobject.c b/src/util/virobject.c
index d284dde..625bf90 100644
--- a/src/util/virobject.c
+++ b/src/util/virobject.c
@@ -295,7 +295,9 @@ virObjectLockableDispose(void *anyobj)
void *
virObjectPoolableHashTableNew(virClassPtr klass,
- virObjectPoolableHashTableObjType objtype)
+ virObjectPoolableHashTableObjType objtype,
+ int tableElemsStart,
+ bool primaryOnly)
{
virObjectPoolableHashTablePtr obj;
@@ -311,20 +313,39 @@ virObjectPoolableHashTableNew(virClassPtr klass,
return NULL;
obj->objtype = objtype;
+ obj->tableElemsStart = tableElemsStart;
- VIR_DEBUG("poolable new obj=%p, type=%d",
- obj, objtype);
+ if (!(obj->objsPrimary = virHashCreate(tableElemsStart,
+ virObjectFreeHashData)))
+ goto error;
+
+ if (!primaryOnly &&
+ !(obj->objsSecondary = virHashCreate(tableElemsStart,
+ virObjectFreeHashData)))
+ goto error;
+
+
+ VIR_DEBUG("obj=%p, type=%d, elems=%d objsPrimary=%p objsSecondary=%p",
+ obj, objtype, tableElemsStart,
+ obj->objsPrimary, obj->objsSecondary);
return obj;
+ error:
+ virObjectUnref(obj);
+ return NULL;
}
+
static void
virObjectPoolableHashTableDispose(void *anyobj)
{
virObjectPoolableHashTablePtr obj = anyobj;
VIR_DEBUG("poolable dispose obj=%p", obj);
+
+ virHashFree(obj->objsPrimary);
+ virHashFree(obj->objsSecondary);
}
@@ -402,7 +423,6 @@ virObjectGetLockableObj(void *anyobj)
VIR_OBJECT_USAGE_PRINT_WARNING(anyobj, virObjectLockableClass);
return NULL;
-
}
@@ -557,3 +577,53 @@ virObjectListFreeCount(void *list,
VIR_FREE(list);
}
+
+
+static virObjectPoolableHashTablePtr
+virObjectGetPoolableHashTableObj(void *anyobj)
+{
+ if (virObjectIsClass(anyobj, virObjectPoolableHashTableClass))
+ return anyobj;
+
+ VIR_OBJECT_USAGE_PRINT_WARNING(anyobj, virObjectPoolableHashTableClass);
+
+ return NULL;
+}
+
+
+/**
+ * virObjectPoolableHashTableGetPrimary
+ * @anyobj: Pointer to a PoolableHashTable object
+ *
+ * Returns: Pointer to the Primary Hash Table or NULL on failure
+ */
+virHashTablePtr
+virObjectPoolableHashTableGetPrimary(void *anyobj)
+{
+ virObjectPoolableHashTablePtr obj =
+ virObjectGetPoolableHashTableObj(anyobj);
+
+ if (!obj)
+ return NULL;
+
+ return obj->objsPrimary;
+}
+
+
+/**
+ * virObjectPoolableHashTableGetSecondary
+ * @anyobj: Pointer to a PoolableHashTable object
+ *
+ * Returns: Pointer to the Secondary Hash Table or NULL on failure
+ */
+virHashTablePtr
+virObjectPoolableHashTableGetSecondary(void *anyobj)
+{
+ virObjectPoolableHashTablePtr obj =
+ virObjectGetPoolableHashTableObj(anyobj);
+
+ if (!obj)
+ return NULL;
+
+ return obj->objsSecondary;
+}
diff --git a/src/util/virobject.h b/src/util/virobject.h
index 30ce6a1..ac21190 100644
--- a/src/util/virobject.h
+++ b/src/util/virobject.h
@@ -81,6 +81,18 @@ typedef enum {
struct _virObjectPoolableHashTable {
virObjectLockable parent;
virObjectPoolableHashTableObjType objtype;
+
+ int tableElemsStart;
+
+ /* primary key -> object mapping for O(1),
+ * lockless lookup-by-primary */
+ virHashTable *objsPrimary;
+
+ /* uuid string -> virPoolObj mapping
+ * for O(1), lockless lookup-by-uuid */
+ /* secondary key -> object mapping for O(1),
+ * lockless lookup-by-secondary */
+ virHashTable *objsSecondary;
};
@@ -135,7 +147,9 @@ virObjectLockableNew(virClassPtr klass)
void *
virObjectPoolableHashTableNew(virClassPtr klass,
- virObjectPoolableHashTableObjType objtype)
+ virObjectPoolableHashTableObjType objtype,
+ int tableElemsStart,
+ bool primaryOnly)
ATTRIBUTE_NONNULL(1);
void
@@ -153,4 +167,10 @@ void
virObjectListFreeCount(void *list,
size_t count);
+virHashTablePtr
+virObjectPoolableHashTableGetPrimary(void *anyobj);
+
+virHashTablePtr
+virObjectPoolableHashTableGetSecondary(void *anyobj);
+
#endif /* __VIR_OBJECT_H */
--
2.9.3