util: Introduce virBitmapShrink

Sometimes the size of the bitmap matters and it might not be guessed correctly
when parsing from some type of input.  For example virBitmapNewData() has Byte
granularity, virBitmapNewString() has nibble granularity and so on.
virBitmapParseUnlimited() can be tricked into creating huge bitmap that's not
needed (e.g.: "0-2,^99999999").  This function provides a way to shrink the
bitmap.  It is not supposed to free any memory.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
Martin Kletzander 2017-11-09 16:12:33 +01:00
parent 449442c34d
commit baca005367
3 changed files with 26 additions and 0 deletions

View File

@ -1375,6 +1375,7 @@ virBitmapParseUnlimited;
virBitmapSetAll;
virBitmapSetBit;
virBitmapSetBitExpand;
virBitmapShrink;
virBitmapSize;
virBitmapSubtract;
virBitmapToData;

View File

@ -1196,3 +1196,26 @@ virBitmapSubtract(virBitmapPtr a,
for (i = 0; i < max; i++)
a->map[i] &= ~b->map[i];
}
/**
* virBitmapShrink:
* @map: Pointer to bitmap
* @b: last bit position to be excluded from bitmap
*
* Resizes the bitmap so that no more than @b bits will fit into it. Nothing
* will change if the size is already smaller than @b.
*
* NB: Does not adjust the map->map_len so that a subsequent virBitmapExpand
* doesn't necessarily need to reallocate.
*/
void
virBitmapShrink(virBitmapPtr map,
size_t b)
{
if (!map)
return;
if (map->max_bit >= b)
map->max_bit = b;
}

View File

@ -153,4 +153,6 @@ void virBitmapIntersect(virBitmapPtr a, virBitmapPtr b)
void virBitmapSubtract(virBitmapPtr a, virBitmapPtr b)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
void virBitmapShrink(virBitmapPtr map, size_t b);
#endif