diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index b7b963112f..6b831b3201 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 21509ac396..998c302567 100644 --- a/src/util/virbitmap.c +++ b/src/util/virbitmap.c @@ -590,6 +590,23 @@ bool virBitmapIsAllSet(virBitmapPtr bitmap) return true; } +/** + * 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 diff --git a/src/util/virbitmap.h b/src/util/virbitmap.h index 044c7a65fc..b682523fbe 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 95d010a113..90be0e281d 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,30 @@ 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; + + if (virBitmapSetBit(bitmap, 11) < 0) + goto error; + + if (virBitmapIsAllClear(bitmap)) + goto error; + + return 0; +error: + virBitmapFree(bitmap); + return -1; +} + static int mymain(void) { @@ -435,7 +471,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; }