fis-gtm/sr_port/process_gvt_pending_list.c

85 lines
2.8 KiB
C

/****************************************************************
* *
* Copyright 2008, 2010 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 "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "dpgbldir.h"
#include "process_gvt_pending_list.h"
#include "targ_alloc.h"
#include "buddy_list.h"
GBLREF gvt_container *gvt_pending_list;
GBLREF buddy_list *gvt_pending_buddy_list;
boolean_t is_gvt_in_pending_list(gv_namehead *gvt)
{
gvt_container *gvtc;
for (gvtc = gvt_pending_list; NULL != gvtc; gvtc = (gvt_container *)gvtc->next_gvtc)
{
if (gvtc->gvnh_reg->gvt == gvt)
return TRUE;
}
return FALSE;
}
/* Now that "reg" is being opened, process list of gv_targets that were allocated BEFORE reg got opened to see if they
* need to be re-allocated (due to differences in reg->max_key_size versus csa->hdr->max_key_size.
*/
void process_gvt_pending_list(gd_region *reg, sgmnt_addrs *csa)
{
gvt_container *gvtc, *next_gvtc, *prev_gvtc;
gv_namehead *old_gvt, *new_gvt;
int4 db_max_key_size;
gvnh_reg_t *gvnh_reg;
for (prev_gvtc = NULL, gvtc = gvt_pending_list; NULL != gvtc; gvtc = next_gvtc)
{
/* note down next_gvtc first thing before any continues or frees as next iteration relies on this */
next_gvtc = (gvt_container *)gvtc->next_gvtc;
gvnh_reg = gvtc->gvnh_reg;
old_gvt = gvnh_reg->gvt;
assert(NULL == old_gvt->gd_csa);
if (reg != gvnh_reg->gd_reg)
{
prev_gvtc = gvtc;
continue;
}
old_gvt->gd_csa = csa; /* set csa now that we are about to open the region */
db_max_key_size = csa->hdr->max_key_size;
if (reg->max_key_size != db_max_key_size)
{ /* key sizes are different, so need to reallocate */
new_gvt = (gv_namehead *)targ_alloc(db_max_key_size, &old_gvt->gvname, reg);
new_gvt->noisolation = old_gvt->noisolation; /* Copy over noisolation status from old_gvt */
assert(!reg->open);
/* reg is not yet open but we know csa is already available so set it appropriately */
new_gvt->gd_csa = csa;
gvnh_reg->gvt = new_gvt; /* Change hash-table to point to new gvt */
old_gvt->regcnt--;
targ_free(old_gvt); /* Reposition pointers & freeup memory associated with old_gvt */
}
/* Free up the processed gvtc */
if (NULL == prev_gvtc)
gvt_pending_list = next_gvtc; /* freeing up first element in linked list */
else
{
assert(prev_gvtc->gvnh_reg->gd_reg != reg);
prev_gvtc->next_gvtc = (struct gvt_container_struct *)next_gvtc;
}
free_element(gvt_pending_buddy_list, (char *)gvtc);
}
}