|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] new functions libxl_bitmap_{or,and}
provide logical and and or of two bitmaps
---
v.1 updated comments and format
v.2 rewrote bitmap functions to manipulate bytes not bits
Signed-off-by: Linda Jacobson <lindaj@xxxxxxxx>
---
tools/libxl/libxl_utils.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++
tools/libxl/libxl_utils.h | 5 ++++
2 files changed, 79 insertions(+)
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
index 9053b27..5c7178f 100644
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -691,6 +691,80 @@ void libxl_bitmap_reset(libxl_bitmap *bitmap, int bit)
bitmap->map[bit / 8] &= ~(1 << (bit & 7));
}
+/* provide logical or and logical and of two bitmaps */
+int libxl_bitmap_or(libxl_ctx *ctx, libxl_bitmap *or_map,
+ libxl_bitmap *map1, libxl_bitmap *map2)
+{
+ GC_INIT(ctx);
+ int rc;
+ uint32_t i;
+ libxl_bitmap *lgmap;
+ libxl_bitmap *smap;
+
+ if (map1->size > map2->size) {
+ lgmap = map1;
+ smap = map2;
+ }
+ else {
+ lgmap = map2;
+ smap = map1;
+ }
+
+ rc = libxl_bitmap_alloc(ctx, or_map, lgmap->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 < smap->size; i++)
+ or_map->map[i] = (smap->map[i] | lgmap->map[i]);
+
+ for (i = smap->size; i < lgmap->size; i++)
+ or_map->map[i] = lgmap->map[i];
+
+out:
+ GC_FREE;
+ return rc;
+}
+
+int libxl_bitmap_and(libxl_ctx *ctx, libxl_bitmap *and_map,
+ libxl_bitmap *map1, libxl_bitmap *map2)
+{
+ GC_INIT(ctx);
+ int rc;
+ uint32_t i;
+ libxl_bitmap *lgmap, *smap;
+
+ if (map1->size > map2->size) {
+ lgmap = map1;
+ smap = map2;
+ }
+ else {
+ lgmap = map2;
+ smap = map1;
+ }
+
+
+ rc = libxl_bitmap_alloc(ctx, and_map, smap->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] = (lgmap->map[i] & smap->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..1c0086b 100644
--- a/tools/libxl/libxl_utils.h
+++ b/tools/libxl/libxl_utils.h
@@ -90,6 +90,11 @@ 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,
+ libxl_bitmap *map1, libxl_bitmap *map2);
+int libxl_bitmap_and(libxl_ctx *ctx, libxl_bitmap *and_map,
+ libxl_bitmap *map1, 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 |