summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2023-05-02 12:58:14 -0400
committerBen Gamari <ben@smart-cactus.org>2023-05-11 13:41:35 -0400
commite8d48f7b96f2efbdfc32960ca4100cd69c7d9a85 (patch)
tree7ab2fac5b8bf9636c4dfd6e428b80ab4f85dbda4
parent6db75bdbd422dab7fb41a01b0c4bb04e63532d86 (diff)
downloadhaskell-e8d48f7b96f2efbdfc32960ca4100cd69c7d9a85.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();