fis-gtm/sr_unix/gtmci_isv.c

65 lines
2.2 KiB
C

/****************************************************************
* *
* Copyright 2001, 2009 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_string.h"
#include "op.h"
#include <rtnhdr.h>
#include "stack_frame.h"
#include "gtmci.h"
#include "svnames.h"
#include "gtm_savetraps.h"
#include "error_trap.h"
#include "mv_stent.h"
GBLREF dollar_ecode_type dollar_ecode;
GBLREF dollar_stack_type dollar_stack;
GBLREF stack_frame *frame_pointer;
static dollar_ecode_type dollar_ecode_ci;
static dollar_stack_type dollar_stack_ci;
static dollar_ecode_type *dollar_ecode_addr;
static dollar_stack_type *dollar_stack_addr;
void gtmci_isv_save(void)
{
gtm_savetraps(); /* Save either etrap or ztrap as appropriate */
op_newintrinsic(SV_ESTACK);
/* Save $ECODE/$STACK values of previous environment into SFF_CI frame of
* the current call-in environment. When this frame unwinds, their old values
* will be restored in dollar_ecode_ci and dollar_stack_ci (see unwind logic
* in ci_ret_code_quit) */
assert(frame_pointer->flags & SFF_CI);
dollar_ecode_addr = &dollar_ecode_ci;
push_stck(&dollar_ecode, SIZEOF(dollar_ecode), (void**)&dollar_ecode_addr, MVST_STCK);
dollar_stack_addr = &dollar_stack_ci;
push_stck(&dollar_stack, SIZEOF(dollar_stack), (void**)&dollar_stack_addr, MVST_STCK);
ecode_init();
}
void gtmci_isv_restore(void)
{
/* free the allocated $ECODE/$STACK storage before exiting from the current
* call-in environment. NOTE: any changes here should be reflected in ecode_init() */
if (dollar_ecode.begin)
free(dollar_ecode.begin);
if (dollar_ecode.array)
free(dollar_ecode.array);
if (dollar_stack.begin)
free(dollar_stack.begin);
if (dollar_stack.array)
free(dollar_stack.array);
/* Restore the old values from dollar_ecode_ci and dollar_stack_ci */
memcpy(&dollar_ecode, &dollar_ecode_ci, SIZEOF(dollar_ecode));
memcpy(&dollar_stack, &dollar_stack_ci, SIZEOF(dollar_stack));
}