[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] tools/libxl new bitmap functions
From: Linda <lindaj@xxxxxxxx> Added bitmap functions for union intersection and difference betweenn two bitmaps Signed-off-by: Linda <lindaj@xxxxxxxx> --- tools/libxl/libxl_utils.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl_utils.h | 10 ++++ 2 files changed, 125 insertions(+) diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 9053b27..c390ddc 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -699,6 +699,121 @@ int libxl_bitmap_count_set(const libxl_bitmap *bitmap) return nr_set_bits; } +int libxl_bitmap_union(libxl_ctx *ctx, libxl_bitmap *union_bitmap, +libxl_bitmap *bitmap1, libxl_bitmap *bitmap2) +{ + int size; + int rc; + + GC_INIT(ctx); + +// if bitmaps aren't the same size, union should be size of larger bit map + size = (bitmap1->size > bitmap2->size) ? bitmap1->size : bitmap2->size; + + libxl_bitmap_init(union_bitmap); + rc = libxl_bitmap_alloc(ctx, union_bitmap, size); + if (rc) + { + // Following the coding standards here. + //First goto I've written in decades. + goto out; + } + + for (int bit = 0; bit < (size * 8); bit++) + { + // libxl_bitmap_test returns 0 if past end of bitmap + // if the bit is set in either bitmap, set it in their union + if (libxl_bitmap_test(bitmap1, bit)) + { + libxl_bitmap_set(union_bitmap, bit); + } + else if (libxl_bitmap_test(bitmap2, bit)) + { + libxl_bitmap_set(union_bitmap, bit); + } + } + +out: + GC_FREE; + return rc; +} + +int libxl_bitmap_intersection (libxl_ctx *ctx, libxl_bitmap +*intersection_bitmap, libxl_bitmap *bitmap1, libxl_bitmap *bitmap2) +{ + int size; + int rc; + + GC_INIT(ctx); + +// if bitmaps aren't same size, intersection should be size of +// smaller bit map + size = (bitmap1->size > bitmap2->size) ? bitmap2->size : bitmap1->size; + + libxl_bitmap_init(intersection_bitmap); + rc = libxl_bitmap_alloc(ctx, intersection_bitmap, size); + if (rc) + { + goto out; + } + + for (int bit = 0; bit < (size * 8); bit++) + { + // libxl_bitmap_test returns 0 if past end of bitmap + // if the bit is set in both bitmaps, set it in their intersection + if (libxl_bitmap_test (bitmap1, bit) && + libxl_bitmap_test (bitmap2, bit) ) + { + libxl_bitmap_set (intersection_bitmap, bit); + } + } + +out: + GC_FREE; + return rc; +} +int libxl_bitmap_difference(libxl_ctx *ctx, libxl_bitmap *difference_bitmap, +libxl_bitmap *bitmap1, libxl_bitmap *bitmap2) +{ + int size; + int rc; + + GC_INIT(ctx); + +// if bitmaps aren't the same size, difference should be size of larger + size = (bitmap1->size > bitmap2->size) ? bitmap1->size : bitmap2->size; + + libxl_bitmap_init(difference_bitmap); + rc = libxl_bitmap_alloc(ctx, difference_bitmap, size); + if (rc) + { + goto out; + } + + for (int bit = 0; bit < (size * 8); bit++) + { + /* libxl_bitmap_test returns 0 if past end of bitmap + if the bit is set in one bitmap and not the other, set it in +their difference + NOTE: if one bit map is larger, this will result in all bits +being set past the size of the smaller bitmap; if this is not + the desired behavior, please let me know + */ + + if (libxl_bitmap_test (bitmap1, bit) + && (!libxl_bitmap_test (bitmap2, bit)) ) + { + libxl_bitmap_set (difference_bitmap, bit); + } + } + +out: + GC_FREE; + return rc; +} + + + /* NB. caller is responsible for freeing the memory */ char *libxl_bitmap_to_hex_string(libxl_ctx *ctx, const libxl_bitmap *bitmap) diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h index acacdd9..521e4bb 100644 --- a/tools/libxl/libxl_utils.h +++ b/tools/libxl/libxl_utils.h @@ -91,6 +91,16 @@ void libxl_bitmap_set(libxl_bitmap *bitmap, int bit); void libxl_bitmap_reset(libxl_bitmap *bitmap, int bit); int libxl_bitmap_count_set(const libxl_bitmap *cpumap); char *libxl_bitmap_to_hex_string(libxl_ctx *ctx, const libxl_bitmap *cpumap); +/* + union, intersection and difference functions for + two bitmaps +*/ +int libxl_bitmap_union(libxl_ctx *ctx, libxl_bitmap *new_bitmap, libxl_bitmap *bitmap1, libxl_bitmap *bitmap2); + +int libxl_bitmap_intersection(libxl_ctx *ctx, libxl_bitmap *new_bitmap, libxl_bitmap *bitmap1, libxl_bitmap *bitmap2); + +int libxl_bitmap_difference(libxl_ctx *ctx, libxl_bitmap *new_bitmap, libxl_bitmap *bitmap1, libxl_bitmap *bitmap2); + static inline void libxl_bitmap_set_any(libxl_bitmap *bitmap) { memset(bitmap->map, -1, bitmap->size); -- 1.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |