static Block_t * aoff_get_free_block(Allctr_t *allctr, Uint size, Block_t *cand_blk, Uint cand_size) { AOFFAllctr_t *alc = (AOFFAllctr_t *) allctr; AOFF_RBTree_t *crr_node = alc->mbc_root; AOFF_Carrier_t* crr; AOFF_RBTree_t *blk = NULL; #ifdef HARD_DEBUG AOFF_RBTree_t* dbg_blk; #endif ASSERT(!cand_blk || cand_size >= size); /* Get first-fit carrier */ if (!crr_node || !(blk=rbt_search(crr_node, size))) { return NULL; } crr = RBT_NODE_TO_MBC(blk); /* Get block within carrier tree */ #ifdef HARD_DEBUG dbg_blk = HARD_CHECK_TREE(&crr->crr, alc->blk_order, crr->root, size); #endif blk = rbt_search(crr->root, size); ASSERT(blk); #ifdef HARD_DEBUG ASSERT(blk == dbg_blk); #endif if (!blk) return NULL; if (cand_blk && cmp_cand_blk(alc->blk_order, cand_blk, blk) < 0) { return NULL; /* cand_blk was better */ } aoff_unlink_free_block(allctr, (Block_t *) blk); return (Block_t *) blk; }
static Block_t * aoff_get_free_block(Allctr_t *allctr, Uint size, Block_t *cand_blk, Uint cand_size, Uint32 flags) { AOFFAllctr_t *alc = (AOFFAllctr_t *) allctr; AOFF_RBTree_t *x = ((flags & ERTS_ALCU_FLG_SBMBC) ? alc->sbmbc_root : alc->mbc_root); AOFF_RBTree_t *blk = NULL; #ifdef HARD_DEBUG AOFF_RBTree_t* dbg_blk = check_tree(x, size); #endif ASSERT(!cand_blk || cand_size >= size); while (x) { if (x->left && x->left->max_sz >= size) { x = x->left; } else if (BLK_SZ(x) >= size) { blk = x; break; } else { x = x->right; } } #ifdef HARD_DEBUG ASSERT(blk == dbg_blk); #endif if (!blk) return NULL; if (cand_blk && cand_blk < &blk->hdr) { return NULL; /* cand_blk was better */ } aoff_unlink_free_block(allctr, (Block_t *) blk, flags); return (Block_t *) blk; }