util: hash: Add possibility to use simpler data free function in virHash

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@redhat.com>
ACKed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Peter Krempa 2019-10-09 15:26:37 +02:00
parent 5bf573f62b
commit 49288fac96
4 changed files with 27 additions and 4 deletions

View File

@ -1037,14 +1037,14 @@ virDomainPCIAddressSetExtensionAlloc(virDomainPCIAddressSetPtr addrs,
if (VIR_ALLOC(addrs->zpciIds) < 0) if (VIR_ALLOC(addrs->zpciIds) < 0)
return -1; return -1;
if (!(addrs->zpciIds->uids = virHashCreateFull(10, NULL, if (!(addrs->zpciIds->uids = virHashCreateFull(10, NULL, NULL,
virZPCIAddrKeyCode, virZPCIAddrKeyCode,
virZPCIAddrKeyEqual, virZPCIAddrKeyEqual,
virZPCIAddrKeyCopy, virZPCIAddrKeyCopy,
virZPCIAddrKeyFree))) virZPCIAddrKeyFree)))
goto error; goto error;
if (!(addrs->zpciIds->fids = virHashCreateFull(10, NULL, if (!(addrs->zpciIds->fids = virHashCreateFull(10, NULL, NULL,
virZPCIAddrKeyCode, virZPCIAddrKeyCode,
virZPCIAddrKeyEqual, virZPCIAddrKeyEqual,
virZPCIAddrKeyCopy, virZPCIAddrKeyCopy,

View File

@ -2595,7 +2595,7 @@ virCgroupKillRecursive(virCgroupPtr group, int signum)
bool backendAvailable = false; bool backendAvailable = false;
virCgroupBackendPtr *backends = virCgroupBackendGetAll(); virCgroupBackendPtr *backends = virCgroupBackendGetAll();
virHashTablePtr pids = virHashCreateFull(100, virHashTablePtr pids = virHashCreateFull(100,
NULL, NULL, NULL,
virCgroupPidCode, virCgroupPidCode,
virCgroupPidEqual, virCgroupPidEqual,
virCgroupPidCopy, virCgroupPidCopy,

View File

@ -56,6 +56,7 @@ struct _virHashTable {
size_t size; size_t size;
size_t nbElems; size_t nbElems;
virHashDataFree dataFree; virHashDataFree dataFree;
virHashDataFreeSimple dataFreeSimple;
virHashKeyCode keyCode; virHashKeyCode keyCode;
virHashKeyEqual keyEqual; virHashKeyEqual keyEqual;
virHashKeyCopy keyCopy; virHashKeyCopy keyCopy;
@ -133,6 +134,7 @@ virHashComputeKey(const virHashTable *table, const void *name)
*/ */
virHashTablePtr virHashCreateFull(ssize_t size, virHashTablePtr virHashCreateFull(ssize_t size,
virHashDataFree dataFree, virHashDataFree dataFree,
virHashDataFreeSimple dataFreeSimple,
virHashKeyCode keyCode, virHashKeyCode keyCode,
virHashKeyEqual keyEqual, virHashKeyEqual keyEqual,
virHashKeyCopy keyCopy, virHashKeyCopy keyCopy,
@ -149,7 +151,10 @@ virHashTablePtr virHashCreateFull(ssize_t size,
table->seed = virRandomBits(32); table->seed = virRandomBits(32);
table->size = size; table->size = size;
table->nbElems = 0; table->nbElems = 0;
table->dataFree = dataFree; if (dataFree)
table->dataFree = dataFree;
else
table->dataFreeSimple = dataFreeSimple;
table->keyCode = keyCode; table->keyCode = keyCode;
table->keyEqual = keyEqual; table->keyEqual = keyEqual;
table->keyCopy = keyCopy; table->keyCopy = keyCopy;
@ -177,6 +182,7 @@ virHashTablePtr virHashCreate(ssize_t size, virHashDataFree dataFree)
{ {
return virHashCreateFull(size, return virHashCreateFull(size,
dataFree, dataFree,
NULL,
virHashStrCode, virHashStrCode,
virHashStrEqual, virHashStrEqual,
virHashStrCopy, virHashStrCopy,
@ -298,6 +304,8 @@ virHashFree(virHashTablePtr table)
if (table->dataFree) if (table->dataFree)
table->dataFree(iter->payload, iter->name); table->dataFree(iter->payload, iter->name);
if (table->dataFreeSimple)
table->dataFreeSimple(iter->payload);
if (table->keyFree) if (table->keyFree)
table->keyFree(iter->name); table->keyFree(iter->name);
VIR_FREE(iter); VIR_FREE(iter);
@ -330,6 +338,8 @@ virHashAddOrUpdateEntry(virHashTablePtr table, const void *name,
if (is_update) { if (is_update) {
if (table->dataFree) if (table->dataFree)
table->dataFree(entry->payload, entry->name); table->dataFree(entry->payload, entry->name);
if (table->dataFreeSimple)
table->dataFreeSimple(entry->payload);
entry->payload = userdata; entry->payload = userdata;
return 0; return 0;
} else { } else {
@ -456,9 +466,12 @@ void *virHashSteal(virHashTablePtr table, const void *name)
void *data = virHashLookup(table, name); void *data = virHashLookup(table, name);
if (data) { if (data) {
virHashDataFree dataFree = table->dataFree; virHashDataFree dataFree = table->dataFree;
virHashDataFreeSimple dataFreeSimple = table->dataFreeSimple;
table->dataFree = NULL; table->dataFree = NULL;
table->dataFreeSimple = NULL;
virHashRemoveEntry(table, name); virHashRemoveEntry(table, name);
table->dataFree = dataFree; table->dataFree = dataFree;
table->dataFreeSimple = dataFreeSimple;
} }
return data; return data;
} }

View File

@ -30,6 +30,15 @@ typedef virHashAtomic *virHashAtomicPtr;
* Callback to free data from a hash. * Callback to free data from a hash.
*/ */
typedef void (*virHashDataFree) (void *payload, const void *name); 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: * virHashIterator:
* @payload: the data in the hash * @payload: the data in the hash
@ -104,6 +113,7 @@ virHashAtomicPtr virHashAtomicNew(ssize_t size,
virHashDataFree dataFree); virHashDataFree dataFree);
virHashTablePtr virHashCreateFull(ssize_t size, virHashTablePtr virHashCreateFull(ssize_t size,
virHashDataFree dataFree, virHashDataFree dataFree,
virHashDataFreeSimple dataFreeSimple,
virHashKeyCode keyCode, virHashKeyCode keyCode,
virHashKeyEqual keyEqual, virHashKeyEqual keyEqual,
virHashKeyCopy keyCopy, virHashKeyCopy keyCopy,