qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 09/18] bitmap: add a simple foreach util


From: Marc-André Lureau
Subject: [Qemu-devel] [PATCH 09/18] bitmap: add a simple foreach util
Date: Mon, 5 Sep 2016 02:20:30 +0400

Signed-off-by: Marc-André Lureau <address@hidden>
---
 include/qemu/bitmap.h | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/include/qemu/bitmap.h b/include/qemu/bitmap.h
index ec5146f..33bb294 100644
--- a/include/qemu/bitmap.h
+++ b/include/qemu/bitmap.h
@@ -223,6 +223,29 @@ static inline int bitmap_intersects(const unsigned long 
*src1,
     }
 }
 
+static inline void bitmap_foreach(unsigned long *bitmap, int size,
+                                  void (*cb)(int i, void *opaque),
+                                  void *opaque)
+{
+    unsigned long lbitmap[BITS_TO_LONGS(size)];
+    unsigned j;
+
+    memcpy(lbitmap, bitmap, sizeof(lbitmap));
+    memset(bitmap, 0, sizeof(lbitmap));
+
+    for (j = 0; j < size; j += BITS_PER_LONG) {
+        unsigned long bits = lbitmap[j];
+
+        while (bits != 0) {
+            unsigned i = j + ctzl(bits);
+
+            (*cb)(i, opaque);
+
+            bits &= bits - 1; /* clear right-most bit */
+        }
+    }
+}
+
 void bitmap_set(unsigned long *map, long i, long len);
 void bitmap_set_atomic(unsigned long *map, long i, long len);
 void bitmap_clear(unsigned long *map, long start, long nr);
-- 
2.9.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]