separate standard alarm from virtual alarm. timeout uses virtual alarm #112

This commit is contained in:
Costa Vitor 2009-06-03 10:09:14 -05:00
parent b72345cc97
commit 7f54acb536
9 changed files with 40 additions and 5 deletions

View File

@ -1497,9 +1497,9 @@ clean_trail(Term t, Term t0)
} else {
Bind(pt, t);
Yap_WakeUp(pt);
return;
}
}
return;
}
pt1--;
} else if (IsApplTerm(d1)) {

View File

@ -1563,6 +1563,24 @@ HandleALRM(int s)
#endif
#if !defined(_WIN32)
/* this routine is called if the system activated the alarm */
static RETSIGTYPE
#if (defined(__svr4__) || defined(__SVR4))
HandleVTALRM (int s, siginfo_t *x, ucontext_t *y)
#else
HandleVTALRM(int s)
#endif
{
my_signal (SIGVTALRM, HandleVTALRM);
/* force the system to creep */
Yap_signal (YAP_VTALARM_SIGNAL);
/* now, say what is going on */
Yap_PutValue(AtomAlarm, MkAtomTerm(AtomTrue));
}
#endif
/*
* This function is called after a normal interrupt had been caught.
* It allows 6 possibilities: abort, continue, trace, debug, help, exit.
@ -1651,6 +1669,7 @@ InitSignals (void)
my_signal (SIGUSR2, ReceiveSignal);
my_signal (SIGHUP, ReceiveSignal);
my_signal (SIGALRM, HandleALRM);
my_signal (SIGVTALRM, HandleVTALRM);
#endif
#ifdef SIGPIPE
my_signal (SIGPIPE, ReceiveSignal);
@ -2779,6 +2798,11 @@ p_first_signal(void)
UNLOCK(SignalLock);
return Yap_unify(ARG1, MkAtomTerm(AtomSigAlarm));
}
if (ActiveSignals & YAP_VTALARM_SIGNAL) {
ActiveSignals &= ~YAP_VTALARM_SIGNAL;
UNLOCK(SignalLock);
return Yap_unify(ARG1, MkAtomTerm(AtomSigVTAlarm));
}
if (ActiveSignals & YAP_DELAY_CREEP_SIGNAL) {
ActiveSignals &= ~(YAP_CREEP_SIGNAL|YAP_DELAY_CREEP_SIGNAL);
#ifdef THREADS
@ -2864,6 +2888,9 @@ p_continue_signals(void)
if (ActiveSignals & YAP_ALARM_SIGNAL) {
Yap_signal(YAP_ALARM_SIGNAL);
}
if (ActiveSignals & YAP_VTALARM_SIGNAL) {
Yap_signal(YAP_VTALARM_SIGNAL);
}
if (ActiveSignals & YAP_CREEP_SIGNAL) {
Yap_signal(YAP_CREEP_SIGNAL);
}

View File

@ -578,7 +578,8 @@ typedef enum
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_PIPE_SIGNAL = 0x40000 /* call atom garbage collector asap */
YAP_PIPE_SIGNAL = 0x40000, /* call atom garbage collector asap */
YAP_VTALARM_SIGNAL = 0x80000 /* received SIGVTALARM */
} yap_signals;
#define NUMBER_OF_YAP_FLAGS LAST_FLAG

View File

@ -238,6 +238,7 @@
AtomSigTrace = Yap_LookupAtom("sig_trace");
AtomSigUsr1 = Yap_LookupAtom("sig_usr1");
AtomSigUsr2 = Yap_LookupAtom("sig_usr2");
AtomSigVTAlarm = Yap_LookupAtom("sig_vtalarm");
AtomSigWakeUp = Yap_LookupAtom("sig_wake_up");
AtomSlash = Yap_LookupAtom("/");
AtomSocket = Yap_LookupAtom("socket");

View File

@ -240,6 +240,7 @@
AtomSigTrace = AtomAdjust(AtomSigTrace);
AtomSigUsr1 = AtomAdjust(AtomSigUsr1);
AtomSigUsr2 = AtomAdjust(AtomSigUsr2);
AtomSigVTAlarm = AtomAdjust(AtomSigVTAlarm);
AtomSigWakeUp = AtomAdjust(AtomSigWakeUp);
AtomSlash = AtomAdjust(AtomSlash);
AtomSocket = AtomAdjust(AtomSocket);

View File

@ -482,6 +482,8 @@
#define AtomSigUsr1 Yap_heap_regs->AtomSigUsr1_
Atom AtomSigUsr2_;
#define AtomSigUsr2 Yap_heap_regs->AtomSigUsr2_
Atom AtomSigVTAlarm_;
#define AtomSigVTAlarm Yap_heap_regs->AtomSigVTAlarm_
Atom AtomSigWakeUp_;
#define AtomSigWakeUp Yap_heap_regs->AtomSigWakeUp_
Atom AtomSlash_;

View File

@ -39,13 +39,13 @@ run_formats([Com-Args|StackInfo], Stream) :-
virtual_alarm(Interval, Goal, Left) :-
Interval == 0, !,
virtual_alarm(0, 0, Left0, _),
on_signal(sig_alarm, _, Goal),
on_signal(sig_vtalarm, _, Goal),
Left = Left0.
virtual_alarm(Interval, Goal, Left) :-
integer(Interval), !,
on_signal(sig_alarm, _, Goal),
on_signal(sig_vtalarm, _, Goal),
virtual_alarm(Interval, 0, Left, _).
virtual_alarm(Interval.USecs, Goal, Left.LUSecs) :-
on_signal(sig_alarm, _, Goal),
on_signal(sig_vtalarm, _, Goal),
virtual_alarm(Interval, USecs, Left, LUSecs).

View File

@ -249,6 +249,7 @@ A SigStatistics N "sig_statistic"
A SigTrace N "sig_trace"
A SigUsr1 N "sig_usr1"
A SigUsr2 N "sig_usr2"
A SigVTAlarm N "sig_vtalarm"
A SigWakeUp N "sig_wake_up"
A Slash N "/"
A Socket N "socket"

View File

@ -96,6 +96,8 @@
% Unix signals
'$do_signal'(sig_alarm, G) :-
'$signal_handler'(sig_alarm, G).
'$do_signal'(sig_vtalarm, G) :-
'$signal_handler'(sig_vtalarm, G).
'$do_signal'(sig_hup, G) :-
'$signal_handler'(sig_hup, G).
'$do_signal'(sig_usr1, G) :-