diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c index d0026942aa040346d62ad8631dd18616ce2b7a4d..dd8e04576aff15eb2250c553cf14c3213b76c57d 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 8af6906a5717e8a2e6035c28dc4e3e747ed3b3a4..b46f20abfda626956b8a8c96d99c4c8c45800ddc 100644 --- a/src/util/vircgroup.c +++ b/src/util/vircgroup.c @@ -2595,7 +2595,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 447b7cfabfb10c6146d13ab3b64f1a939306e85b..32de4dabad0e9567b6f80ee15976b20699fb5dce 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 b5e7c79260205b5eb74ee1c5ae100d9cb8de50f1..94fe8e23e4957dc01e3d36d6c7c1a32eb6e643d8 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,