use setitmer instead of alarm.

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1886 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc 2007-05-20 23:00:38 +00:00
parent ed7873ef8a
commit 5affad32b6
9 changed files with 6316 additions and 6089 deletions

View File

@ -2230,7 +2230,7 @@ DoTimerThread(LPVOID targ)
HANDLE htimer; HANDLE htimer;
LARGE_INTEGER liDueTime; LARGE_INTEGER liDueTime;
htimer = CreateWaitableTimer(NULL,FALSE,NULL); htimer = CreateWaitableTimer(NULL, FALSE, NULL);
liDueTime.QuadPart = -10000000; liDueTime.QuadPart = -10000000;
liDueTime.QuadPart *= time; liDueTime.QuadPart *= time;
/* Copy the relative time into a LARGE_INTEGER. */ /* Copy the relative time into a LARGE_INTEGER. */
@ -2254,6 +2254,7 @@ static Int
p_alarm(void) p_alarm(void)
{ {
Term t = Deref(ARG1); Term t = Deref(ARG1);
Term t2 = Deref(ARG2);
if (IsVarTerm(t)) { if (IsVarTerm(t)) {
Yap_Error(INSTANTIATION_ERROR, t, "alarm/2"); Yap_Error(INSTANTIATION_ERROR, t, "alarm/2");
return(FALSE); return(FALSE);
@ -2262,6 +2263,14 @@ p_alarm(void)
Yap_Error(TYPE_ERROR_INTEGER, t, "alarm/2"); Yap_Error(TYPE_ERROR_INTEGER, t, "alarm/2");
return(FALSE); return(FALSE);
} }
if (IsVarTerm(t2)) {
Yap_Error(INSTANTIATION_ERROR, t2, "alarm/2");
return(FALSE);
}
if (!IsIntegerTerm(t2)) {
Yap_Error(TYPE_ERROR_INTEGER, t2, "alarm/2");
return(FALSE);
}
#if _MSC_VER || defined(__MINGW32__) #if _MSC_VER || defined(__MINGW32__)
{ {
Term tout; Term tout;
@ -2285,7 +2294,26 @@ p_alarm(void)
} }
} }
tout = MkIntegerTerm(0); tout = MkIntegerTerm(0);
return(Yap_unify(ARG2,tout)); return Yap_unify(ARG3,tout) && Yap_unify(ARG4,MkIntTerm(0));
}
#elif HAVE_SETITIMER
{
struct itimerval new, old;
new.it_interval.tv_sec = 0;
new.it_interval.tv_usec = 0;
new.it_value.tv_sec = IntegerOfTerm(ARG1);
new.it_value.tv_usec = IntegerOfTerm(ARG2);
if (setitimer(ITIMER_REAL, &new, &old) < 0) {
#if HAVE_STRERROR
Yap_Error(OPERATING_SYSTEM_ERROR, ARG1, "setitimer: %s", strerror(errno));
#else
Yap_Error(OPERATING_SYSTEM_ERROR, ARG1, "setitimer %d", errno);
#endif
return FALSE;
}
return Yap_unify(ARG3,MkIntegerTerm(old.it_value.tv_sec)) &&
Yap_unify(ARG4,MkIntegerTerm(old.it_value.tv_usec));
} }
#elif HAVE_ALARM #elif HAVE_ALARM
{ {
@ -2294,7 +2322,7 @@ p_alarm(void)
left = alarm(IntegerOfTerm(t)); left = alarm(IntegerOfTerm(t));
tout = MkIntegerTerm(left); tout = MkIntegerTerm(left);
return Yap_unify(ARG2,tout); return Yap_unify(ARG3,tout) && Yap_unify(ARG4,MkIntTerm(0)) ;
} }
#else #else
/* not actually trying to set the alarm */ /* not actually trying to set the alarm */
@ -2302,7 +2330,7 @@ p_alarm(void)
return TRUE; return TRUE;
Yap_Error(SYSTEM_ERROR, TermNil, Yap_Error(SYSTEM_ERROR, TermNil,
"alarm not available in this configuration"); "alarm not available in this configuration");
return(FALSE); return FALSE;
#endif #endif
} }
@ -2572,7 +2600,7 @@ Yap_InitSysPreds(void)
Yap_InitCPred ("$yap_home", 1, p_yap_home, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred ("$yap_home", 1, p_yap_home, SafePredFlag|SyncPredFlag|HiddenPredFlag);
Yap_InitCPred ("getcwd", 1, p_getcwd, SafePredFlag|SyncPredFlag); Yap_InitCPred ("getcwd", 1, p_getcwd, SafePredFlag|SyncPredFlag);
Yap_InitCPred ("$dir_separator", 1, p_dir_sp, SafePredFlag|HiddenPredFlag); Yap_InitCPred ("$dir_separator", 1, p_dir_sp, SafePredFlag|HiddenPredFlag);
Yap_InitCPred ("$alarm", 2, p_alarm, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred ("$alarm", 4, p_alarm, SafePredFlag|SyncPredFlag|HiddenPredFlag);
Yap_InitCPred ("$getenv", 2, p_getenv, SafePredFlag|HiddenPredFlag); Yap_InitCPred ("$getenv", 2, p_getenv, SafePredFlag|HiddenPredFlag);
Yap_InitCPred ("$putenv", 2, p_putenv, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred ("$putenv", 2, p_putenv, SafePredFlag|SyncPredFlag|HiddenPredFlag);
Yap_InitCPred ("$file_age", 2, p_file_age, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred ("$file_age", 2, p_file_age, SafePredFlag|SyncPredFlag|HiddenPredFlag);

View File

@ -16,6 +16,8 @@
<h2>Yap-5.1.2:</h2> <h2>Yap-5.1.2:</h2>
<ul> <ul>
<li> FIXED: alarm used alarm(2) but it should use setitimer(2) so that
timeout can work with millisecs (obs from Bernd Gutmann).</li>
<li> FIXED: add . to -g goal (obs from Paulo Moura).</li> <li> FIXED: add . to -g goal (obs from Paulo Moura).</li>
<li> FIXED: min_list (obs from Angelika, Bernd & Niels).</li> <li> FIXED: min_list (obs from Angelika, Bernd & Niels).</li>
<li> FIXED: issues with C-Interface (obs from Trevor Walker).</li> <li> FIXED: issues with C-Interface (obs from Trevor Walker).</li>

View File

@ -195,6 +195,7 @@
#undef HAVE_SBRK #undef HAVE_SBRK
#undef HAVE_SELECT #undef HAVE_SELECT
#undef HAVE_SETBUF #undef HAVE_SETBUF
#undef HAVE_SETITIMER
#undef HAVE_SETLINEBUF #undef HAVE_SETLINEBUF
#undef HAVE_SHMAT #undef HAVE_SHMAT
#undef HAVE_SIGACTION #undef HAVE_SIGACTION

12340
configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -1194,7 +1194,8 @@ AC_CHECK_FUNCS(memcpy memmove mkstemp mktemp)
AC_CHECK_FUNCS(nanosleep mktime opendir) AC_CHECK_FUNCS(nanosleep mktime opendir)
AC_CHECK_FUNCS(putenv rand random readlink regexec) AC_CHECK_FUNCS(putenv rand random readlink regexec)
AC_CHECK_FUNCS(rename rint rl_set_prompt sbrk select) AC_CHECK_FUNCS(rename rint rl_set_prompt sbrk select)
AC_CHECK_FUNCS(setbuf setlinebuf sigaction siggetmask siginterrupt) AC_CHECK_FUNCS(setbuf setitimer setlinebuf sigaction)
AC_CHECK_FUNCS(siggetmask siginterrupt)
AC_CHECK_FUNCS(signal sigprocmask socket stat) AC_CHECK_FUNCS(signal sigprocmask socket stat)
AC_CHECK_FUNCS(strchr strerror strncat strncpy strtod) AC_CHECK_FUNCS(strchr strerror strncat strncpy strtod)
AC_CHECK_FUNCS(time times tmpnam usleep vsnprintf) AC_CHECK_FUNCS(time times tmpnam usleep vsnprintf)

View File

@ -5733,11 +5733,11 @@ Execute a new shell.
@findex alarm/3 @findex alarm/3
@snindex alarm/3 @snindex alarm/3
@cnindex alarm/3 @cnindex alarm/3
Arranges for YAP to be interrupted in @var{Seconds} Arranges for YAP to be interrupted in @var{Seconds} seconds, or in
seconds. When interrupted, YAP will execute @var{Callable} and @var{Seconds.MicroSeconds}. When interrupted, YAP will execute
then return to the previous execution. If @var{Seconds} is @code{0}, no @var{Callable} and then return to the previous execution. If
new alarm is scheduled. In any event, any previously set alarm is @var{Seconds} is @code{0}, no new alarm is scheduled. In any event,
canceled. any previously set alarm is canceled.
The variable @var{OldAlarm} unifies with the number of seconds remaining The variable @var{OldAlarm} unifies with the number of seconds remaining
until any previously scheduled alarm was due to be delivered, or with until any previously scheduled alarm was due to be delivered, or with

View File

@ -26,8 +26,9 @@
% %
time_out(Goal, Time, Result) :- time_out(Goal, Time, Result) :-
T is Time//1000, T is Time//1000,
UT is (Time mod 1000)*1000,
% enable alarm % enable alarm
alarm(T,throw(time_out),_), alarm(T.UT,throw(time_out),_),
% launch goal and wait for signal % launch goal and wait for signal
( catch(Goal, time_out, Result = time_out) ( catch(Goal, time_out, Result = time_out)
% make sure to disable alarm % make sure to disable alarm

View File

@ -102,7 +102,7 @@ true :- true.
% reset alarms when entering top-level. % reset alarms when entering top-level.
'$enter_top_level' :- '$enter_top_level' :-
'$alarm'(0, _), '$alarm'(0, 0, _, _),
fail. fail.
'$enter_top_level' :- '$enter_top_level' :-
'$clean_up_dead_clauses', '$clean_up_dead_clauses',

View File

@ -150,8 +150,12 @@ on_signal(Signal,OldAction,Action) :-
alarm(Interval, Goal, Left) :- alarm(Interval, Goal, Left) :-
integer(Interval), !,
on_signal(sig_alarm, _, Goal), on_signal(sig_alarm, _, Goal),
'$alarm'(Interval, Left). '$alarm'(Interval, 0, Left, _).
alarm(Interval.USecs, Goal, Left.LUSecs) :-
on_signal(sig_alarm, _, Goal),
'$alarm'(Interval, USecs, Left, LUSecs).
raise_exception(Ball) :- throw(Ball). raise_exception(Ball) :- throw(Ball).