[libvirt] [PATCHv2 1/2] nwfilter: utility function virNWFilterVarValueEqual
Michal Privoznik
mprivozn at redhat.com
Fri Nov 30 09:25:18 UTC 2012
On 29.11.2012 19:30, Laine Stump wrote:
> From: Stefan Berger <stefanb at us.ibm.com>
>
> To detect if an interface's nwfilter has changed, we need to also
> compare the filterparams, which is a hashtable of virNWFilterVarValue.
> virHashEqual can do this nicely, but requires a pointer to a function
> that will compare two of the items being stored in the hashes.
> ---
> src/conf/nwfilter_params.c | 31 +++++++++++++++++++++++++++++++
> src/conf/nwfilter_params.h | 2 ++
> src/libvirt_private.syms | 1 +
> 3 files changed, 34 insertions(+)
>
> diff --git a/src/conf/nwfilter_params.c b/src/conf/nwfilter_params.c
> index 6dc4baa..3ac1303 100644
> --- a/src/conf/nwfilter_params.c
> +++ b/src/conf/nwfilter_params.c
> @@ -189,6 +189,37 @@ virNWFilterVarValueGetCardinality(const virNWFilterVarValuePtr val)
> return 0;
> }
>
> +bool
> +virNWFilterVarValueEqual(const virNWFilterVarValuePtr a,
> + const virNWFilterVarValuePtr b)
> +{
> + unsigned int card, i, j;
> + const char *s;
> +
> + if (!a || !b)
> + return false;
> +
> + card = virNWFilterVarValueGetCardinality(a);
> + if (card != virNWFilterVarValueGetCardinality(b))
> + return false;
> +
> + /* brute force O(n^2) comparison */
> + for (i = 0; i < card; i++) {
> + bool eq = false;
> +
> + s = virNWFilterVarValueGetNthValue(a, i);
> + for (j = 0; j < card; j++) {
> + if (STREQ_NULLABLE(s, virNWFilterVarValueGetNthValue(b, j))) {
> + eq = true;
> + break;
> + }
> + }
> + if (!eq)
> + return false;
> + }
> + return true;
> +}
> +
Seems reasonable. The quadratic time complexity could be avoided if @a
and @b items are sorted. And since this is just a callback to
virHashEqual() we shouldn't be doing anything here but comparing.
> int
> virNWFilterVarValueAddValue(virNWFilterVarValuePtr val, char *value)
> {
> diff --git a/src/conf/nwfilter_params.h b/src/conf/nwfilter_params.h
> index cedf9cd..96d3033 100644
> --- a/src/conf/nwfilter_params.h
> +++ b/src/conf/nwfilter_params.h
> @@ -57,6 +57,8 @@ const char *virNWFilterVarValueGetSimple(const virNWFilterVarValuePtr val);
> const char *virNWFilterVarValueGetNthValue(virNWFilterVarValuePtr val,
> unsigned int idx);
> unsigned int virNWFilterVarValueGetCardinality(const virNWFilterVarValuePtr);
> +bool virNWFilterVarValueEqual(const virNWFilterVarValuePtr a,
> + const virNWFilterVarValuePtr b);
> int virNWFilterVarValueAddValue(virNWFilterVarValuePtr val, char *value);
> int virNWFilterVarValueDelValue(virNWFilterVarValuePtr val, const char *value);
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 2573b8a..ada73fb 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -968,6 +968,7 @@ virNWFilterVarValueCopy;
> virNWFilterVarValueCreateSimple;
> virNWFilterVarValueCreateSimpleCopyValue;
> virNWFilterVarValueDelValue;
> +virNWFilterVarValueEqual;
> virNWFilterVarValueFree;
> virNWFilterVarValueGetCardinality;
> virNWFilterVarValueGetNthValue;
>
ACK
Michal
More information about the libvir-list
mailing list