[llvm-commits] [llvm] r75883 - /llvm/trunk/include/llvm/Support/FormattedStream.h
Daniel Dunbar
daniel at zuster.org
Wed Jul 15 21:06:15 PDT 2009
Minor comments you happened to get stuck with:
On Wed, Jul 15, 2009 at 6:32 PM, Dan Gohman<gohman at apple.com> wrote:
> Author: djg
> Date: Wed Jul 15 20:32:46 2009
> New Revision: 75883
>
> URL: http://llvm.org/viewvc/llvm-project?rev=75883&view=rev
> Log:
> formatted_raw_ostream both is-a raw_ostream and has-a raw_ostream. This
> means that two separate raw_ostreams are doing buffering before data is
> sent to the underlying stream. Besides the inefficiency of redundant
> buffering, the second level of buffering doesn't recieve flush()
> requests.
>
> Fix this by having formatted_raw_ostream set the underlying raw_ostream
> to be unbuffered. This eliminates inefficiency due to redundant buffering,
> and it makes the flush() disconnect harmless.
>
> This fixes PR4559.
>
> Modified:
> llvm/trunk/include/llvm/Support/FormattedStream.h
>
> Modified: llvm/trunk/include/llvm/Support/FormattedStream.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/FormattedStream.h?rev=75883&r1=75882&r2=75883&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/FormattedStream.h (original)
> +++ llvm/trunk/include/llvm/Support/FormattedStream.h Wed Jul 15 20:32:46 2009
> @@ -33,7 +33,8 @@
> 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 @@
> /// 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.
There is no filename argument.
> /// \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();
Can't this just call setStream?
> + }
> + explicit formatted_raw_ostream()
> : raw_ostream(), TheStream(0), DeleteStream(false), Column(0) {}
>
> ~formatted_raw_ostream() {
> @@ -87,6 +102,12 @@
> 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();
This routine should probably honor the existing Delete value, if it is
called multiple times?
- Daniel
More information about the llvm-commits
mailing list