diff options
author | Ben Gamari <ben@smart-cactus.org> | 2020-04-11 15:54:17 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2020-11-21 14:12:45 -0500 |
commit | a5b6b9842cc6353dbcf520c3774527be10273096 (patch) | |
tree | 05eca2feae0d088ad4186be592efe7132fcf0546 /rts/eventlog/EventLog.c | |
parent | 69bfbc216c2278c9796aa999c7815c19c12b0f2c (diff) | |
download | haskell-wip/T18043.tar.gz |
rts: Flush eventlog buffers from flushEventLogwip/T18043
As noted in #18043, flushTrace failed flush anything beyond the writer.
This means that a significant amount of data sitting in capability-local
event buffers may never get flushed, despite the users' pleads for us to
flush.
Fix this by making flushEventLog flush all of the event buffers before
flushing the writer.
Fixes #18043.
Diffstat (limited to 'rts/eventlog/EventLog.c')
-rw-r--r-- | rts/eventlog/EventLog.c | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/rts/eventlog/EventLog.c b/rts/eventlog/EventLog.c index 11e8a5e0b6..bce2fa493f 100644 --- a/rts/eventlog/EventLog.c +++ b/rts/eventlog/EventLog.c @@ -16,6 +16,7 @@ #include "RtsUtils.h" #include "Stats.h" #include "EventLog.h" +#include "Schedule.h" #include <string.h> #include <stdio.h> @@ -270,8 +271,8 @@ stopEventLogWriter(void) } } -void -flushEventLog(void) +static void +flushEventLogWriter(void) { if (event_log_writer != NULL && event_log_writer->flushEventLog != NULL) { @@ -1484,7 +1485,7 @@ void printAndClearEventBuf (EventsBuf *ebuf) "printAndClearEventLog: could not flush event log\n" ); resetEventsBuf(ebuf); - flushEventLog(); + flushEventLogWriter(); return; } @@ -1566,6 +1567,40 @@ void postEventType(EventsBuf *eb, EventType *et) postInt32(eb, EVENT_ET_END); } +void flushLocalEventsBuf(Capability *cap) +{ + EventsBuf *eb = &capEventBuf[cap->no]; + printAndClearEventBuf(eb); +} + +// Flush all capabilities' event buffers when we already hold all capabilities. +// Used during forkProcess. +void flushAllCapsEventsBufs() +{ + ACQUIRE_LOCK(&eventBufMutex); + printAndClearEventBuf(&eventBuf); + RELEASE_LOCK(&eventBufMutex); + + for (unsigned int i=0; i < n_capabilities; i++) { + flushLocalEventsBuf(capabilities[i]); + } + flushEventLogWriter(); +} + +void flushEventLog(Capability **cap USED_IF_THREADS) +{ + ACQUIRE_LOCK(&eventBufMutex); + printAndClearEventBuf(&eventBuf); + RELEASE_LOCK(&eventBufMutex); + +#if defined(THREADED_RTS) + Task *task = getMyTask(); + stopAllCapabilitiesWith(cap, task, SYNC_FLUSH_EVENT_LOG); + releaseAllCapabilities(n_capabilities, cap ? *cap : NULL, task); +#endif + flushEventLogWriter(); +} + #else enum EventLogStatus eventLogStatus(void) @@ -1579,4 +1614,6 @@ bool startEventLogging(const EventLogWriter *writer STG_UNUSED) { void endEventLogging(void) {} +void flushEventLog(Capability **cap STG_UNUSED) {} + #endif /* TRACING */ |