Bitmask updates
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 23 Feb 2011 22:35:00 +0000 (14:35 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:58 +0000 (17:35 -0700)
Extracted some arch-indep code into inc/bitmask.h.  Adds
BITMASK_FOREACH_SET(), which will execute a function passing it the
number of each set bit in the map.

21 files changed:
kern/arch/i686/bitmask.h
kern/arch/i686/colored_caches.c
kern/arch/i686/smp.c
kern/arch/i686/smp_boot.c
kern/arch/sparc/bitmask.h
kern/include/bitmask.h [new file with mode: 0644]
kern/include/vfs.h
kern/src/atomic.c
kern/src/colored_caches.c
kern/src/env.c
kern/src/event.c
kern/src/ext2fs.c
kern/src/init.c
kern/src/page_alloc.c
kern/src/process.c
kern/src/syscall.c
kern/src/testing.c
user/parlib/event.c
user/parlib/include/bitmask.h [new file with mode: 0644]
user/parlib/include/i686/bitmask.h
user/parlib/include/sparc/bitmask.h

index a775d9d..abb8a94 100644 (file)
@@ -110,35 +110,4 @@ static inline bool BITMASK_IS_FULL(uint8_t* map, size_t size)
        printk("\n"); \
 }
 
-static inline bool BITMASK_IS_SET_IN_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               if(!GET_BITMASK_BIT(m, i))
-                       return FALSE;
-       }
-       return TRUE;
-}
-
-static inline bool BITMASK_IS_CLR_IN_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               if(GET_BITMASK_BIT(m, i))
-                       return FALSE;
-       }
-       return TRUE;
-}
-
-static inline void SET_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               SET_BITMASK_BIT(m, i);
-       }
-}
-
-static inline void CLR_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               CLR_BITMASK_BIT(m, i);
-       }
-}
 #endif /* ROS_ARCH_BITMASK_H */
index 95c91c0..b5d923c 100644 (file)
@@ -11,7 +11,7 @@
 #endif
 
 #include <error.h>
-#include <arch/bitmask.h>
+#include <bitmask.h>
 #include <colored_caches.h>
 #include <process.h>
 
index 1a33a6c..1655cdf 100644 (file)
@@ -9,7 +9,7 @@
 #endif
 
 #include <arch/arch.h>
-#include <arch/bitmask.h>
+#include <bitmask.h>
 #include <smp.h>
 
 #include <atomic.h>
index 10a831c..ad62926 100644 (file)
 #include <smp.h>
 #include <arch/console.h>
 #include <arch/apic.h>
-#include <arch/bitmask.h>
 #include <arch/perfmon.h>
 #include <timing.h>
 
+#include <bitmask.h>
 #include <atomic.h>
 #include <error.h>
 #include <stdio.h>
index d427571..63d4ef1 100644 (file)
@@ -75,36 +75,4 @@ static inline bool BITMASK_IS_FULL(uint8_t* map, size_t size)
        printk("\n"); \
 }
 
-static inline bool BITMASK_IS_SET_IN_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               if(!GET_BITMASK_BIT(m, i))
-                       return FALSE;
-       }
-       return TRUE;
-}
-
-static inline bool BITMASK_IS_CLR_IN_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               if(GET_BITMASK_BIT(m, i))
-                       return FALSE;
-       }
-       return TRUE;
-}
-
-static inline void SET_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               SET_BITMASK_BIT(m, i);
-       }
-}
-
-static inline void CLR_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               CLR_BITMASK_BIT(m, i);
-       }
-}
 #endif /* ROS_ARCH_BITMASK_H */
-
diff --git a/kern/include/bitmask.h b/kern/include/bitmask.h
new file mode 100644 (file)
index 0000000..26b5107
--- /dev/null
@@ -0,0 +1,52 @@
+#ifndef ROS_KERN_BITMASK_H
+#define ROS_KERN_BITMASK_H
+
+#include <arch/bitmask.h>
+
+static inline bool BITMASK_IS_SET_IN_RANGE(uint8_t* m, size_t beg, size_t end)
+{
+       for(size_t i=beg; i<end; i++) {
+               if(!GET_BITMASK_BIT(m, i))
+                       return FALSE;
+       }
+       return TRUE;
+}
+
+static inline bool BITMASK_IS_CLR_IN_RANGE(uint8_t* m, size_t beg, size_t end)
+{
+       for(size_t i=beg; i<end; i++) {
+               if(GET_BITMASK_BIT(m, i))
+                       return FALSE;
+       }
+       return TRUE;
+}
+
+static inline void SET_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
+{
+       for(size_t i=beg; i<end; i++) {
+               SET_BITMASK_BIT(m, i);
+       }
+}
+
+static inline void CLR_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
+{
+       for(size_t i=beg; i<end; i++) {
+               CLR_BITMASK_BIT(m, i);
+       }
+}
+
+/* Runs *work on every bit in the bitmask, passing *work the value of the bit
+ * that is set.  Optionally clears the bit from the bitmask */
+static void BITMASK_FOREACH_SET(uint8_t *name, unsigned int size,
+                                void (*work)(unsigned int bit), bool clear)
+{
+       for (int i = 0; i < size; i++) {
+               bool present = GET_BITMASK_BIT(name, i);
+               if (present && clear)
+                       CLR_BITMASK_BIT_ATOMIC(name, i);
+               if (present)
+                       work(i);
+       }
+}
+
+#endif /* ROS_KERN_BITMASK_H */
index 235ec9c..3ad068e 100644 (file)
@@ -15,7 +15,7 @@
 
 #include <ros/common.h>
 #include <sys/queue.h>
-#include <arch/bitmask.h>
+#include <bitmask.h>
 #include <kref.h>
 #include <timing.h>
 #include <radix.h>
index 006ece6..dff950f 100644 (file)
@@ -3,8 +3,8 @@
 #endif
 
 #include <arch/arch.h>
-#include <arch/bitmask.h>
 
+#include <bitmask.h>
 #include <atomic.h>
 #include <error.h>
 #include <string.h>
index 02662a2..571c9e9 100644 (file)
@@ -12,7 +12,7 @@
 
 #include <ros/common.h>
 #include <arch/mmu.h>
-#include <arch/bitmask.h>
+#include <bitmask.h>
 #include <colored_caches.h>
 #include <stdio.h>
 #include <atomic.h>
index 39f1b53..b343eb7 100644 (file)
@@ -6,10 +6,9 @@
 
 #include <arch/arch.h>
 #include <arch/mmu.h>
-#include <arch/bitmask.h>
+#include <bitmask.h>
 #include <elf.h>
 #include <smp.h>
-
 #include <atomic.h>
 #include <string.h>
 #include <assert.h>
index bddb10c..da08eae 100644 (file)
@@ -6,7 +6,7 @@
  * processes. */
 
 #include <ros/bcq.h>
-#include <arch/bitmask.h>
+#include <bitmask.h>
 #include <event.h>
 #include <atomic.h>
 #include <process.h>
index ccb47bd..fd49553 100644 (file)
@@ -14,7 +14,7 @@
 #include <endian.h>
 #include <error.h>
 #include <pmap.h>
-#include <arch/bitmask.h>
+#include <bitmask.h>
 
 /* These structs are declared again and initialized farther down */
 struct page_map_operations ext2_pm_op;
index d560c57..3e3f133 100644 (file)
@@ -34,7 +34,7 @@
 #include <frontend.h>
 
 #include <arch/init.h>
-#include <arch/bitmask.h>
+#include <bitmask.h>
 #include <slab.h>
 #include <kfs.h>
 #include <vfs.h>
index c4183b9..2487d4a 100644 (file)
@@ -10,7 +10,7 @@
 #endif
 
 #include <sys/queue.h>
-#include <arch/bitmask.h>
+#include <bitmask.h>
 #include <page_alloc.h>
 #include <pmap.h>
 #include <string.h>
index fb10c2c..1ee1836 100644 (file)
@@ -9,7 +9,7 @@
 #include <ros/bcq.h>
 #include <event.h>
 #include <arch/arch.h>
-#include <arch/bitmask.h>
+#include <bitmask.h>
 #include <process.h>
 #include <atomic.h>
 #include <smp.h>
index f01b461..0bfd7da 100644 (file)
@@ -28,7 +28,7 @@
 #include <frontend.h>
 #include <colored_caches.h>
 #include <hashtable.h>
-#include <arch/bitmask.h>
+#include <bitmask.h>
 #include <vfs.h>
 #include <devfs.h>
 #include <smp.h>
index 92ff26b..fac0709 100644 (file)
@@ -5,7 +5,7 @@
 
 #include <arch/mmu.h>
 #include <arch/arch.h>
-#include <arch/bitmask.h>
+#include <bitmask.h>
 #include <smp.h>
 
 #include <ros/memlayout.h>
index 115db35..95e5864 100644 (file)
@@ -8,7 +8,7 @@
 #include <ros/event.h>
 #include <ros/procdata.h>
 #include <ros/bcq.h>
-#include <arch/bitmask.h>
+#include <bitmask.h>
 #include <vcore.h>
 #include <stdlib.h>
 #include <string.h>
diff --git a/user/parlib/include/bitmask.h b/user/parlib/include/bitmask.h
new file mode 100644 (file)
index 0000000..668ef19
--- /dev/null
@@ -0,0 +1,52 @@
+#ifndef PARLIB_BITMASK_H
+#define PARLIB_BITMASK_H
+
+#include <arch/bitmask.h>
+
+static inline bool BITMASK_IS_SET_IN_RANGE(uint8_t* m, size_t beg, size_t end)
+{
+       for(size_t i=beg; i<end; i++) {
+               if(!GET_BITMASK_BIT(m, i))
+                       return FALSE;
+       }
+       return TRUE;
+}
+
+static inline bool BITMASK_IS_CLR_IN_RANGE(uint8_t* m, size_t beg, size_t end)
+{
+       for(size_t i=beg; i<end; i++) {
+               if(GET_BITMASK_BIT(m, i))
+                       return FALSE;
+       }
+       return TRUE;
+}
+
+static inline void SET_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
+{
+       for(size_t i=beg; i<end; i++) {
+               SET_BITMASK_BIT(m, i);
+       }
+}
+
+static inline void CLR_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
+{
+       for(size_t i=beg; i<end; i++) {
+               CLR_BITMASK_BIT(m, i);
+       }
+}
+
+/* Runs *work on every bit in the bitmask, passing *work the value of the bit
+ * that is set.  Optionally clears the bit from the bitmask */
+static void BITMASK_FOREACH_SET(uint8_t *name, unsigned int size,
+                                void (*work)(unsigned int bit), bool clear)
+{
+       for (int i = 0; i < size; i++) {
+               bool present = GET_BITMASK_BIT(name, i);
+               if (present && clear)
+                       CLR_BITMASK_BIT_ATOMIC(name, i);
+               if (present)
+                       work(i);
+       }
+}
+
+#endif /* PARLIB_BITMASK_H */
index 785b27f..6ce3e38 100644 (file)
@@ -107,35 +107,4 @@ static inline bool BITMASK_IS_FULL(uint8_t* map, size_t size)
        printk("\n"); \
 }
 
-static inline bool BITMASK_IS_SET_IN_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               if(!GET_BITMASK_BIT(m, i))
-                       return FALSE;
-       }
-       return TRUE;
-}
-
-static inline bool BITMASK_IS_CLR_IN_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               if(GET_BITMASK_BIT(m, i))
-                       return FALSE;
-       }
-       return TRUE;
-}
-
-static inline void SET_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               SET_BITMASK_BIT(m, i);
-       }
-}
-
-static inline void CLR_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               CLR_BITMASK_BIT(m, i);
-       }
-}
 #endif /* PARLIB_ARCH_BITMASK_H */
index 7899975..05e82e5 100644 (file)
@@ -72,36 +72,4 @@ static inline bool BITMASK_IS_FULL(uint8_t* map, size_t size)
        printk("\n"); \
 }
 
-static inline bool BITMASK_IS_SET_IN_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               if(!GET_BITMASK_BIT(m, i))
-                       return FALSE;
-       }
-       return TRUE;
-}
-
-static inline bool BITMASK_IS_CLR_IN_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               if(GET_BITMASK_BIT(m, i))
-                       return FALSE;
-       }
-       return TRUE;
-}
-
-static inline void SET_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               SET_BITMASK_BIT(m, i);
-       }
-}
-
-static inline void CLR_BITMASK_RANGE(uint8_t* m, size_t beg, size_t end)
-{
-       for(size_t i=beg; i<end; i++) {
-               CLR_BITMASK_BIT(m, i);
-       }
-}
-
 #endif /* PARLIB_ARCH_BITMASK_H */