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

View File

@ -10,7 +10,7 @@
* File: Yap.h.m4 * * File: Yap.h.m4 *
* mods: * * mods: *
* comments: main header file for YAP * * 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" #include "config.h"
@ -564,7 +564,12 @@ typedef enum {
YAP_ITI_SIGNAL = 0x80, /* received inter thread signal */ YAP_ITI_SIGNAL = 0x80, /* received inter thread signal */
YAP_TROVF_SIGNAL = 0x100, /* received trail overflow */ YAP_TROVF_SIGNAL = 0x100, /* received trail overflow */
YAP_CDOVF_SIGNAL = 0x200, /* received code 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; } yap_signals;
#define NUMBER_OF_YAP_FLAGS INDEXING_MODE_FLAG+1 #define NUMBER_OF_YAP_FLAGS INDEXING_MODE_FLAG+1

View File

@ -38,7 +38,30 @@
% if more signals alive, set creep flag % if more signals alive, set creep flag
'$continue_signals', '$continue_signals',
'$current_module'(M0), '$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 % Unix signals
'$do_signal'(sig_alarm, G) :- '$do_signal'(sig_alarm, G) :-
'$signal_handler'(sig_alarm, G). '$signal_handler'(sig_alarm, G).