151 lines
3.7 KiB
C
151 lines
3.7 KiB
C
|
/****************************************************************
|
||
|
* *
|
||
|
* Copyright 2001, 2011 Fidelity Information Services, Inc *
|
||
|
* *
|
||
|
* This source code contains the intellectual property *
|
||
|
* of its copyright holder(s), and is made available *
|
||
|
* under a license. If you do not know the terms of *
|
||
|
* the license, please stop and do not read further. *
|
||
|
* *
|
||
|
****************************************************************/
|
||
|
|
||
|
#include "mdef.h"
|
||
|
|
||
|
#include "gtm_stdio.h"
|
||
|
|
||
|
#include "lv_val.h"
|
||
|
#include "gdsroot.h"
|
||
|
#include "gtm_facility.h"
|
||
|
#include "fileinfo.h"
|
||
|
#include "gdsbt.h"
|
||
|
#include "gdsfhead.h"
|
||
|
#include "caller_id.h"
|
||
|
#include "alias.h"
|
||
|
|
||
|
lv_val *lv_getslot(symval *sym)
|
||
|
{
|
||
|
lv_blk *p,*q;
|
||
|
lv_val *lv;
|
||
|
unsigned int numElems, numUsed;
|
||
|
|
||
|
numElems = MAXUINT4; /* maximum value */
|
||
|
if (lv = sym->lv_flist)
|
||
|
{
|
||
|
assert(NULL == LV_PARENT(lv)); /* stp_gcol relies on this for correct garbage collection */
|
||
|
sym->lv_flist = (lv_val *)lv->ptrs.free_ent.next_free;
|
||
|
} else
|
||
|
{
|
||
|
for (p = sym->lv_first_block; ; p = p->next)
|
||
|
{
|
||
|
if (NULL == p)
|
||
|
{
|
||
|
if (NULL != (p = sym->lv_first_block))
|
||
|
numElems = p->numAlloc;
|
||
|
else
|
||
|
{
|
||
|
assert(FALSE);
|
||
|
numElems = LV_NEWBLOCK_INIT_ALLOC; /* be safe in pro */
|
||
|
}
|
||
|
lv_newblock(sym, numElems > 64 ? 128 : numElems * 2);
|
||
|
p = sym->lv_first_block;
|
||
|
assert(NULL != p);
|
||
|
}
|
||
|
if ((numUsed = p->numUsed) < p->numAlloc)
|
||
|
{
|
||
|
lv = (lv_val *)LV_BLK_GET_BASE(p);
|
||
|
lv = &lv[numUsed];
|
||
|
p->numUsed++;
|
||
|
break;
|
||
|
}
|
||
|
assert(numElems >= p->numAlloc);
|
||
|
DEBUG_ONLY(numElems = p->numAlloc);
|
||
|
}
|
||
|
}
|
||
|
assert(lv);
|
||
|
DBGRFCT((stderr, ">> lv_getslot(): Allocating new lv_val at 0x"lvaddr" by routine 0x"lvaddr"\n", lv, caller_id()));
|
||
|
return lv;
|
||
|
}
|
||
|
|
||
|
lvTree *lvtree_getslot(symval *sym)
|
||
|
{
|
||
|
lv_blk *p,*q;
|
||
|
lvTree *lvt;
|
||
|
unsigned int numElems, numUsed;
|
||
|
|
||
|
numElems = MAXUINT4; /* maximum value */
|
||
|
if (lvt = sym->lvtree_flist)
|
||
|
{
|
||
|
assert(NULL == LVT_GET_PARENT(lvt));
|
||
|
sym->lvtree_flist = (lvTree *)lvt->avl_root;
|
||
|
} else
|
||
|
{
|
||
|
for (p = sym->lvtree_first_block; ; p = p->next)
|
||
|
{
|
||
|
if (NULL == p)
|
||
|
{
|
||
|
if (NULL != (p = sym->lvtree_first_block))
|
||
|
numElems = p->numAlloc;
|
||
|
else
|
||
|
numElems = LV_NEWBLOCK_INIT_ALLOC;
|
||
|
lvtree_newblock(sym, numElems > 64 ? 128 : numElems * 2);
|
||
|
p = sym->lvtree_first_block;
|
||
|
assert(NULL != p);
|
||
|
}
|
||
|
if ((numUsed = p->numUsed) < p->numAlloc)
|
||
|
{
|
||
|
lvt = (lvTree *)LV_BLK_GET_BASE(p);
|
||
|
lvt = &lvt[numUsed];
|
||
|
p->numUsed++;
|
||
|
break;
|
||
|
}
|
||
|
assert(numElems >= p->numAlloc);
|
||
|
DEBUG_ONLY(numElems = p->numAlloc);
|
||
|
}
|
||
|
}
|
||
|
assert(lvt);
|
||
|
DBGRFCT((stderr, ">> lvtree_getslot(): Allocating new lvTree at 0x"lvaddr" by routine 0x"lvaddr"\n", lvt, caller_id()));
|
||
|
return lvt;
|
||
|
}
|
||
|
|
||
|
lvTreeNode *lvtreenode_getslot(symval *sym)
|
||
|
{
|
||
|
lv_blk *p,*q;
|
||
|
lvTreeNode *lv;
|
||
|
unsigned int numElems, numUsed;
|
||
|
|
||
|
numElems = MAXUINT4; /* maximum value */
|
||
|
if (lv = sym->lvtreenode_flist)
|
||
|
{
|
||
|
assert(NULL == LV_PARENT(lv)); /* stp_gcol relies on this for correct garbage collection */
|
||
|
sym->lvtreenode_flist = (lvTreeNode *)lv->sbs_child;
|
||
|
} else
|
||
|
{
|
||
|
for (p = sym->lvtreenode_first_block; ; p = p->next)
|
||
|
{
|
||
|
if (NULL == p)
|
||
|
{
|
||
|
if (NULL != (p = sym->lvtreenode_first_block))
|
||
|
numElems = p->numAlloc;
|
||
|
else
|
||
|
numElems = LV_NEWBLOCK_INIT_ALLOC;
|
||
|
lvtreenode_newblock(sym, numElems > 64 ? 128 : numElems * 2);
|
||
|
p = sym->lvtreenode_first_block;
|
||
|
assert(NULL != p);
|
||
|
}
|
||
|
if ((numUsed = p->numUsed) < p->numAlloc)
|
||
|
{
|
||
|
lv = (lvTreeNode *)LV_BLK_GET_BASE(p);
|
||
|
lv = &lv[numUsed];
|
||
|
p->numUsed++;
|
||
|
break;
|
||
|
}
|
||
|
assert(numElems >= p->numAlloc);
|
||
|
DEBUG_ONLY(numElems = p->numAlloc);
|
||
|
}
|
||
|
}
|
||
|
assert(lv);
|
||
|
DBGRFCT((stderr, ">> lvtreenode_getslot(): Allocating new lvTreeNode at 0x"lvaddr" by routine 0x"lvaddr"\n",
|
||
|
lv, caller_id()));
|
||
|
return lv;
|
||
|
}
|