summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2023-05-02 12:58:14 -0400
committerMarge Bot <ben+marge-bot@smart-cactus.org>2023-05-15 18:02:20 -0400
commita5f5f067377d43867aee07e5696c59cff46436fd (patch)
tree3f637d31ebfc31d9245e843c387a68fcc8033529
parentc343112fb6cb937fdf5a3a279e5fc1cf41bd1b8f (diff)
downloadhaskell-a5f5f067377d43867aee07e5696c59cff46436fd.tar.gz
rts: Forcibly flush eventlog on barf
Previously we would attempt to flush via `endEventLogging` which can easily deadlock, e.g., if `barf` fails during GC. Using `flushEventLog` directly may result in slightly less consistent eventlog output (since we don't take all capabilities before flushing) but avoids deadlocking.
-rw-r--r--rts/RtsMessages.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/rts/RtsMessages.c b/rts/RtsMessages.c
index 507d007484..d760bd233c 100644
--- a/rts/RtsMessages.c
+++ b/rts/RtsMessages.c
@@ -186,7 +186,12 @@ rtsFatalInternalErrorFn(const char *s, va_list ap)
#endif
#if defined(TRACING)
- if (RtsFlags.TraceFlags.tracing == TRACE_EVENTLOG) endEventLogging();
+ if (RtsFlags.TraceFlags.tracing == TRACE_EVENTLOG) {
+ // Use flushAllCapsEventsBufs rather than endEventLogging here since
+ // the latter insists on acquiring all capabilities to flush the eventlog;
+ // this would deadlock if we barfed during a GC.
+ flushAllCapsEventsBufs();
+ }
#endif
abort();