static int findbit(int low, int startscan, int pages, int memflags, int *len) { int run_length = 0, i; int freerange_start = startscan; for(i = startscan; i >= low; i--) { if(!page_isfree(i)) { int pi; int chunk = i/BITCHUNK_BITS, moved = 0; run_length = 0; pi = i; while(chunk > 0 && !MAP_CHUNK(free_pages_bitmap, chunk*BITCHUNK_BITS)) { chunk--; moved = 1; } if(moved) { i = chunk * BITCHUNK_BITS + BITCHUNK_BITS; } continue; } if(!run_length) { freerange_start = i; run_length = 1; } else { freerange_start--; run_length++; } assert(run_length <= pages); if(run_length == pages) { /* good block found! */ *len = run_length; return freerange_start; } } return NO_MEM; }
void set_bit_sized(unsigned char *bitmap, uint16_t size, uint16_t bit) { (MAP_CHUNK(bitmap, size, bit)) |= (1 << CHUNK_OFFSET(bit)); }
void set_bit(bitmap_t *bm, uint16_t bit) { (MAP_CHUNK(*bm, bit)) |= (1 << CHUNK_OFFSET(bit)); }
void unset_bit(bitmap_t *bm, uint16_t bit) { ((MAP_CHUNK(*bm, bit)) &= ~(1 << CHUNK_OFFSET(bit))); }
int is_bit_set(const bitmap_t *bm, uint16_t bit) { return (MAP_CHUNK(*bm, bit) & (1 << CHUNK_OFFSET(bit))) != 0; }