
On 02/01/2013 09:16 PM, Eric Blake wrote:
We had an easy way to iterate set bits, but not for iterating cleared bits.
* src/util/virbitmap.h (virBitmapNextClearBit): New prototype. * src/util/virbitmap.c (virBitmapNextClearBit): Implement it. * src/libvirt_private.syms (bitmap.h): Export it. * tests/virbitmaptest.c (test4): Test it. ---
I didn't test it yours so far... Here's at least the part of the test I had fabricated (your bitmap extension seems better): Index: libvirt/tests/virbitmaptest.c =================================================================== --- libvirt.orig/tests/virbitmaptest.c +++ libvirt/tests/virbitmaptest.c @@ -390,6 +390,74 @@ error: return -1; } +/* test for virBitmapNextClearBit */ +static int test8(const void *data ATTRIBUTE_UNUSED) +{ + const char *bitsString = "0, 2-4, 6-10, 12, 14-18, 20, 22, 25, 28-33, 35, " + "41-42, 45-46"; + int size = 48; + int noBitsPos[] = { + 1, 5, 11, 13, 19, 21, 23, 24, + 26, 27, 34, 36, 37, 38, 39, 40, + 43, 44, 47 + }; + int npos = 19; + virBitmapPtr bitmap = NULL; + int i, j; + + /* 1. zero set */ + + bitmap = virBitmapNew(size); + if (!bitmap) + goto error; + + if (virBitmapNextClearBit(bitmap, -1) != 0) + goto error; + + virBitmapFree(bitmap); + bitmap = NULL; + + /* 2. partial set */ + + if (virBitmapParse(bitsString, 0, &bitmap, size) < 0) + goto error; + if (!bitmap) + goto error; + + j = 0; + i = -1; + + while (j < npos) { + i = virBitmapNextClearBit(bitmap, i); + if (i != noBitsPos[j++]) + goto error; + } + + if (virBitmapNextSetBit(bitmap, i) > 0) + goto error; + + /* 3. full set */ + + i = -1; + virBitmapSetAll(bitmap); + + for (j = 0; j < size; j++) { + i = virBitmapNextSetBit(bitmap, i); + if (i != j) + goto error; + } + + if (virBitmapNextClearBit(bitmap, i) > 0) + goto error; + + virBitmapFree(bitmap); + return 0; + +error: + virBitmapFree(bitmap); + return -1; +} + static int mymain(void) { @@ -409,6 +477,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; Maybe we can merge the two for a joint effort :-) -- leaving test 4 untouched. Patch 3 of the series has calls missing regarding clearing of the bitmap upon failure and VM shutdown. I added that after sending. Regards, Stefan