fis-gtm/sr_unix_cm/rc_rundown.c

64 lines
1.7 KiB
C

/****************************************************************
* *
* Copyright 2001, 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. *
* *
****************************************************************/
/* rc_rundown - GT.CM global database cleanup
* Go through each global database and reset the "dsid" field in the header
* to zero, indicating that GT.CM is not accessing this file. This is
* necessary so that GT.M processes will not try to access the GT.CM
* semaphore lock.
*/
#include "mdef.h"
#include "rc.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsroot.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "rc_nspace.h"
#include "filestruct.h"
GBLREF rc_dsid_list *dsid_list;
GBLREF sgmnt_addrs *cs_addrs;
GBLREF sgmnt_data_ptr_t cs_data;
GBLREF gd_region *gv_cur_region;
void rc_rundown(void)
{
rc_dsid_list *fdi_ptr;
int dsid;
for (fdi_ptr = dsid_list; fdi_ptr; fdi_ptr = fdi_ptr->next)
{
if (fdi_ptr->gda)
{
cs_addrs = &FILE_INFO(fdi_ptr->gda->maps[1].reg.addr)->s_addrs;
gv_cur_region = fdi_ptr->gda->maps[1].reg.addr;
cs_data = cs_addrs->hdr;
dsid = cs_data->dsid;
if (fdi_ptr->dsid != RC_NSPACE_DSID)
{
assert(!cs_addrs->hold_onto_crit); /* so we can safely do unconditional grab_crit and rel_crit */
grab_crit(gv_cur_region);
if (--cs_data->rc_srv_cnt <= 0)
{
cs_data->rc_node = cs_data->dsid = 0;
cs_data->rc_srv_cnt = 0;
cs_addrs->hdr->dsid = 0;
}
rel_crit(gv_cur_region);
}
}
}
}