All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] tools/libxl new bitmap functions
@ 2015-04-02 17:38 Linda Jacobson
  2015-04-02 19:34 ` Konrad Rzeszutek Wilk
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Linda Jacobson @ 2015-04-02 17:38 UTC (permalink / raw)
  To: xen-devel; +Cc: julien.grall, xen-devel, wei.liu2, lars.kurth, lindaj

From: Linda <lindaj@jma3.com>

Added bitmap functions for union intersection and difference betweenn two bitmaps

Signed-off-by: Linda <lindaj@jma3.com>
---
 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

^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2015-04-07 15:52 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-04-02 17:38 [PATCH] tools/libxl new bitmap functions Linda Jacobson
2015-04-02 19:34 ` Konrad Rzeszutek Wilk
2015-04-03 14:37   ` Dario Faggioli
2015-04-07 15:45   ` Linda
2015-04-07 15:51     ` Julien Grall
2015-04-03  9:25 ` Dario Faggioli
2015-04-03 13:48   ` Linda
2015-04-03 14:34     ` Dario Faggioli
2015-04-07 10:54 ` Wei Liu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.