diff options
author | Ben Gamari <bgamari.foss@gmail.com> | 2015-11-01 19:06:09 +0100 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2015-11-01 19:34:50 +0100 |
commit | f46f32b922d7ecbee2829937295521f5db1d7997 (patch) | |
tree | ad0355dcd4d77f3a4bb69f1c5b22d97b21b3714b /rts/eventlog | |
parent | 65f3c4c0a1304b8d00b46dc0e77ad93fc566ffb1 (diff) | |
download | haskell-f46f32b922d7ecbee2829937295521f5db1d7997.tar.gz |
EventLog: Loop fwrite if necessary during flush
Previously the eventlog flush code would fail if `fwrite` wrote less
than the requested amount. Like all Unix stream I/O operations, however,
`fwrite` isn't guaranteed to write the entire buffer. Here we loop as
long as `fwrite` succeeds in writing anything.
Fixes #11041.
Test Plan: Validate with eventlog
Reviewers: austin, simonmar
Reviewed By: simonmar
Subscribers: thomie
Differential Revision: https://phabricator.haskell.org/D1415
GHC Trac Issues: #11041
Diffstat (limited to 'rts/eventlog')
-rw-r--r-- | rts/eventlog/EventLog.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/rts/eventlog/EventLog.c b/rts/eventlog/EventLog.c index 2153942648..db103a7f3c 100644 --- a/rts/eventlog/EventLog.c +++ b/rts/eventlog/EventLog.c @@ -1100,20 +1100,22 @@ void postBlockMarker (EventsBuf *eb) void printAndClearEventBuf (EventsBuf *ebuf) { - StgWord64 numBytes = 0, written = 0; - closeBlockMarker(ebuf); if (ebuf->begin != NULL && ebuf->pos != ebuf->begin) { - numBytes = ebuf->pos - ebuf->begin; - - written = fwrite(ebuf->begin, 1, numBytes, event_log_file); - if (written != numBytes) { - debugBelch( - "printAndClearEventLog: fwrite() failed, written=%" FMT_Word64 - " doesn't match numBytes=%" FMT_Word64, written, numBytes); - return; + StgInt8 *begin = ebuf->begin; + while (begin < ebuf->pos) { + StgWord64 remain = ebuf->pos - begin; + StgWord64 written = fwrite(begin, 1, remain, event_log_file); + if (written == 0) { + debugBelch( + "printAndClearEventLog: fwrite() failed to write anything;" + " tried to write numBytes=%" FMT_Word64, remain); + resetEventsBuf(ebuf); + return; + } + begin += written; } resetEventsBuf(ebuf); |