[libvirt] [PATCH 1/3] util: Add a helper to check if all bits of a bitmap are clear
John Ferlan
jferlan at redhat.com
Tue Apr 2 10:52:22 UTC 2013
On 04/02/2013 01:42 AM, Osier Yang wrote:
> ---
> src/libvirt_private.syms | 1 +
> src/util/virbitmap.c | 30 ++++++++++++++++++++++++++++++
> src/util/virbitmap.h | 3 +++
> 3 files changed, 34 insertions(+)
>
Since there already is a "virBitmapIsAllSet()" - why isn't it used? I
see callers which do "if (virBitmapIsAllSet(...)" and "if
(!virBitmapIsAllSet(...)".
If you're going to have a AllClear(), then why not change those !
callers to use AllClear()...
I only wonder about the last comparison - it's the "-1" logic that
throws me off especially since the IsAllSet() code is doing a comparison.
It also stands to reason that tests/virbitmaptest.c could add new tests
to ensure you did get the logic right.
John
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 96eea0a..35ac957 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1048,6 +1048,7 @@ virBitmapEqual;
> virBitmapFormat;
> virBitmapFree;
> virBitmapGetBit;
> +virBitmapIsAllClear;
> virBitmapIsAllSet;
> virBitmapNew;
> virBitmapNewCopy;
> diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c
> index 21509ac..99a8572 100644
> --- a/src/util/virbitmap.c
> +++ b/src/util/virbitmap.c
> @@ -591,6 +591,36 @@ bool virBitmapIsAllSet(virBitmapPtr bitmap)
> }
>
> /**
> + * virBitmapIsAllClear:
> + * @bitmap: the bitmap to check
> + *
> + * check if all bits in @bitmap are clear
> + */
> +bool virBitmapIsAllClear(virBitmapPtr bitmap)
> +{
> + int i;
> + int unusedBits;
> + size_t sz;
> +
> + unusedBits = bitmap->map_len * VIR_BITMAP_BITS_PER_UNIT - bitmap->max_bit;
> +
> + sz = bitmap->map_len;
> + if (unusedBits > 0)
> + sz--;
> +
> + for (i = 0; i < sz; i++)
> + if (bitmap->map[i] != 0)
> + return false;
> +
> + if (unusedBits > 0) {
> + if ((bitmap->map[sz] & ((1UL << (VIR_BITMAP_BITS_PER_UNIT - unusedBits)) - 1)))
> + 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);
>
>
More information about the libvir-list
mailing list