From 4fc80ef6710401b4b249c2bf298986623bdbd503 Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Sun, 8 Feb 2009 19:14:31 +0000 Subject: [PATCH] Handle the case where setitimer(ITIMER_VIRTUAL) is not always available Patch from sthibaul. Fixes trac #2883. --- configure.ac | 13 +++++++++++++ rts/posix/Itimer.c | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 8c984de..d298af8 100644 --- a/configure.ac +++ b/configure.ac @@ -1108,6 +1108,19 @@ fi dnl ** check for more functions dnl ** The following have been verified to be used in ghc/, but might be used somewhere else, too. AC_CHECK_FUNCS([getclock getrusage gettimeofday setitimer siginterrupt sysconf times ctime_r]) + +AC_TRY_RUN([ +#include +#include +int main(void) { + struct itimerval tval; + tval.it_value.tv_sec = 1; + tval.it_value.tv_usec = 0; + tval.it_interval = tval.it_value; + return setitimer(ITIMER_VIRTUAL, &tval, (void*)0) != 0; +} +],[AC_DEFINE([HAVE_SETITIMER_VIRTUAL], [1], [Define to 1 if setitimer accepts ITIMER_VIRTUAL, 0 else.])]) + dnl ** On OS X 10.4 (at least), time.h doesn't declare ctime_r if dnl ** _POSIX_C_SOURCE is defined AC_CHECK_DECLS([ctime_r], , , diff --git a/rts/posix/Itimer.c b/rts/posix/Itimer.c index 6b4ba3b..eb26cd3 100644 --- a/rts/posix/Itimer.c +++ b/rts/posix/Itimer.c @@ -80,9 +80,10 @@ #elif defined(HAVE_SETITIMER) -# ifdef THREADED_RTS +# if defined(THREADED_RTS) || !defined(HAVE_SETITIMER_VIRTUAL) // Oh dear, we have to use SIGALRM if there's no timer_create and // we're using the THREADED_RTS. This leads to problems, see bug #850. +// We also use it if we don't have a virtual timer (trac #2883). # define ITIMER_SIGNAL SIGALRM # define ITIMER_FLAVOUR ITIMER_REAL # else -- 1.7.10.4