Example #1
0
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;
}
Example #2
0
void set_bit_sized(unsigned char *bitmap, uint16_t size, uint16_t bit)
{
    (MAP_CHUNK(bitmap, size, bit)) |= (1 << CHUNK_OFFSET(bit));
}
Example #3
0
void set_bit(bitmap_t *bm, uint16_t bit)
{
    (MAP_CHUNK(*bm, bit)) |= (1 << CHUNK_OFFSET(bit));
}
Example #4
0
void unset_bit(bitmap_t *bm, uint16_t bit)
{
    ((MAP_CHUNK(*bm, bit)) &= ~(1 << CHUNK_OFFSET(bit)));
}
Example #5
0
int is_bit_set(const bitmap_t *bm, uint16_t bit)
{
    return (MAP_CHUNK(*bm, bit) & (1 << CHUNK_OFFSET(bit))) != 0;
}