generic: add ops/defines to work with multi-word bitmaps.
This commit is contained in:
committed by
Brian Swetland
parent
d153278b80
commit
afa6839a16
@@ -23,6 +23,8 @@
|
||||
#ifndef __BITS_H
|
||||
#define __BITS_H
|
||||
|
||||
#include <arch/ops.h>
|
||||
|
||||
#define clz(x) __builtin_clz(x)
|
||||
|
||||
#define BIT(x, bit) ((x) & (1 << (bit)))
|
||||
@@ -31,4 +33,27 @@
|
||||
#define BITS_SHIFT(x, high, low) (((x) >> (low)) & ((1<<((high)-(low)+1))-1))
|
||||
#define BIT_SET(x, bit) (((x) & (1 << (bit))) ? 1 : 0)
|
||||
|
||||
#define BITMAP_BITS_PER_WORD (sizeof(unsigned long) * 8)
|
||||
#define BITMAP_NUM_WORDS(x) (((x) / BITMAP_BITS_PER_WORD) + 1)
|
||||
#define BITMAP_WORD(x) ((x) / BITMAP_BITS_PER_WORD)
|
||||
#define BITMAP_BIT_IN_WORD(x) ((x) & (BITMAP_BITS_PER_WORD - 1))
|
||||
|
||||
static inline int bitmap_set(unsigned long *bitmap, int bit)
|
||||
{
|
||||
unsigned long mask = 1 << BITMAP_BIT_IN_WORD(bit);
|
||||
return atomic_or((int*)&bitmap[BITMAP_WORD(bit)], mask) & mask ? 1 : 0;
|
||||
}
|
||||
|
||||
static inline int bitmap_clear(unsigned long *bitmap, int bit)
|
||||
{
|
||||
unsigned long mask = 1 << BITMAP_BIT_IN_WORD(bit);
|
||||
|
||||
return atomic_and((int*)&bitmap[BITMAP_WORD(bit)], ~mask) & mask ? 1:0;
|
||||
}
|
||||
|
||||
static inline int bitmap_test(unsigned long *bitmap, int bit)
|
||||
{
|
||||
return BIT_SET(bitmap[BITMAP_WORD(bit)], BITMAP_BIT_IN_WORD(bit));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user