mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-03 11:35:19 +00:00
bitmap: add virBitmapLastSetBit for finding the last bit position of bitmap
Signed-off-by: Chen Fan <chen.fan.fnst@cn.fujitsu.com>
This commit is contained in:
parent
4480cd2837
commit
d2460f85d3
@ -1011,6 +1011,7 @@ virBitmapFree;
|
|||||||
virBitmapGetBit;
|
virBitmapGetBit;
|
||||||
virBitmapIsAllClear;
|
virBitmapIsAllClear;
|
||||||
virBitmapIsAllSet;
|
virBitmapIsAllSet;
|
||||||
|
virBitmapLastSetBit;
|
||||||
virBitmapNew;
|
virBitmapNew;
|
||||||
virBitmapNewCopy;
|
virBitmapNewCopy;
|
||||||
virBitmapNewData;
|
virBitmapNewData;
|
||||||
|
@ -650,6 +650,51 @@ virBitmapNextSetBit(virBitmapPtr bitmap, ssize_t pos)
|
|||||||
return ffsl(bits) - 1 + nl * VIR_BITMAP_BITS_PER_UNIT;
|
return ffsl(bits) - 1 + nl * VIR_BITMAP_BITS_PER_UNIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virBitmapLastSetBit:
|
||||||
|
* @bitmap: the bitmap
|
||||||
|
*
|
||||||
|
* Search for the last set bit in bitmap @bitmap.
|
||||||
|
*
|
||||||
|
* Returns the position of the found bit, or -1 if no bit is set.
|
||||||
|
*/
|
||||||
|
ssize_t
|
||||||
|
virBitmapLastSetBit(virBitmapPtr bitmap)
|
||||||
|
{
|
||||||
|
ssize_t i;
|
||||||
|
int unusedBits;
|
||||||
|
ssize_t sz;
|
||||||
|
unsigned long bits;
|
||||||
|
|
||||||
|
unusedBits = bitmap->map_len * VIR_BITMAP_BITS_PER_UNIT - bitmap->max_bit;
|
||||||
|
|
||||||
|
sz = bitmap->map_len - 1;
|
||||||
|
if (unusedBits > 0) {
|
||||||
|
bits = bitmap->map[sz] & (VIR_BITMAP_BIT(VIR_BITMAP_BITS_PER_UNIT - unusedBits) - 1);
|
||||||
|
if (bits != 0)
|
||||||
|
goto found;
|
||||||
|
|
||||||
|
sz--;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; sz >= 0; sz--) {
|
||||||
|
bits = bitmap->map[sz];
|
||||||
|
if (bits != 0)
|
||||||
|
goto found;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bits == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
found:
|
||||||
|
for (i = VIR_BITMAP_BITS_PER_UNIT - 1; i >= 0; i--) {
|
||||||
|
if (bits & 1UL << i)
|
||||||
|
return i + sz * VIR_BITMAP_BITS_PER_UNIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virBitmapNextClearBit:
|
* virBitmapNextClearBit:
|
||||||
* @bitmap: the bitmap
|
* @bitmap: the bitmap
|
||||||
|
@ -105,6 +105,9 @@ bool virBitmapIsAllClear(virBitmapPtr bitmap)
|
|||||||
ssize_t virBitmapNextSetBit(virBitmapPtr bitmap, ssize_t pos)
|
ssize_t virBitmapNextSetBit(virBitmapPtr bitmap, ssize_t pos)
|
||||||
ATTRIBUTE_NONNULL(1);
|
ATTRIBUTE_NONNULL(1);
|
||||||
|
|
||||||
|
ssize_t virBitmapLastSetBit(virBitmapPtr bitmap)
|
||||||
|
ATTRIBUTE_NONNULL(1);
|
||||||
|
|
||||||
ssize_t virBitmapNextClearBit(virBitmapPtr bitmap, ssize_t pos)
|
ssize_t virBitmapNextClearBit(virBitmapPtr bitmap, ssize_t pos)
|
||||||
ATTRIBUTE_NONNULL(1);
|
ATTRIBUTE_NONNULL(1);
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@ test3(const void *data ATTRIBUTE_UNUSED)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* test for virBitmapNextSetBit, virBitmapNextClearBit */
|
/* test for virBitmapNextSetBit, virBitmapLastSetBit, virBitmapNextClearBit */
|
||||||
static int
|
static int
|
||||||
test4(const void *data ATTRIBUTE_UNUSED)
|
test4(const void *data ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
@ -200,6 +200,9 @@ test4(const void *data ATTRIBUTE_UNUSED)
|
|||||||
if (virBitmapNextSetBit(bitmap, -1) != -1)
|
if (virBitmapNextSetBit(bitmap, -1) != -1)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
if (virBitmapLastSetBit(bitmap) != -1)
|
||||||
|
goto error;
|
||||||
|
|
||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
||||||
if (virBitmapNextClearBit(bitmap, i - 1) != i)
|
if (virBitmapNextClearBit(bitmap, i - 1) != i)
|
||||||
goto error;
|
goto error;
|
||||||
@ -232,6 +235,11 @@ test4(const void *data ATTRIBUTE_UNUSED)
|
|||||||
if (virBitmapNextSetBit(bitmap, i) != -1)
|
if (virBitmapNextSetBit(bitmap, i) != -1)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
j = sizeof(bitsPos)/sizeof(int) - 1;
|
||||||
|
|
||||||
|
if (virBitmapLastSetBit(bitmap) != bitsPos[j])
|
||||||
|
goto error;
|
||||||
|
|
||||||
j = 0;
|
j = 0;
|
||||||
i = -1;
|
i = -1;
|
||||||
|
|
||||||
@ -255,6 +263,9 @@ test4(const void *data ATTRIBUTE_UNUSED)
|
|||||||
if (virBitmapNextSetBit(bitmap, i) != -1)
|
if (virBitmapNextSetBit(bitmap, i) != -1)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
if (virBitmapLastSetBit(bitmap) != size - 1)
|
||||||
|
goto error;
|
||||||
|
|
||||||
if (virBitmapNextClearBit(bitmap, -1) != -1)
|
if (virBitmapNextClearBit(bitmap, -1) != -1)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user