diff options
author | Ben Gamari <ben@smart-cactus.org> | 2023-05-02 12:58:14 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2023-05-11 13:41:35 -0400 |
commit | e8d48f7b96f2efbdfc32960ca4100cd69c7d9a85 (patch) | |
tree | 7ab2fac5b8bf9636c4dfd6e428b80ab4f85dbda4 | |
parent | 6db75bdbd422dab7fb41a01b0c4bb04e63532d86 (diff) | |
download | haskell-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.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(); |