diff options
author | Ben Gamari <ben@smart-cactus.org> | 2023-05-02 12:58:14 -0400 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2023-05-15 18:02:20 -0400 |
commit | a5f5f067377d43867aee07e5696c59cff46436fd (patch) | |
tree | 3f637d31ebfc31d9245e843c387a68fcc8033529 /rts/RtsMessages.c | |
parent | c343112fb6cb937fdf5a3a279e5fc1cf41bd1b8f (diff) | |
download | haskell-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.
Diffstat (limited to 'rts/RtsMessages.c')
-rw-r--r-- | rts/RtsMessages.c | 7 |
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(); |