[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v5] libxl: provide libxl_bitmap_{or,and}
provide logical and and or of two bitmaps Signed-off-by: Linda Jacobson <lindaj@xxxxxxxx> --- v.1 new functions v.2 updated comments and format v.3 rewrote bitmap functions to manipulate bytes not bits v.4 made non-modified parameters, and local variables const; fixed code formatting v.5 changed commit subject line --- tools/libxl/libxl_utils.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl_utils.h | 7 +++++ 2 files changed, 80 insertions(+) diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c index 9053b27..2241da9 100644 --- a/tools/libxl/libxl_utils.c +++ b/tools/libxl/libxl_utils.c @@ -691,6 +691,79 @@ void libxl_bitmap_reset(libxl_bitmap *bitmap, int bit) bitmap->map[bit / 8] &= ~(1 << (bit & 7)); } + +int libxl_bitmap_or(libxl_ctx *ctx, libxl_bitmap *or_map, + const libxl_bitmap *map1, const libxl_bitmap *map2) +{ + GC_INIT(ctx); + int rc; + uint32_t i; + const libxl_bitmap *large_map; + const libxl_bitmap *small_map; + + if (map1->size > map2->size) { + large_map = map1; + small_map = map2; + } else { + large_map = map2; + small_map = map1; + } + + rc = libxl_bitmap_alloc(ctx, or_map, large_map->size * 8); + if (rc) + goto out; + + /* + * If bitmaps aren't the same size, their union (logical or) will + * be size of larger bit map. Any bit past the end of the + * smaller bit map, will match the larger one. + */ + for (i = 0; i < small_map->size; i++) + or_map->map[i] = (small_map->map[i] | large_map->map[i]); + + for (i = small_map->size; i < large_map->size; i++) + or_map->map[i] = large_map->map[i]; + +out: + GC_FREE; + return rc; +} + +int libxl_bitmap_and(libxl_ctx *ctx, libxl_bitmap *and_map, + const libxl_bitmap *map1, const libxl_bitmap *map2) +{ + GC_INIT(ctx); + int rc; + uint32_t i; + const libxl_bitmap *large_map; + const libxl_bitmap *small_map; + + if (map1->size > map2->size) { + large_map = map1; + small_map = map2; + } else { + large_map = map2; + small_map = map1; + } + + + rc = libxl_bitmap_alloc(ctx, and_map, small_map->size * 8); + if (rc) + goto out; + + /* + * If bitmaps aren't same size, their 'and' will be size of + * smaller bit map + */ + for (i = 0; i < and_map->size; i++) + and_map->map[i] = (large_map->map[i] & small_map->map[i]); + +out: + GC_FREE; + return rc; + +} + int libxl_bitmap_count_set(const libxl_bitmap *bitmap) { int i, nr_set_bits = 0; diff --git a/tools/libxl/libxl_utils.h b/tools/libxl/libxl_utils.h index acacdd9..a128a7c 100644 --- a/tools/libxl/libxl_utils.h +++ b/tools/libxl/libxl_utils.h @@ -90,6 +90,13 @@ int libxl_bitmap_test(const libxl_bitmap *bitmap, int bit); 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); +/* Or and and functions for two bitmaps */ +int libxl_bitmap_or(libxl_ctx *ctx, libxl_bitmap *or_map, + const libxl_bitmap *map1, + const libxl_bitmap *map2); +int libxl_bitmap_and(libxl_ctx *ctx, libxl_bitmap *and_map, + const libxl_bitmap *map1, + const libxl_bitmap *map2); char *libxl_bitmap_to_hex_string(libxl_ctx *ctx, const libxl_bitmap *cpumap); static inline void libxl_bitmap_set_any(libxl_bitmap *bitmap) { -- 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 |