fis-gtm/sr_unix/util_exit_handler.c

73 lines
2.1 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. *
* *
****************************************************************/
#include "mdef.h"
#include "gdsroot.h"
#include "gdsbt.h"
#include "gdsblk.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "error.h"
#include "gt_timer.h"
#include "util.h"
#include "gv_rundown.h"
#include "print_exit_stats.h"
#include "secshr_db_clnup.h"
#include "gtmimagename.h"
#include "dpgbldir.h"
GBLREF boolean_t need_core;
GBLREF boolean_t created_core;
GBLREF boolean_t exit_handler_active;
GBLREF uint4 dollar_tlevel;
GBLREF boolean_t hold_onto_crit;
void util_exit_handler()
{
int stat;
gd_region *r_top, *reg;
sgmnt_addrs *csa;
gd_addr *addr_ptr;
if (exit_handler_active) /* Don't recurse if exit handler exited */
return;
exit_handler_active = TRUE;
SET_PROCESS_EXITING_TRUE; /* set this BEFORE cancelling timers as wcs_phase2_commit_wait relies on this */
if (IS_DSE_IMAGE)
{ /* Need to clear csa->hold_onto_crit in case it was set */
for (addr_ptr = get_next_gdr(NULL); addr_ptr; addr_ptr = get_next_gdr(addr_ptr))
{
for (reg = addr_ptr->regions, r_top = reg + addr_ptr->n_regions; reg < r_top; reg++)
{
if (reg->open && !reg->was_open)
{
csa = &FILE_INFO(reg)->s_addrs;
csa->hold_onto_crit = FALSE; /* need to do this before the rel_crit */
if (csa->now_crit)
rel_crit(reg);
}
}
}
}
cancel_timer(0); /* Cancel all timers - No unpleasant surprises */
secshr_db_clnup(NORMAL_TERMINATION);
assert(!dollar_tlevel); /* MUPIP and GT.M are the only ones which can run TP and they have their own exit handlers.
* So no need to run op_trollback here like mupip_exit_handler and gtm_exit_handler. */
gv_rundown();
print_exit_stats();
util_out_close();
if (need_core && !created_core)
DUMP_CORE;
}