X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FRtsMessages.c;h=6e75abc8a5b24ff95c3e43b40d72e8a52b1741a4;hb=0885017a4e92fe5710d1427c214adb87b92987e5;hp=1242d886eb301460152e65d4dc736ae91ffdfbeb;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/rts/RtsMessages.c b/rts/RtsMessages.c index 1242d88..6e75abc 100644 --- a/rts/RtsMessages.c +++ b/rts/RtsMessages.c @@ -9,7 +9,11 @@ #include "PosixSource.h" #include "Rts.h" +#include "eventlog/EventLog.h" + #include +#include +#include #ifdef HAVE_WINDOWS_H #include @@ -28,9 +32,10 @@ RtsMsgFunction *fatalInternalErrorFn = rtsFatalInternalErrorFn; RtsMsgFunction *debugMsgFn = rtsDebugMsgFn; RtsMsgFunction *errorMsgFn = rtsErrorMsgFn; +RtsMsgFunction *sysErrorMsgFn = rtsSysErrorMsgFn; void -barf(char *s, ...) +barf(const char*s, ...) { va_list ap; va_start(ap,s); @@ -40,20 +45,20 @@ barf(char *s, ...) } void -vbarf(char *s, va_list ap) +vbarf(const char*s, va_list ap) { (*fatalInternalErrorFn)(s,ap); stg_exit(EXIT_INTERNAL_ERROR); // just in case fatalInternalErrorFn() returns } void -_assertFail(char *filename, unsigned int linenum) +_assertFail(const char*filename, unsigned int linenum) { barf("ASSERTION FAILED: file %s, line %u\n", filename, linenum); } void -errorBelch(char *s, ...) +errorBelch(const char*s, ...) { va_list ap; va_start(ap,s); @@ -62,13 +67,28 @@ errorBelch(char *s, ...) } void -verrorBelch(char *s, va_list ap) +verrorBelch(const char*s, va_list ap) { (*errorMsgFn)(s,ap); } void -debugBelch(char *s, ...) +sysErrorBelch(const char*s, ...) +{ + va_list ap; + va_start(ap,s); + (*sysErrorMsgFn)(s,ap); + va_end(ap); +} + +void +vsysErrorBelch(const char*s, va_list ap) +{ + (*sysErrorMsgFn)(s,ap); +} + +void +debugBelch(const char*s, ...) { va_list ap; va_start(ap,s); @@ -77,7 +97,7 @@ debugBelch(char *s, ...) } void -vdebugBelch(char *s, va_list ap) +vdebugBelch(const char*s, va_list ap) { (*debugMsgFn)(s,ap); } @@ -88,9 +108,9 @@ vdebugBelch(char *s, va_list ap) #define BUFSIZE 512 -#if defined(cygwin32_TARGET_OS) || defined (mingw32_TARGET_OS) +#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS) static int -isGUIApp() +isGUIApp(void) { PIMAGE_DOS_HEADER pDOSHeader; PIMAGE_NT_HEADERS pPEHeader; @@ -110,10 +130,10 @@ isGUIApp() #define xstr(s) str(s) #define str(s) #s -void -rtsFatalInternalErrorFn(char *s, va_list ap) +void GNU_ATTRIBUTE(__noreturn__) +rtsFatalInternalErrorFn(const char *s, va_list ap) { -#if defined(cygwin32_TARGET_OS) || defined (mingw32_TARGET_OS) +#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS) if (isGUIApp()) { char title[BUFSIZE], message[BUFSIZE]; @@ -143,14 +163,18 @@ rtsFatalInternalErrorFn(char *s, va_list ap) fflush(stderr); } +#ifdef TRACING + if (RtsFlags.TraceFlags.tracing == TRACE_EVENTLOG) endEventLogging(); +#endif + abort(); // stg_exit(EXIT_INTERNAL_ERROR); } void -rtsErrorMsgFn(char *s, va_list ap) +rtsErrorMsgFn(const char *s, va_list ap) { -#if defined(cygwin32_TARGET_OS) || defined (mingw32_TARGET_OS) +#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS) if (isGUIApp()) { char buf[BUFSIZE]; @@ -169,7 +193,7 @@ rtsErrorMsgFn(char *s, va_list ap) #endif { /* don't fflush(stdout); WORKAROUND bug in Linux glibc */ - if (prog_argv != NULL && prog_name != NULL) { + if (prog_name != NULL) { fprintf(stderr, "%s: ", prog_name); } vfprintf(stderr, s, ap); @@ -178,9 +202,69 @@ rtsErrorMsgFn(char *s, va_list ap) } void -rtsDebugMsgFn(char *s, va_list ap) +rtsSysErrorMsgFn(const char *s, va_list ap) +{ + char *syserr; + +#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS) + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &syserr, + 0, + NULL ); + + if (isGUIApp()) + { + char buf[BUFSIZE]; + int r; + + r = vsnprintf(buf, BUFSIZE, s, ap); + if (r > 0 && r < BUFSIZE) { + r = vsnprintf(buf+r, BUFSIZE-r, ": %s", syserr); + MessageBox(NULL /* hWnd */, + buf, + prog_name, + MB_OK | MB_ICONERROR | MB_TASKMODAL + ); + } + } + else +#else + syserr = strerror(errno); + // ToDo: use strerror_r() if available +#endif + { + /* 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); + if (syserr) { +#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS) + // Win32 error messages have a terminating \n + fprintf(stderr, ": %s", syserr); +#else + fprintf(stderr, ": %s\n", syserr); +#endif + } else { + fprintf(stderr, "\n"); + } + } + +#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS) + if (syserr) LocalFree(syserr); +#endif +} + +void +rtsDebugMsgFn(const char *s, va_list ap) { -#if defined(cygwin32_TARGET_OS) || defined (mingw32_TARGET_OS) +#if defined(cygwin32_HOST_OS) || defined (mingw32_HOST_OS) if (isGUIApp()) { char buf[BUFSIZE];