Linux 内核数据结构bitmap
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define MAX_PRIO 10000 5 #define BITS_PER_LONG 32 6 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) 7 8 #define BIT(nr) (1UL << (nr)) 9 #define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) 10 #define BIT_WORD(nr) ((nr) / BITS_PER_LONG) 11 #define BITS_PER_BYTE 8 12 13 #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) 14 15 #define DECLARE_BITMAP(name,bits) \ 16 unsigned long name[BITS_TO_LONGS(bits)] 17 18 static inline void __set_bit(int nr, volatile unsigned long *addr) 19 { 20 unsigned long mask = BIT_MASK(nr); 21 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 22 23 *p |= mask; 24 } 25 26 static inline void __clear_bit(int nr, volatile unsigned long *addr) 27 { 28 unsigned long mask = BIT_MASK(nr); 29 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 30 31 *p &= ~mask; 32 } 33 34 static inline void __change_bit(int nr, volatile unsigned long *addr) 35 { 36 unsigned long mask = BIT_MASK(nr); 37 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 38 39 *p ^= mask; 40 } 41 42 static inline int __test_and_set_bit(int nr, volatile unsigned long *addr) 43 { 44 unsigned long mask = BIT_MASK(nr); 45 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 46 unsigned long old = *p; 47 48 *p = old | mask; 49 return (old & mask) != 0; 50 } 51 52 static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr) 53 { 54 unsigned long mask = BIT_MASK(nr); 55 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 56 unsigned long old = *p; 57 58 *p = old & ~mask; 59 return (old & mask) != 0; 60 } 61 62 static inline int __test_and_change_bit(int nr, volatile unsigned long *addr) 63 { 64 unsigned long mask = BIT_MASK(nr); 65 unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); 66 unsigned long old = *p; 67 68 *p = old ^ mask; 69 return (old & mask) != 0; 70 } 71 72 static inline int test_bit(int nr, const volatile unsigned long *addr) 73 { 74 return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1))); 75 } 76 77 #ifndef container_of 78 /** 79 * container_of - cast a member of a structure out to the containing structure 80 * @ptr: the pointer to the member. 81 * @type: the type of the container struct this is embedded in. 82 * @member: the name of the member within the struct. 83 * 84 */ 85 #define container_of(ptr, type, member) ({ \ 86 const typeof(((type *)0)->member) * __mptr = (ptr); \ 87 (type *)((char *)__mptr - offsetof(type, member)); }) 88 #endif 89 90 #define list_entry(ptr, type, member) container_of(ptr, type, member) 91 92 int _tmain(int argc, _TCHAR* argv[]) 93 { 94 DECLARE_BITMAP(bitmap1, MAX_PRIO); 95 DECLARE_BITMAP(bitmap2, MAX_PRIO); 96 int i; 97 98 /* 00000000 - 99999999 使用一个bitmap */ 99 int num1 = 9999; 100 int num2 = 9999; 101 102 char buff[32] = {0}; 103 104 for (i = 0; i < MAX_PRIO; i++) { 105 106 __clear_bit(i, bitmap1); 107 __clear_bit(i, bitmap2); 108 } 109 110 __set_bit(num1, bitmap1); 111 __set_bit(num2, bitmap2); 112 113 printf("bitmap size = %d\n", sizeof(bitmap1)/sizeof(long)); 114 printf("bitmap = %d\n", test_bit(num1, bitmap1)); 115 printf("bitmap = %d\n", test_bit(num2, bitmap2)); 116 printf("atoi : %d\n", atoi("0010")); 117 printf("%.4d%.4d\n", num1, num2); 118 121 return 0; 122 }