fis-gtm/sr_port/lv_getslot.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;
}