handle SIGPIPE and improve USR1 and USR2

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@2242 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2008-05-23 10:02:13 +00:00
parent a70fb91592
commit 7c24afa0f2
5 changed files with 30 additions and 8 deletions

View File

@ -1492,19 +1492,25 @@ ReceiveSignal (int s)
case SIGKILL:
Yap_Error(INTERRUPT_ERROR,MkIntTerm(s),NULL);
#endif
#if defined(SIGUSR1)
#ifdef SIGUSR1
case SIGUSR1:
/* force the system to creep */
Yap_signal (YAP_USR1_SIGNAL);
break;
#endif /* defined(SIGUSR1) */
#if defined(SIGUSR2)
#ifdef SIGUSR2
case SIGUSR2:
/* force the system to creep */
Yap_signal (YAP_USR2_SIGNAL);
break;
#endif /* defined(SIGUSR2) */
#if defined(SIGHUP)
#ifdef SIGPIPE
case SIGPIPE:
/* force the system to creep */
Yap_signal (YAP_PIPE_SIGNAL);
break;
#endif /* defined(SIGPIPE) */
#ifdef SIGHUP
case SIGHUP:
/* force the system to creep */
Yap_signal (YAP_HUP_SIGNAL);
@ -1545,6 +1551,9 @@ InitSignals (void)
my_signal (SIGHUP, ReceiveSignal);
my_signal (SIGALRM, HandleALRM);
#endif
#ifdef SIGPIPE
my_signal (SIGPIPE, ReceiveSignal);
#endif
#if _MSC_VER || defined(__MINGW32__)
signal (SIGINT, SIG_IGN);
SetConsoleCtrlHandler(MSCHandleSignal,TRUE);
@ -2543,6 +2552,11 @@ p_first_signal(void)
UNLOCK(SignalLock);
return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_usr1")));
}
if (ActiveSignals & YAP_PIPE_SIGNAL) {
ActiveSignals &= ~YAP_PIPE_SIGNAL;
UNLOCK(SignalLock);
return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_pipe")));
}
if (ActiveSignals & YAP_HUP_SIGNAL) {
ActiveSignals &= ~YAP_HUP_SIGNAL;
UNLOCK(SignalLock);

View File

@ -10,7 +10,7 @@
* File: Yap.h.m4 *
* mods: *
* comments: main header file for YAP *
* version: $Id: Yap.h,v 1.36 2008-05-15 13:41:46 vsc Exp $ *
* version: $Id: Yap.h,v 1.37 2008-05-23 10:02:13 vsc Exp $ *
*************************************************************************/
#include "config.h"
@ -573,7 +573,8 @@ typedef enum
YAP_STACK_DUMP_SIGNAL = 0x4000, /* received stack dump signal */
YAP_STATISTICS_SIGNAL = 0x8000, /* received statistics */
YAP_DELAY_CREEP_SIGNAL = 0x10000, /* received a creep but should not do it */
YAP_AGC_SIGNAL = 0x20000 /* call atom garbage collector asap */
YAP_AGC_SIGNAL = 0x20000, /* call atom garbage collector asap */
YAP_PIPE_SIGNAL = 0x40000 /* call atom garbage collector asap */
} yap_signals;
#define NUMBER_OF_YAP_FLAGS LAST_FLAG

View File

@ -17,6 +17,8 @@ xb
<h2>Yap-5.1.3:</h2>
<ul>
<li> FIXED: handle SIGPIPE and improve USR1 and USR2 (obs from Nicos
Angelopoulos).</li>
<li> NEW: tmp_file/2 (request from Nicos Angelopoulos).</li>
<li> FIXED: too much pruning on predicate_property/2 (obs from Nicos
Angelopoulos).</li>

View File

@ -11,7 +11,7 @@
* File: utilities for displaying messages in YAP. *
* comments: error messages for YAP *
* *
* Last rev: $Date: 2008-05-15 13:41:47 $,$Author: vsc $ *
* Last rev: $Date: 2008-05-23 10:02:13 $,$Author: vsc $ *
* *
* *
*************************************************************************/
@ -243,6 +243,8 @@ system_message(error(resource_error(threads), Where)) -->
[ 'RESOURCE ERROR- too many open threads' - [Where] ].
system_message(error(resource_error(memory), Where)) -->
[ 'RESOURCE ERROR- not enough virtual memory' - [Where] ].
system_message(error(signal(SIG,_), _)) -->
[ 'UNEXPECTED SIGNAL: ~a' [SIG] ].
system_message(error(syntax_error(G,0,Msg,[],0,0), _)) -->
[ 'SYNTAX ERROR: ~a' - [G,Msg] ].
system_message(error(syntax_error(_,_,_,Term,Pos,Start), Where)) -->

View File

@ -72,6 +72,8 @@
'$signal_handler'(sig_usr1, G).
'$do_signal'(sig_usr2, G) :-
'$signal_handler'(sig_usr2, G).
'$do_signal'(sig_pipe, G) :-
'$signal_handler'(sig_pipe, G).
'$signal_handler'(Sig, [M|G]) :-
'$signal_do'(Sig, Goal),
@ -122,8 +124,9 @@
( exists('~/.prologrc') -> [-'~/.prologrc'] ; true ),
( exists('~/prolog.ini') -> [-'~/prolog.ini'] ; true ))).
% die on signal default.
'$signal_def'(sig_usr1, (print_message(error, 'Received user signal 1'),halt)).
'$signal_def'(sig_usr2, (print_message(error, 'Received user signal 2'),halt)).
'$signal_def'(sig_usr1, throw(error(signal(usr1,[]),true))).
'$signal_def'(sig_usr2, throw(error(signal(usr2,[]),true))).
'$signal_def'(sig_pipe, throw(error(signal(pipe,[]),true))).
% ignore sig_alarm by default
'$signal_def'(sig_alarm, true).