fis-gtm/sr_unix/continue_handler.c

63 lines
2.1 KiB
C

/****************************************************************
* *
* Copyright 2001, 2012 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 <signal.h>
#include "gtm_syslog.h"
#include "gtm_limits.h"
#include "gtmsiginfo.h"
#include "io.h"
#include "send_msg.h"
#include "setterm.h"
#include "continue_handler.h"
#include "gtmsecshr.h"
GBLREF volatile int suspend_status;
GBLREF io_pair io_std_device;
GBLREF pid_t process_id;
error_def(ERR_REQ2RESUME);
void continue_handler(int sig, siginfo_t *info, void *context)
{
gtmsiginfo_t sig_info;
DCL_THREADGBL_ACCESS;
SETUP_THREADGBL_ACCESS;
/* Count how many times we get a continue-process signal (in DEBUG) */
DEBUG_ONLY(DBGGSSHR((LOGFLAGS, "continue_handler: pid %d, continue_proc_cnt bumped from %d to %d\n",
process_id, TREF(continue_proc_cnt), TREF(continue_proc_cnt) + 1)));
DEBUG_ONLY((TREF(continue_proc_cnt))++);
assert(SIGCONT == sig);
extract_signal_info(sig, info, context, &sig_info);
switch(suspend_status)
{
case NOW_SUSPEND:
/* Don't bother checking if user info is available. If info isn't available,
* the value zero will be printed for pid and uid. Note that the following
* message was previously put out even when the process was not suspended but
* with the changes in spin locks that send continue messages "just in case",
* I thought it better to restrict this message to when the process was actually
* suspended and being continued. SE 7/01
*/
send_msg(VARLSTCNT(4) ERR_REQ2RESUME, 2, sig_info.send_pid, sig_info.send_uid);
if (NULL != io_std_device.in && tt == io_std_device.in->type)
setterm(io_std_device.in);
/* Fall through */
case DEFER_SUSPEND:
/* If suspend was deferred, this continue/resume overrides/cancels it */
suspend_status = NO_SUSPEND;
break;
}
}