[libvirt] [PATCH v3] util: Add a helper to check if all bits of a bitmap are clear

Osier Yang jyang at redhat.com
Fri Apr 5 18:06:16 UTC 2013


---
 src/libvirt_private.syms |  1 +
 src/util/virbitmap.c     | 17 +++++++++++++++++
 src/util/virbitmap.h     |  3 +++
 tests/virbitmaptest.c    | 33 ++++++++++++++++++++++++++++++++-
 4 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index b7b9631..6b831b3 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1046,6 +1046,7 @@ virBitmapEqual;
 virBitmapFormat;
 virBitmapFree;
 virBitmapGetBit;
+virBitmapIsAllClear;
 virBitmapIsAllSet;
 virBitmapNew;
 virBitmapNewCopy;
diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c
index 21509ac..998c302 100644
--- a/src/util/virbitmap.c
+++ b/src/util/virbitmap.c
@@ -591,6 +591,23 @@ bool virBitmapIsAllSet(virBitmapPtr bitmap)
 }
 
 /**
+ * virBitmapIsAllClear:
+ * @bitmap: the bitmap to check
+ *
+ * check if all bits in @bitmap are clear
+ */
+bool virBitmapIsAllClear(virBitmapPtr bitmap)
+{
+    int i;
+
+    for (i = 0; i < bitmap->map_len; i++)
+        if (bitmap->map[i] != 0)
+            return false;
+
+    return true;
+}
+
+/**
  * virBitmapNextSetBit:
  * @bitmap: the bitmap
  * @pos: the position after which to search for a set bit
diff --git a/src/util/virbitmap.h b/src/util/virbitmap.h
index 044c7a6..b682523 100644
--- a/src/util/virbitmap.h
+++ b/src/util/virbitmap.h
@@ -100,6 +100,9 @@ void virBitmapClearAll(virBitmapPtr bitmap)
 bool virBitmapIsAllSet(virBitmapPtr bitmap)
     ATTRIBUTE_NONNULL(1);
 
+bool virBitmapIsAllClear(virBitmapPtr bitmap)
+    ATTRIBUTE_NONNULL(1);
+
 ssize_t virBitmapNextSetBit(virBitmapPtr bitmap, ssize_t pos)
     ATTRIBUTE_NONNULL(1);
 
diff --git a/tests/virbitmaptest.c b/tests/virbitmaptest.c
index 95d010a..3067f6e 100644
--- a/tests/virbitmaptest.c
+++ b/tests/virbitmaptest.c
@@ -125,6 +125,8 @@ static int test2(const void *data ATTRIBUTE_UNUSED)
         goto error;
 
     virBitmapClearAll(bitmap);
+    if (!virBitmapIsAllClear(bitmap))
+        goto error;
     if (testBit(bitmap, 0, size - 1, false) < 0)
         goto error;
     if (virBitmapCountBits(bitmap) != 0)
@@ -154,6 +156,9 @@ static int test3(const void *data ATTRIBUTE_UNUSED)
     if (!virBitmapIsAllSet(bitmap))
         goto error;
 
+    virBitmapClearAll(bitmap);
+    if (!virBitmapIsAllClear(bitmap))
+        goto error;
     ret = 0;
 
 error:
@@ -196,6 +201,9 @@ static int test4(const void *data ATTRIBUTE_UNUSED)
     if (virBitmapNextClearBit(bitmap, i) != -1)
         goto error;
 
+    if (!virBitmapIsAllClear(bitmap))
+        goto error;
+
     virBitmapFree(bitmap);
     bitmap = NULL;
 
@@ -406,6 +414,10 @@ static int test7(const void *v ATTRIBUTE_UNUSED)
         if (!virBitmapIsAllSet(bitmap))
             goto error;
 
+        virBitmapClearAll(bitmap);
+        if (!virBitmapIsAllClear(bitmap))
+            goto error;
+
         virBitmapFree(bitmap);
     }
 
@@ -416,6 +428,24 @@ error:
     return -1;
 }
 
+static int test8(const void *v ATTRIBUTE_UNUSED)
+{
+    virBitmapPtr bitmap = NULL;
+    char data[108] = {0x00,};
+
+    bitmap = virBitmapNewData(data, sizeof(data));
+    if (!bitmap)
+        goto error;
+
+    if (!virBitmapIsAllClear(bitmap))
+        goto error;
+
+    return 0;
+error:
+    virBitmapFree(bitmap);
+    return -1;
+}
+
 static int
 mymain(void)
 {
@@ -435,7 +465,8 @@ mymain(void)
         ret = -1;
     if (virtTestRun("test7", 1, test7, NULL) < 0)
         ret = -1;
-
+    if (virtTestRun("test8", 1, test8, NULL) < 0)
+        ret = -1;
 
     return ret;
 }
-- 
1.8.1.4




More information about the libvir-list mailing list