[PATCH v2 06/12] util: hash: Add delete-safe hash iterator
Daniel Henrique Barboza
danielhb413 at gmail.com
Thu Nov 5 13:41:09 UTC 2020
On 11/4/20 2:05 PM, Peter Krempa wrote:
> 'virHashForEach' historically allowed deletion of the current element as
> 'virHashRemoveSet' didn't exits. To prevent us from having to deepy
s/exits/exist
Not sure if you meant 'deeply' instead of deepy (apparently deepy is a
slang for deep, according to google). Either way is fine AFAIC.
Reviewed-by: Daniel Henrique Barboza <danielhb413 at gmail.com>
> analyse all iterators add virHashForEachSafe which first gets a list of
> elements and iterates them outside of the hash table.
>
> This will allow replace the internals of the hash table with other
> implementation which don't allow such operation.
>
> Signed-off-by: Peter Krempa <pkrempa at redhat.com>
> ---
> src/libvirt_private.syms | 1 +
> src/util/virhash.c | 26 +++++++++++++++++++++++---
> src/util/virhash.h | 1 +
> 3 files changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 1793b81ad9..f7b0d11ca2 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -2203,6 +2203,7 @@ virHashAtomicSteal;
> virHashAtomicUpdate;
> virHashEqual;
> virHashForEach;
> +virHashForEachSafe;
> virHashForEachSorted;
> virHashFree;
> virHashGetItems;
> diff --git a/src/util/virhash.c b/src/util/virhash.c
> index f205291de9..e54052985f 100644
> --- a/src/util/virhash.c
> +++ b/src/util/virhash.c
> @@ -481,7 +481,7 @@ virHashRemoveEntry(virHashTablePtr table, const char *name)
>
>
> /**
> - * virHashForEach, virHashForEachSorted
> + * virHashForEach, virHashForEachSorted, virHashForEachSafe
> * @table: the hash table to process
> * @iter: callback to process each element
> * @opaque: opaque data to pass to the iterator
> @@ -490,14 +490,14 @@ virHashRemoveEntry(virHashTablePtr table, const char *name)
> *
> * The elements are iterated in arbitrary order.
> *
> - * virHashForEach allows the callback to remove the current
> + * virHashForEach, virHashForEachSafe allow the callback to remove the current
> * element using virHashRemoveEntry but calling other virHash* functions is
> * prohibited. Note that removing the entry invalidates @key and @payload in
> * the callback.
> *
> * virHashForEachSorted iterates the elements in order by sorted key.
> *
> - * virHashForEachSorted is more computationally
> + * virHashForEachSorted and virHashForEachSafe are more computationally
> * expensive than virHashForEach.
> *
> * If @iter fails and returns a negative value, the evaluation is stopped and -1
> @@ -531,6 +531,26 @@ virHashForEach(virHashTablePtr table, virHashIterator iter, void *opaque)
> }
>
>
> +int
> +virHashForEachSafe(virHashTablePtr table,
> + virHashIterator iter,
> + void *opaque)
> +{
> + g_autofree virHashKeyValuePairPtr items = virHashGetItems(table, NULL, false);
> + size_t i;
> +
> + if (!items)
> + return -1;
> +
> + for (i = 0; items[i].key; i++) {
> + if (iter((void *)items[i].value, items[i].key, opaque) < 0)
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +
> int
> virHashForEachSorted(virHashTablePtr table,
> virHashIterator iter,
> diff --git a/src/util/virhash.h b/src/util/virhash.h
> index 1a59e9799d..b00ab0447e 100644
> --- a/src/util/virhash.h
> +++ b/src/util/virhash.h
> @@ -136,6 +136,7 @@ bool virHashEqual(const virHashTable *table1,
> * Iterators
> */
> int virHashForEach(virHashTablePtr table, virHashIterator iter, void *opaque);
> +int virHashForEachSafe(virHashTablePtr table, virHashIterator iter, void *opaque);
> int virHashForEachSorted(virHashTablePtr table, virHashIterator iter, void *opaque);
> ssize_t virHashRemoveSet(virHashTablePtr table, virHashSearcher iter, const void *opaque);
> void *virHashSearch(const virHashTable *table, virHashSearcher iter,
>
More information about the libvir-list
mailing list