X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=ghc%2Frts%2FRtsUtils.c;h=ce1c0a2493a67077bb234d71cbede8a71cd02237;hb=153b9cb9b11e05c4edb1b6bc0a7b972660e41f70;hp=99bea7563a332701b592eeddbe6ba710ad1e18a5;hpb=95ca6bff6fc9918203173b442192d9298ef9757a;p=ghc-hetmet.git diff --git a/ghc/rts/RtsUtils.c b/ghc/rts/RtsUtils.c index 99bea75..ce1c0a2 100644 --- a/ghc/rts/RtsUtils.c +++ b/ghc/rts/RtsUtils.c @@ -10,10 +10,8 @@ /* #include "PosixSource.h" */ #include "Rts.h" -#include "RtsTypes.h" #include "RtsAPI.h" #include "RtsFlags.h" -#include "Hooks.h" #include "RtsUtils.h" #include "Ticky.h" @@ -34,90 +32,13 @@ #include #include -/* ----------------------------------------------------------------------------- - General message generation functions - - All messages should go through here. We can't guarantee that - stdout/stderr will be available - e.g. in a Windows program there - is no console for generating messages, so they have to either go to - to the debug console, or pop up message boxes. - -------------------------------------------------------------------------- */ - -RtsMsgFunction *fatalInternalMsgFn = stdioFatalInternalMsgFn; -RtsMsgFunction *debugMsgFn = stdioDebugMsgFn; -RtsMsgFunction *errorMsgFn = stdioErrorMsgFn; - -void -barf(char *s, ...) -{ - va_list ap; - va_start(ap,s); - (*fatalInternalMsgFn)(s,ap); - stg_exit(EXIT_INTERNAL_ERROR); - va_end(ap); -} - -void -errorBelch(char *s, ...) -{ - va_list ap; - va_start(ap,s); - (*errorMsgFn)(s,ap); - va_end(ap); -} - -void -debugBelch(char *s, ...) -{ - va_list ap; - va_start(ap,s); - (*debugMsgFn)(s,ap); - va_end(ap); -} - -void -vdebugBelch(char *s, va_list ap) -{ - (*debugMsgFn)(s,ap); -} - -/* ----------------------------------------------------------------------------- - stdio versions of the message functions - -------------------------------------------------------------------------- */ - -void -stdioFatalInternalMsgFn(char *s, va_list ap) -{ - /* don't fflush(stdout); WORKAROUND bug in Linux glibc */ - if (prog_argv != NULL && prog_name != NULL) { - fprintf(stderr, "%s: internal error: ", prog_name); - } else { - fprintf(stderr, "internal error: "); - } - vfprintf(stderr, s, ap); - fprintf(stderr, "\n"); - fprintf(stderr, " Please report this as a bug to glasgow-haskell-bugs@haskell.org,\n or http://www.sourceforge.net/projects/ghc/\n"); - fflush(stderr); -} - -void -stdioErrorMsgFn(char *s, va_list ap) -{ - /* don't fflush(stdout); WORKAROUND bug in Linux glibc */ - if (prog_argv != NULL && prog_name != NULL) { - fprintf(stderr, "%s: ", prog_name); - } - vfprintf(stderr, s, ap); - fprintf(stderr, "\n"); -} +#ifdef HAVE_SIGNAL_H +#include +#endif -void -stdioDebugMsgFn(char *s, va_list ap) -{ - /* don't fflush(stdout); WORKAROUND bug in Linux glibc */ - vfprintf(stderr, s, ap); - fflush(stderr); -} +#if defined(THREADED_RTS) && defined(openbsd_HOST_OS) && defined(HAVE_PTHREAD_H) +#include +#endif /* ----------------------------------------------------------------------------- Result-checking malloc wrappers. @@ -270,7 +191,7 @@ time_str(void) * clean up for us. * -------------------------------------------------------------------------- */ -#if !defined(mingw32_TARGET_OS) +#if !defined(mingw32_HOST_OS) void resetNonBlockingFd(int fd) { @@ -309,7 +230,7 @@ static ullong startTime = 0; ullong msTime(void) { -# if defined(HAVE_GETCLOCK) && !defined(alpha_TARGET_ARCH) && !defined(hppa1_1_TARGET_ARCH) +# if defined(HAVE_GETCLOCK) && !defined(alpha_HOST_ARCH) && !defined(hppa1_1_HOST_ARCH) struct timespec tv; if (getclock(TIMEOFDAY, &tv) != 0) { @@ -318,7 +239,7 @@ msTime(void) stg_exit(EXIT_FAILURE); } return tv.tv_sec * LL(1000) + tv.tv_nsec / LL(1000000) - startTime; -# elif HAVE_GETTIMEOFDAY && !defined(alpha_TARGET_ARCH) +# elif HAVE_GETTIMEOFDAY && !defined(alpha_HOST_ARCH) struct timeval tv; if (gettimeofday(&tv, NULL) != 0) { @@ -375,3 +296,17 @@ heapCheckFail( void ) } #endif +/* + * It seems that pthreads and signals interact oddly in OpenBSD & FreeBSD + * pthreads (and possibly others). When linking with -lpthreads, we + * have to use pthread_kill to send blockable signals. So use that + * when we have a threaded rts. So System.Posix.Signals will call + * genericRaise(), rather than raise(3). + */ +int genericRaise(int sig) { +#if defined(THREADED_RTS) && (defined(openbsd_HOST_OS) || defined(freebsd_HOST_OS)) + return pthread_kill(pthread_self(), sig); +#else + return raise(sig); +#endif +}