[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 1/2] Add simple bitmap operations to utils



---
 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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]