X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=usystem.c;h=6ac238c493ad290426748c4bb96adb7fd5cdf018;hb=f1af1dfc236cea66f9a27d2a2e4b40dbecbfad71;hp=2334572f301ffbb91494ced99ad70545aac7eee6;hpb=e6e38912837a4fe2464356408d10dee950b3121c;p=xboard.git diff --git a/usystem.c b/usystem.c index 2334572..6ac238c 100644 --- a/usystem.c +++ b/usystem.c @@ -497,9 +497,12 @@ StartChildProcess (char *cmdLine, char *dir, ProcRef *pr) } // [HGM] kill: implement the 'hard killing' of AS's Winboard_x +static int pid; + static RETSIGTYPE AlarmCallBack (int n) { + kill(pid, SIGKILL); // kill forcefully return; } @@ -510,22 +513,17 @@ DestroyChildProcess (ProcRef pr, int signalType) if (cp->kind != CPReal) return; cp->kind = CPNone; - if (signalType == 10) { // [HGM] kill: if it does not terminate in 3 sec, kill - signal(SIGALRM, AlarmCallBack); - alarm(3); - if(wait((int *) 0) == -1) { // process does not terminate on its own accord - kill(cp->pid, SIGKILL); // kill it forcefully - wait((int *) 0); // and wait again - } - } else { - if (signalType) { - kill(cp->pid, signalType == 9 ? SIGKILL : SIGTERM); // [HGM] kill: use hard kill if so requested - } - /* Process is exiting either because of the kill or because of - a quit command sent by the backend; either way, wait for it to die. - */ - wait((int *) 0); + if (signalType & 1) { + kill(cp->pid, signalType == 9 ? SIGKILL : SIGTERM); // [HGM] kill: for 9 hard-kill immediately } + signal(SIGALRM, AlarmCallBack); + pid = cp->pid; + if(signalType & 4) alarm(1 + appData.delayAfterQuit); // [HGM] kill: schedule hard kill if so requested + /* Process is exiting either because of the kill or because of + a quit command sent by the backend; either way, wait for it to die. + */ + wait((int *) 0); + alarm(0); // cancel alarm if still pending close(cp->fdFrom); close(cp->fdTo); }