/****************************************************************************
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);
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}