size_t block_store_allocate(block_store_t *const bs) { if (bs && bs->fbm) { size_t free_block = bitmap_ffz(bs->fbm); if (free_block != SIZE_MAX) { bitmap_set(bs->fbm, free_block); // not going to mark dbm because there's no change (yet) return free_block; } block_store_errno = BS_FULL; return 0; } block_store_errno = BS_PARAM; return 0; }
/** Allocate a new ID. * @param alloc Allocator to allocate from. * @return New ID, or -1 if no IDs available. */ int32_t id_allocator_alloc(id_allocator_t *alloc) { int32_t id; mutex_lock(&alloc->lock); id = bitmap_ffz(alloc->bitmap, alloc->nbits); if(id < 0) { mutex_unlock(&alloc->lock); return -1; } bitmap_set(alloc->bitmap, id); mutex_unlock(&alloc->lock); return id; }
size_t block_store_allocate(block_store_t *const bs) { if (bs) { size_t free_block = bitmap_ffz(bs->fbm); if (free_block != SIZE_MAX) { bitmap_set(bs->fbm, free_block); bitmap_set(bs->dbm, FBM_BLOCK_CHANGE_LOCATION(free_block)); // Set that FBM block as changed FLAG_SET(bs, DIRTY); bs_errno = BS_OK; return free_block; } bs_errno = BS_FULL; return 0; } bs_errno = BS_PARAM; return 0; }