return NULL;
lock_acquire (&pool->lock);
-
page_idx = bitmap_scan_and_flip (pool->used_map, 0, page_cnt, false);
+ lock_release (&pool->lock);
+
if (page_idx != BITMAP_ERROR)
pages = pool->base + PGSIZE * page_idx;
else
PANIC ("palloc_get: out of pages");
}
- lock_release (&pool->lock);
-
return pages;
}
memset (pages, 0xcc, PGSIZE * page_cnt);
#endif
- lock_acquire (&pool->lock);
- ASSERT (bitmap_all (pool->used_map, page_idx, page_idx + page_cnt));
- bitmap_set_multiple (pool->used_map, page_idx, page_idx + page_cnt, false);
- lock_release (&pool->lock);
+ ASSERT (bitmap_all (pool->used_map, page_idx, page_cnt));
+ bitmap_set_multiple (pool->used_map, page_idx, page_cnt, false);
}
/* Frees the page at PAGE. */
/* We'll put the pool's used_map at its base.
Calculate the space needed for the bitmap
and subtract it from the pool's size. */
- size_t bm_pages = DIV_ROUND_UP (bitmap_needed_bytes (page_cnt), PGSIZE);
+ size_t bm_pages = DIV_ROUND_UP (bitmap_buf_size (page_cnt), PGSIZE);
if (bm_pages > page_cnt)
PANIC ("Not enough memory in %s for bitmap.", name);
page_cnt -= bm_pages;
printf ("%zu pages available in %s.\n", page_cnt, name);
/* Initialize the pool. */
- lock_init (&p->lock, name);
- p->used_map = bitmap_create_preallocated (page_cnt, base,
- bm_pages * PGSIZE);
+ lock_init (&p->lock);
+ p->used_map = bitmap_create_in_buf (page_cnt, base, bm_pages * PGSIZE);
p->base = base + bm_pages * PGSIZE;
}