int rts_error_va(void *csa, int argcnt, va_list var) { int msgid; va_list var_dup; const err_ctl *ctl; # ifdef DEBUG DCL_THREADGBL_ACCESS; SETUP_THREADGBL_ACCESS; if (TREF(rts_error_unusable) && !TREF(rts_error_unusable_seen)) { TREF(rts_error_unusable_seen) = TRUE; /* The below assert ensures that this rts_error invocation is appropriate in the current context of the code that * triggered this rts_error. If ever this assert fails, investigate the window of DBG_MARK_RTS_ERROR_UNUSABLE * and DBG_MARK_RTS_ERROR_USABLE in the call-stack. */ assert(FALSE); } # endif VAR_COPY(var_dup, var); if (-1 == gtm_errno) gtm_errno = errno; msgid = va_arg(var_dup, int); /* If there was a previous fatal error that did not yet get printed, do it before overwriting the * util_output buffer with the about-to-be-handled nested error. This way one will see ALL the * fatal error messages (e.g. assert failures) in the order in which they occurred instead of * just the last nested one. */ if (DUMPABLE) PRN_ERROR; /* This is simply a place holder msg to signal tp restart or otherwise rethrow an error */ if ((ERR_TPRETRY == msgid) || (ERR_REPEATERROR == msgid) || (ERR_REPLONLNRLBK == msgid) || (ERR_JOBINTRRQST == msgid) || (ERR_JOBINTRRETHROW == msgid)) { SET_ERROR_CONDITION(msgid); /* sets "error_condition" & "severity" */ } else { /* Note this message is not flushed out. This is so user console is not polluted with messages that are going to be * handled by a ZTRAP. If ZTRAP is not active, the message will be flushed out in mdb_condition_handler - which is * usually the top level handler or is rolled over into by higher handlers. */ if (IS_GTMSECSHR_IMAGE) util_out_print(NULL, RESET); SET_ERROR_CONDITION(msgid); /* sets "error_condition" & "severity" */ gtm_putmsg_list(csa, argcnt, var); if (DUMPABLE) created_core = dont_want_core = FALSE; /* We can create a(nother) core now */ if (IS_GTMSECSHR_IMAGE) util_out_print(NULL, OPER); /* gtmsecshr errors always immediately pushed out */ } va_end(var_dup); va_end(var); DRIVECH(msgid); /* Drive the topmost (inactive) condition handler */ /* Note -- at one time there was code here to catch if we returned from the condition handlers * when the severity was error or above. That code had to be removed because of several errors * that are handled and returned from. An example is EOF errors. SE 9/2000 */ return 0; }
void deferred_signal_handler(void) { void (*signal_routine)(); error_def(ERR_KILLBYSIG); error_def(ERR_KILLBYSIGUINFO); error_def(ERR_KILLBYSIGSINFO1); error_def(ERR_KILLBYSIGSINFO2); /* To avoid nested calls to this routine, we set forced_exit to FALSE at the very beginning */ forced_exit = FALSE; if (exit_handler_active) { assert(FALSE); /* at this point in time (June 2003) there is no way we know of to get here, hence the assert */ return; /* since anyway we are exiting currently, resume exit handling instead of reissuing another one */ } /* For signals that get a delayed response so we can get out of crit, we also delay the messages. * This routine will output those delayed messages from the appropriate structures to both the * user and the system console. */ /* note can't use switch here because ERR_xxx are not defined as constants */ if (ERR_KILLBYSIG == forced_exit_err) { send_msg(VARLSTCNT(6) ERR_KILLBYSIG, 4, GTMIMAGENAMETXT(image_type), process_id, signal_info.signal); gtm_putmsg(VARLSTCNT(6) ERR_KILLBYSIG, 4, GTMIMAGENAMETXT(image_type), process_id, signal_info.signal); } else if (ERR_KILLBYSIGUINFO == forced_exit_err) { send_msg(VARLSTCNT(8) ERR_KILLBYSIGUINFO, 6, GTMIMAGENAMETXT(image_type), process_id, signal_info.signal, signal_info.send_pid, signal_info.send_uid); gtm_putmsg(VARLSTCNT(8) ERR_KILLBYSIGUINFO, 6, GTMIMAGENAMETXT(image_type), process_id, signal_info.signal, signal_info.send_pid, signal_info.send_uid); } else if (ERR_KILLBYSIGSINFO1 == forced_exit_err) { send_msg(VARLSTCNT(8) ERR_KILLBYSIGSINFO1, 6, GTMIMAGENAMETXT(image_type), process_id, signal_info.signal, signal_info.int_iadr, signal_info.bad_vadr); gtm_putmsg(VARLSTCNT(8) ERR_KILLBYSIGSINFO1, 6, GTMIMAGENAMETXT(image_type), process_id, signal_info.signal, signal_info.int_iadr, signal_info.bad_vadr); } else if (ERR_KILLBYSIGSINFO2 == forced_exit_err) { send_msg(VARLSTCNT(7) ERR_KILLBYSIGSINFO2, 5, GTMIMAGENAMETXT(image_type), process_id, signal_info.signal, signal_info.int_iadr); gtm_putmsg(VARLSTCNT(7) ERR_KILLBYSIGSINFO2, 5, GTMIMAGENAMETXT(image_type), process_id, signal_info.signal, signal_info.int_iadr); } else { send_msg(VARLSTCNT(1) forced_exit_err); gtm_putmsg(VARLSTCNT(1) forced_exit_err); } /* As on VMS, a mupip stop does not drive the condition handlers unless we are in crit */ if ((0 != have_crit(CRIT_HAVE_ANY_REG) || SIGTERM != exi_condition) && CHANDLER_EXISTS) DRIVECH(0); /* If a special routine was registered to be driven on a signal, drive it now */ if (0 != exi_condition && call_on_signal) { signal_routine = call_on_signal; call_on_signal = NULL; /* So we don't recursively call ourselves */ (*signal_routine)(); } /* If the condition handler didn't cause an exit, drive the defined exit handler */ exit(-exi_condition); }