X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FRtsMessages.c;fp=ghc%2Frts%2FRtsMessages.c;h=08df965f2655f5a88f2d4302985e21157cfe6afa;hb=1d10874717ff05d2babc9cbf079d5895fcc0a922;hp=0000000000000000000000000000000000000000;hpb=770cf0549a25ab66546a2d20a56c8f38c569d5d7;p=ghc-hetmet.git diff --git a/ghc/rts/RtsMessages.c b/ghc/rts/RtsMessages.c new file mode 100644 index 0000000..08df965 --- /dev/null +++ b/ghc/rts/RtsMessages.c @@ -0,0 +1,113 @@ +/* ----------------------------------------------------------------------------- + * + * (c) The GHC Team, 1998-2004 + * + * General utility functions used in the RTS. + * + * ---------------------------------------------------------------------------*/ + +#include "PosixSource.h" +#include "Rts.h" + +#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. + -------------------------------------------------------------------------- */ + +// Default to the stdio implementation of these hooks. +RtsMsgFunction *fatalInternalErrorFn = stdioFatalInternalErrorFn; +RtsMsgFunction *debugMsgFn = stdioDebugMsgFn; +RtsMsgFunction *errorMsgFn = stdioErrorMsgFn; + +void +barf(char *s, ...) +{ + va_list ap; + va_start(ap,s); + (*fatalInternalErrorFn)(s,ap); + stg_exit(EXIT_INTERNAL_ERROR); // just in case fatalInternalErrorFn() returns + va_end(ap); +} + +void +vbarf(char *s, va_list ap) +{ + (*fatalInternalErrorFn)(s,ap); + stg_exit(EXIT_INTERNAL_ERROR); // just in case fatalInternalErrorFn() returns +} + +void +errorBelch(char *s, ...) +{ + va_list ap; + va_start(ap,s); + (*errorMsgFn)(s,ap); + va_end(ap); +} + +void +verrorBelch(char *s, va_list ap) +{ + (*errorMsgFn)(s,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 +stdioFatalInternalErrorFn(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); + stg_exit(EXIT_INTERNAL_ERROR); +} + +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"); +} + +void +stdioDebugMsgFn(char *s, va_list ap) +{ + /* don't fflush(stdout); WORKAROUND bug in Linux glibc */ + vfprintf(stderr, s, ap); + fflush(stderr); +} +