aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Support/FormattedStream.h27
1 files changed, 24 insertions, 3 deletions
diff --git a/include/llvm/Support/FormattedStream.h b/include/llvm/Support/FormattedStream.h
index 9658979352..7260c3fba3 100644
--- a/include/llvm/Support/FormattedStream.h
+++ b/include/llvm/Support/FormattedStream.h
@@ -33,7 +33,8 @@ namespace llvm
const static bool PRESERVE_STREAM = false;
private:
- /// TheStream - The real stream we output to.
+ /// TheStream - The real stream we output to. We set it to be
+ /// unbuffered, since we're already doing our own buffering.
///
raw_ostream *TheStream;
/// DeleteStream - Do we need to delete TheStream in the
@@ -70,13 +71,27 @@ namespace llvm
/// put into ErrorInfo, and the stream should be immediately
/// destroyed; the string will be empty if no error occurred.
///
+ /// As a side effect, the given Stream is set to be Unbuffered.
+ /// This is because formatted_raw_ostream does its own buffering,
+ /// so it doesn't want another layer of buffering to be happening
+ /// underneath it.
+ ///
/// \param Filename - The file to open. If this is "-" then the
/// stream will use stdout instead.
/// \param Binary - The file should be opened in binary mode on
/// platforms that support this distinction.
formatted_raw_ostream(raw_ostream &Stream, bool Delete = false)
- : raw_ostream(), TheStream(&Stream), DeleteStream(Delete), Column(0) {}
- explicit formatted_raw_ostream()
+ : raw_ostream(), TheStream(&Stream), DeleteStream(Delete), Column(0) {
+ // This formatted_raw_ostream inherits from raw_ostream, so it'll do its
+ // own buffering, and it doesn't need or want TheStream to do another
+ // layer of buffering underneath. Resize the buffer to what TheStream
+ // had been using, and tell TheStream not to do its own buffering.
+ TheStream->flush();
+ if (size_t BufferSize = TheStream->GetNumBytesInBuffer())
+ SetBufferSize(BufferSize);
+ TheStream->SetUnbuffered();
+ }
+ explicit formatted_raw_ostream()
: raw_ostream(), TheStream(0), DeleteStream(false), Column(0) {}
~formatted_raw_ostream() {
@@ -87,6 +102,12 @@ namespace llvm
void setStream(raw_ostream &Stream, bool Delete = false) {
TheStream = &Stream;
DeleteStream = Delete;
+
+ // Avoid double-buffering, as above.
+ TheStream->flush();
+ if (size_t BufferSize = TheStream->GetNumBytesInBuffer())
+ SetBufferSize(BufferSize);
+ TheStream->SetUnbuffered();
}
/// PadToColumn - Align the output to some column number.