Introduce a new type virHashDataFreeSimple which has only a void * as
argument for cases when knowing the name of the entry when freeing the
hash entry is not required.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/conf/domain_addr.c | 4 ++--
src/util/vircgroup.c | 2 +-
src/util/virhash.c | 15 ++++++++++++++-
src/util/virhash.h | 10 ++++++++++
4 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
index d0026942aa..dd8e04576a 100644
--- a/src/conf/domain_addr.c
+++ b/src/conf/domain_addr.c
@@ -1037,14 +1037,14 @@ virDomainPCIAddressSetExtensionAlloc(virDomainPCIAddressSetPtr
addrs,
if (VIR_ALLOC(addrs->zpciIds) < 0)
return -1;
- if (!(addrs->zpciIds->uids = virHashCreateFull(10, NULL,
+ if (!(addrs->zpciIds->uids = virHashCreateFull(10, NULL, NULL,
virZPCIAddrKeyCode,
virZPCIAddrKeyEqual,
virZPCIAddrKeyCopy,
virZPCIAddrKeyFree)))
goto error;
- if (!(addrs->zpciIds->fids = virHashCreateFull(10, NULL,
+ if (!(addrs->zpciIds->fids = virHashCreateFull(10, NULL, NULL,
virZPCIAddrKeyCode,
virZPCIAddrKeyEqual,
virZPCIAddrKeyCopy,
diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
index d824aee86d..21c0fe67e3 100644
--- a/src/util/vircgroup.c
+++ b/src/util/vircgroup.c
@@ -2600,7 +2600,7 @@ virCgroupKillRecursive(virCgroupPtr group, int signum)
bool backendAvailable = false;
virCgroupBackendPtr *backends = virCgroupBackendGetAll();
virHashTablePtr pids = virHashCreateFull(100,
- NULL,
+ NULL, NULL,
virCgroupPidCode,
virCgroupPidEqual,
virCgroupPidCopy,
diff --git a/src/util/virhash.c b/src/util/virhash.c
index a7fc620567..4d90fa5333 100644
--- a/src/util/virhash.c
+++ b/src/util/virhash.c
@@ -56,6 +56,7 @@ struct _virHashTable {
size_t size;
size_t nbElems;
virHashDataFree dataFree;
+ virHashDataFreeSimple dataFreeSimple;
virHashKeyCode keyCode;
virHashKeyEqual keyEqual;
virHashKeyCopy keyCopy;
@@ -133,6 +134,7 @@ virHashComputeKey(const virHashTable *table, const void *name)
*/
virHashTablePtr virHashCreateFull(ssize_t size,
virHashDataFree dataFree,
+ virHashDataFreeSimple dataFreeSimple,
virHashKeyCode keyCode,
virHashKeyEqual keyEqual,
virHashKeyCopy keyCopy,
@@ -149,7 +151,10 @@ virHashTablePtr virHashCreateFull(ssize_t size,
table->seed = virRandomBits(32);
table->size = size;
table->nbElems = 0;
- table->dataFree = dataFree;
+ if (dataFree)
+ table->dataFree = dataFree;
+ else
+ table->dataFreeSimple = dataFreeSimple;
table->keyCode = keyCode;
table->keyEqual = keyEqual;
table->keyCopy = keyCopy;
@@ -177,6 +182,7 @@ virHashTablePtr virHashCreate(ssize_t size, virHashDataFree dataFree)
{
return virHashCreateFull(size,
dataFree,
+ NULL,
virHashStrCode,
virHashStrEqual,
virHashStrCopy,
@@ -298,6 +304,8 @@ virHashFree(virHashTablePtr table)
if (table->dataFree)
table->dataFree(iter->payload, iter->name);
+ if (table->dataFreeSimple)
+ table->dataFreeSimple(iter->payload);
if (table->keyFree)
table->keyFree(iter->name);
VIR_FREE(iter);
@@ -330,6 +338,8 @@ virHashAddOrUpdateEntry(virHashTablePtr table, const void *name,
if (is_update) {
if (table->dataFree)
table->dataFree(entry->payload, entry->name);
+ if (table->dataFreeSimple)
+ table->dataFreeSimple(entry->payload);
entry->payload = userdata;
return 0;
} else {
@@ -456,9 +466,12 @@ void *virHashSteal(virHashTablePtr table, const void *name)
void *data = virHashLookup(table, name);
if (data) {
virHashDataFree dataFree = table->dataFree;
+ virHashDataFreeSimple dataFreeSimple = table->dataFreeSimple;
table->dataFree = NULL;
+ table->dataFreeSimple = NULL;
virHashRemoveEntry(table, name);
table->dataFree = dataFree;
+ table->dataFreeSimple = dataFreeSimple;
}
return data;
}
diff --git a/src/util/virhash.h b/src/util/virhash.h
index b5e7c79260..94fe8e23e4 100644
--- a/src/util/virhash.h
+++ b/src/util/virhash.h
@@ -30,6 +30,15 @@ typedef virHashAtomic *virHashAtomicPtr;
* Callback to free data from a hash.
*/
typedef void (*virHashDataFree) (void *payload, const void *name);
+/**
+ * virHashDataFreeSimple:
+ * @payload: the data in the hash
+ * @name: the name associated
+ *
+ * Callback to free data from a hash.
+ */
+typedef void (*virHashDataFreeSimple) (void *payload);
+
/**
* virHashIterator:
* @payload: the data in the hash
@@ -104,6 +113,7 @@ virHashAtomicPtr virHashAtomicNew(ssize_t size,
virHashDataFree dataFree);
virHashTablePtr virHashCreateFull(ssize_t size,
virHashDataFree dataFree,
+ virHashDataFreeSimple dataFreeSimple,
virHashKeyCode keyCode,
virHashKeyEqual keyEqual,
virHashKeyCopy keyCopy,
--
2.21.0