mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-04 05:15:46 +00:00
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:
parent
5bf573f62b
commit
49288fac96
@ -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,
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user