On 29.11.2012 19:30, Laine Stump wrote:
From: Stefan Berger <stefanb(a)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