fixes for better signal handling

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1159 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2004-10-08 17:20:03 +00:00
parent f72b3ad98e
commit 90db51f867
3 changed files with 81 additions and 17 deletions

View File

@ -1124,35 +1124,31 @@ InteractSIGINT(int ch) {
siglongjmp (Yap_RestartEnv, 1);
#endif
}
return(-1);
return -1;
case 'c':
/* continue */
return(1);
return 1;
case 'd':
Yap_signal (YAP_DEBUG_SIGNAL);
/* enter debug mode */
Yap_PutValue (Yap_LookupAtom ("debug"), MkIntTerm (1));
return(1);
return 1;
case 'e':
/* exit */
Yap_exit(0);
return(-1);
return -1;
case 't':
/* start tracing */
Yap_PutValue (Yap_LookupAtom ("debug"), MkIntTerm (1));
Yap_PutValue (Yap_LookupAtom ("spy_sl"), MkIntTerm (0));
Yap_PutValue (Yap_FullLookupAtom ("$trace"), MkIntTerm (1));
yap_flags[SPY_CREEP_FLAG] = 1;
Yap_signal (YAP_CREEP_SIGNAL);
return(1);
Yap_signal (YAP_TRACE_SIGNAL);
return 1;
#ifdef LOW_LEVEL_TRACER
case 'T':
toggle_low_level_trace();
return(1);
return 1;
#endif
case 's':
/* show some statistics */
Yap_show_statistics();
return(1);
Yap_signal (YAP_STATISTICS_SIGNAL);
return 1;
case EOF:
return(0);
break;
@ -2166,6 +2162,31 @@ p_first_signal(void)
UNLOCK(SignalLock);
return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_creep")));
}
if (ActiveSignals & YAP_TRACE_SIGNAL) {
ActiveSignals &= ~YAP_TRACE_SIGNAL;
UNLOCK(SignalLock);
return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_trace")));
}
if (ActiveSignals & YAP_DEBUG_SIGNAL) {
ActiveSignals &= ~YAP_DEBUG_SIGNAL;
UNLOCK(SignalLock);
return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_debug")));
}
if (ActiveSignals & YAP_BREAK_SIGNAL) {
ActiveSignals &= ~YAP_BREAK_SIGNAL;
UNLOCK(SignalLock);
return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_break")));
}
if (ActiveSignals & YAP_STACK_DUMP_SIGNAL) {
ActiveSignals &= ~YAP_STACK_DUMP_SIGNAL;
UNLOCK(SignalLock);
return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_stack_dump")));
}
if (ActiveSignals & YAP_STATISTICS_SIGNAL) {
ActiveSignals &= ~YAP_STATISTICS_SIGNAL;
UNLOCK(SignalLock);
return Yap_unify(ARG1, MkAtomTerm(Yap_LookupAtom("sig_statistics")));
}
UNLOCK(SignalLock);
return FALSE;
}
@ -2195,6 +2216,21 @@ p_continue_signals(void)
if (ActiveSignals & YAP_CREEP_SIGNAL) {
Yap_signal(YAP_CREEP_SIGNAL);
}
if (ActiveSignals & YAP_TRACE_SIGNAL) {
Yap_signal(YAP_TRACE_SIGNAL);
}
if (ActiveSignals & YAP_DEBUG_SIGNAL) {
Yap_signal(YAP_DEBUG_SIGNAL);
}
if (ActiveSignals & YAP_BREAK_SIGNAL) {
Yap_signal(YAP_BREAK_SIGNAL);
}
if (ActiveSignals & YAP_STACK_DUMP_SIGNAL) {
Yap_signal(YAP_STACK_DUMP_SIGNAL);
}
if (ActiveSignals & YAP_STATISTICS_SIGNAL) {
Yap_signal(YAP_STATISTICS_SIGNAL);
}
return TRUE;
}

View File

@ -10,7 +10,7 @@
* File: Yap.h.m4 *
* mods: *
* comments: main header file for YAP *
* version: $Id: Yap.h.m4,v 1.70 2004-10-06 16:55:48 vsc Exp $ *
* version: $Id: Yap.h.m4,v 1.71 2004-10-08 17:20:03 vsc Exp $ *
*************************************************************************/
#include "config.h"
@ -564,7 +564,12 @@ typedef enum {
YAP_ITI_SIGNAL = 0x80, /* received inter thread signal */
YAP_TROVF_SIGNAL = 0x100, /* received trail overflow */
YAP_CDOVF_SIGNAL = 0x200, /* received code overflow */
YAP_STOVF_SIGNAL = 0x400 /* received stack overflow */
YAP_STOVF_SIGNAL = 0x400, /* received stack overflow */
YAP_TRACE_SIGNAL = 0x800, /* received start trace */
YAP_DEBUG_SIGNAL = 0x1000, /* received start debug */
YAP_BREAK_SIGNAL = 0x2000, /* received break signal */
YAP_STACK_DUMP_SIGNAL= 0x4000, /* received stack dump signal */
YAP_STATISTICS_SIGNAL= 0x8000 /* received statistics */
} yap_signals;
#define NUMBER_OF_YAP_FLAGS INDEXING_MODE_FLAG+1

View File

@ -38,7 +38,30 @@
% if more signals alive, set creep flag
'$continue_signals',
'$current_module'(M0),
'$execute0'((Goal,M:G),M0).
'$execute0'(G,M0).
'$do_signal'(sig_trace, G) :-
'$continue_signals',
trace.
'$do_signal'(sig_debug, G) :-
'$continue_signals',
'$current_module'(M0),
debug,
'$execute0'(G,M0).
'$do_signal'(sig_break, G) :-
'$continue_signals',
'$current_module'(M0),
break,
'$execute0'(G,M0).
'$do_signal'(sig_statistics, G) :-
'$continue_signals',
'$current_module'(M0),
statistics,
'$execute0'(G,M0).
'$do_signal'(sig_stack_dump, G) :-
'$continue_signals',
'$current_module'(M0),
'$stack_dump',
'$execute0'(G,M0).
% Unix signals
'$do_signal'(sig_alarm, G) :-
'$signal_handler'(sig_alarm, G).