diff --git a/C/sysbits.c b/C/sysbits.c index ef4db300c..0f972bf40 100644 --- a/C/sysbits.c +++ b/C/sysbits.c @@ -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; } diff --git a/m4/Yap.h.m4 b/m4/Yap.h.m4 index b3d3ae039..15c6cb343 100644 --- a/m4/Yap.h.m4 +++ b/m4/Yap.h.m4 @@ -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 diff --git a/pl/signals.yap b/pl/signals.yap index fca41918c..188d16b34 100644 --- a/pl/signals.yap +++ b/pl/signals.yap @@ -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).