fis-gtm/sr_port/glvn_pool.c

100 lines
3.1 KiB
C

/****************************************************************
* *
* Copyright 2012 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 <stdarg.h>
#include "gtm_stdio.h"
#include "min_max.h"
#include "lv_val.h"
#include <rtnhdr.h>
#include "mv_stent.h"
#include "compiler.h"
#include "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "opcode.h"
#include "glvn_pool.h"
#include "parm_pool.h" /* for CAPACITY_ROUND_UP2 macro */
void glvn_pool_init(void)
{
glvn_pool *pool;
uint4 capacity, mval_capacity, slotoff;
DCL_THREADGBL_ACCESS;
SETUP_THREADGBL_ACCESS;
capacity = INIT_GLVN_POOL_CAPACITY;
mval_capacity = INIT_GLVN_POOL_MVAL_CAPACITY;
slotoff = (uint4)OFFSETOF(glvn_pool, slot[0]);
pool = (glvn_pool *)malloc(ROUND_UP(slotoff, (capacity + 1) * SIZEOF(glvn_pool_entry)));
pool->mval_stack = (mval *)malloc(mval_capacity * SIZEOF(mval));
pool->capacity = capacity;
pool->top = 0;
pool->mval_capacity = mval_capacity;
pool->mval_top = 0;
memset(pool->for_slot, (int)GLVN_POOL_EMPTY, (MAX_FOR_STACK + 1) * SIZEOF(uint4));
TREF(glvn_pool_ptr) = pool;
}
void glvn_pool_expand_slots(void)
{
glvn_pool *pool, *old_pool;
uint4 capacity, slotoff;
DCL_THREADGBL_ACCESS;
SETUP_THREADGBL_ACCESS;
old_pool = TREF(glvn_pool_ptr);
capacity = 2 * old_pool->capacity;
assert(capacity <= MAX_EXPECTED_CAPACITY); /* Don't expect more than this in the test system */
slotoff = (uint4)OFFSETOF(glvn_pool, slot[0]);
pool = (glvn_pool *)malloc(ROUND_UP(slotoff, (capacity + 1) * SIZEOF(glvn_pool_entry)));
memcpy(pool, old_pool, slotoff + old_pool->top * SIZEOF(glvn_pool_entry));
pool->capacity = capacity;
TREF(glvn_pool_ptr) = pool;
free(old_pool);
}
void glvn_pool_expand_mvals(void)
{
glvn_pool *pool;
glvn_pool_entry *slot, *top;
int i, n;
mval *mval_stack, *old_mval_stack;
uint4 mval_capacity;
INTPTR_T shift;
DCL_THREADGBL_ACCESS;
SETUP_THREADGBL_ACCESS;
pool = TREF(glvn_pool_ptr);
mval_capacity = 2 * pool->mval_capacity;
assert(mval_capacity <= MAX_EXPECTED_MVAL_CAPACITY); /* Don't expect more than this in the test system */
old_mval_stack = pool->mval_stack;
mval_stack = (mval *)malloc(mval_capacity * SIZEOF(mval));
memcpy(mval_stack, old_mval_stack, pool->mval_top * SIZEOF(mval));
shift = (INTPTR_T)mval_stack - (INTPTR_T)old_mval_stack;
for (slot = pool->slot, top = slot + pool->top - 1; slot < top; slot++)
{ /* Touch up glvn_info pointers, but leave lvn start alone */
n = slot->glvn_info.n;
assert(n <= MAX_ACTUALS);
if (FIRST_SAVED_ARG(slot))
slot->lvname = (mval *)(shift + (char *)slot->lvname);
for (i = FIRST_SAVED_ARG(slot); i < n; i++)
slot->glvn_info.arg[i] = (void *)(shift + (char *)slot->glvn_info.arg[i]);
}
pool->mval_stack = mval_stack;
pool->mval_capacity = mval_capacity;
free(old_mval_stack);
}