/**************************************************************************** Desc: Setup two child blocks for a root block. ****************************************************************************/ RCODE F_BtreeRoot::setupTree( FLMBYTE * pucMidEntry, // If !NULL entry to insert into root. eDynRSetBlkTypes eBlkType, // Leaf or non-leaf F_BtreeBlk ** ppLeftBlk, // (out) F_BtreeBlk ** ppRightBlk) // (out) { RCODE rc = NE_FLM_OK; F_BtreeBlk * pLeftBlk = NULL; F_BtreeBlk * pRightBlk = NULL; if (RC_BAD( rc = newBlk( &pLeftBlk, eBlkType))) { goto Exit; } if (RC_BAD( rc = newBlk( &pRightBlk, eBlkType))) { goto Exit; } if (eBlkType == ACCESS_BTREE_NON_LEAF) { ((F_BtreeNonLeaf *)pRightBlk)->lemBlk( lemBlk()); } // Fix up the linkages pLeftBlk->nextBlk( pRightBlk->blkAddr()); pRightBlk->prevBlk( pLeftBlk->blkAddr()); lemBlk( pRightBlk->blkAddr()); if (pucMidEntry) { // Add the midentry to the root block. Search to position and insert. searchEntry( pucMidEntry); insertEntry( pucMidEntry, pLeftBlk->blkAddr()); } m_uiLevels++; if (ppLeftBlk) { *ppLeftBlk = pLeftBlk; } if (ppRightBlk) { *ppRightBlk = pRightBlk; } Exit: return( rc); }
void CarveRestart( carve_t cv, unsigned num ) /**************************************************/ { unsigned numblks; unsigned remainder; unsigned index; blk_t * block; if( num == 0 ) return; numblks = (num + cv->elm_count - 1) / cv->elm_count; for( index = 0; index < numblks; index++ ) { newBlk( cv ); } _ChkAlloc( cv->blk_map, numblks * sizeof( blk_t * ) ); index = numblks - 1; for( block = cv->blk_list; block != NULL; block = block->next ) { cv->blk_map[ index ] = block; index -= 1; } remainder = num % cv->elm_count; if( remainder != 0 ) { MakeFreeList( cv, cv->blk_map[0], remainder * cv->elm_size ); } cv->insert = NULL; }
void *CarveAlloc( carve_t cv ) /****************************/ { void * p; if( cv->free_list == NULL ) { MakeFreeList( cv, newBlk( cv ), 0 ); } _REMOVE_FROM_FREE( cv, p ); DbgZapAlloc( p, cv->elm_size ); return p; }
void *CarveZeroAlloc( carve_t cv ) /********************************/ { void *v; void **p; if( cv->free_list == NULL ) { MakeFreeList( cv, newBlk( cv ), 0 ); } _REMOVE_FROM_FREE( cv, v ); p = v; DbgAssert( ( cv->elm_size / sizeof(*p) ) <= 16 ); switch( cv->elm_size / sizeof(*p) ) { case 16: p[15] = 0; case 15: p[14] = 0; case 14: p[13] = 0; case 13: p[12] = 0; case 12: p[11] = 0; case 11: p[10] = 0; case 10: p[9] = 0; case 9: p[8] = 0; case 8: p[7] = 0; case 7: p[6] = 0; case 6: p[5] = 0; case 5: p[4] = 0; case 4: p[3] = 0; case 3: p[2] = 0; case 2: p[1] = 0; case 1: p[0] = 0; } return p; }