63 lines
2.1 KiB
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;
|
|
}
|
|
}
|