--- src/util/util.c | 38 ++++++++++++++++++++++++++++++++++++++ src/util/util.h | 10 ++++++++++ 2 files changed, 48 insertions(+), 0 deletions(-) diff --git a/src/util/util.c b/src/util/util.c index 26ac6ba..e600bef 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -2817,3 +2817,41 @@ int virBuildPathInternal(char **path, ...) return ret; } + +/* would CHAR_BIT or such be better than explicit '8'? */ +#define VIR_BITMAP_BITS_PER_UNIT (sizeof(virBitmap) * 8) +#define VIR_BITMAP_UNIT_OFFSET(b) ((b) / VIR_BITMAP_BITS_PER_UNIT) +#define VIR_BITMAP_BIT_OFFSET(b) ((b) % VIR_BITMAP_BITS_PER_UNIT) + +virBitmapPtr virBitmapAlloc(unsigned int size) +{ + virBitmapPtr bitmap; + unsigned int sz = (size / VIR_BITMAP_BITS_PER_UNIT) + + (size % VIR_BITMAP_BITS_PER_UNIT); + + if (VIR_ALLOC_N(bitmap, sz) < 0) + return NULL; + return bitmap; +} + +void virBitmapFree(virBitmapPtr bitmap) +{ + VIR_FREE(bitmap); +} + +void virBitmapSetBit(virBitmapPtr bitmap, unsigned int b) +{ + bitmap[VIR_BITMAP_UNIT_OFFSET(b)] |= (1 << VIR_BITMAP_BIT_OFFSET(b)); +} + +void virBitmapClearBit(virBitmapPtr bitmap, unsigned int b) +{ + bitmap[VIR_BITMAP_UNIT_OFFSET(b)] &= ~(1 << VIR_BITMAP_BIT_OFFSET(b)); +} + +int virBitmapGetBit(virBitmapPtr bitmap, unsigned int b) +{ + virBitmap bit = bitmap[VIR_BITMAP_UNIT_OFFSET(b)] & + (1 << VIR_BITMAP_BIT_OFFSET(b)); + return bit != 0; +} diff --git a/src/util/util.h b/src/util/util.h index 6bf6bcc..077e9c9 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -31,6 +31,7 @@ # include <unistd.h> # include <sys/select.h> # include <sys/types.h> +# include <stdint.h> # ifndef MIN # define MIN(a, b) ((a) < (b) ? (a) : (b)) @@ -274,4 +275,13 @@ void virFileWaitForDevices(void); # define virBuildPath(path, ...) virBuildPathInternal(path, __VA_ARGS__, NULL) int virBuildPathInternal(char **path, ...) ATTRIBUTE_SENTINEL; +typedef uint32_t virBitmap; +typedef virBitmap *virBitmapPtr; + +virBitmapPtr virBitmapAlloc(unsigned int size); +void virBitmapFree(virBitmapPtr bitmap); +void virBitmapSetBit(virBitmap *bitmap, unsigned int b); +void virBitmapClearBit(virBitmap *bitmap, unsigned int b); +int virBitmapGetBit(virBitmap *bitmap, unsigned int b); + #endif /* __VIR_UTIL_H__ */ -- 1.6.0.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list