[llvm-commits] [llvm] r78923 - in /llvm/trunk: include/llvm/Support/raw_ostream.h lib/Support/raw_ostream.cpp

Daniel Dunbar daniel at zuster.org
Thu Aug 13 10:48:04 PDT 2009


Is this actually a win somewhere? One downside is this introduces a
syscall for raw_string_ostream, for example. Should those change to
still use a predefined buffer size?

 - Daniel

On Thu, Aug 13, 2009 at 10:27 AM, Dan Gohman<gohman at apple.com> wrote:
> Author: djg
> Date: Thu Aug 13 12:27:29 2009
> New Revision: 78923
>
> URL: http://llvm.org/viewvc/llvm-project?rev=78923&view=rev
> Log:
> Add support to raw_ostream for sizing the buffer according to the
> needs of the underlying output mechanism. raw_fd_ostream now uses
> st_blksize from fstat to determine a buffer size.
>
> Modified:
>    llvm/trunk/include/llvm/Support/raw_ostream.h
>    llvm/trunk/lib/Support/raw_ostream.cpp
>
> Modified: llvm/trunk/include/llvm/Support/raw_ostream.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/raw_ostream.h?rev=78923&r1=78922&r2=78923&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/raw_ostream.h (original)
> +++ llvm/trunk/include/llvm/Support/raw_ostream.h Thu Aug 13 12:27:29 2009
> @@ -96,16 +96,26 @@
>   // Configuration Interface
>   //===--------------------------------------------------------------------===//
>
> -  /// SetBufferSize - Set the internal buffer size to the specified amount
> -  /// instead of the default.
> -  void SetBufferSize(size_t Size=4096);
> +  /// SetBuffered - Set the stream to be buffered, with an automatically
> +  /// determined buffer size.
> +  void SetBuffered();
> +
> +  /// SetBufferrSize - Set the stream to be buffered, using the
> +  /// specified buffer size.
> +  void SetBufferSize(size_t Size);
> +
> +  size_t GetBufferSize() {
> +    // If we're supposed to be buffered but haven't actually gotten around
> +    // to allocating the buffer yet, return the value that would be used.
> +    if (!Unbuffered && !OutBufStart)
> +      return preferred_buffer_size();
>
> -  size_t GetBufferSize() const {
> +    // Otherwise just return the size of the allocated buffer.
>     return OutBufEnd - OutBufStart;
>   }
>
> -  /// SetUnbuffered - Set the streams buffering status. When
> -  /// unbuffered the stream will flush after every write. This routine
> +  /// SetUnbuffered - Set the stream to be unbuffered. When
> +  /// unbuffered, the stream will flush after every write. This routine
>   /// will also flush the buffer immediately when the stream is being
>   /// set to unbuffered.
>   void SetUnbuffered();
> @@ -233,6 +243,10 @@
>   virtual uint64_t current_pos() = 0;
>
>  protected:
> +  /// preferred_buffer_size - Return an efficient buffer size for the
> +  /// underlying output mechanism.
> +  virtual size_t preferred_buffer_size();
> +
>   /// error_detected - Set the flag indicating that an output error has
>   /// been encountered.
>   void error_detected() { Error = true; }
> @@ -273,6 +287,9 @@
>   /// counting the bytes currently in the buffer.
>   virtual uint64_t current_pos() { return pos; }
>
> +  /// preferred_buffer_size - Determine an efficient buffer size.
> +  virtual size_t preferred_buffer_size();
> +
>  public:
>   /// raw_fd_ostream - Open the specified file for writing. If an
>   /// error occurs, information about the error is put into ErrorInfo,
>
> Modified: llvm/trunk/lib/Support/raw_ostream.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/raw_ostream.cpp?rev=78923&r1=78922&r2=78923&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/raw_ostream.cpp (original)
> +++ llvm/trunk/lib/Support/raw_ostream.cpp Thu Aug 13 12:27:29 2009
> @@ -20,6 +20,8 @@
>  #include "llvm/Support/Compiler.h"
>  #include "llvm/Support/ErrorHandling.h"
>  #include <ostream>
> +#include <sys/stat.h>
> +#include <sys/types.h>
>
>  #if defined(HAVE_UNISTD_H)
>  # include <unistd.h>
> @@ -63,6 +65,16 @@
>  // An out of line virtual method to provide a home for the class vtable.
>  void raw_ostream::handle() {}
>
> +size_t raw_ostream::preferred_buffer_size() {
> +  // BUFSIZ is intended to be a reasonable default.
> +  return BUFSIZ;
> +}
> +
> +void raw_ostream::SetBuffered() {
> +  // Ask the subclass to determine an appropriate buffer size.
> +  SetBufferSize(preferred_buffer_size());
> +}
> +
>  void raw_ostream::SetBufferSize(size_t Size) {
>   assert(Size >= 64 &&
>          "Buffer size must be somewhat large for invariants to hold");
> @@ -172,7 +184,7 @@
>     }
>
>     if (!OutBufStart)
> -      SetBufferSize();
> +      SetBuffered();
>     else
>       flush_nonempty();
>   }
> @@ -190,7 +202,7 @@
>         return *this;
>       }
>       // Set up a buffer and start over.
> -      SetBufferSize();
> +      SetBuffered();
>       return write(Ptr, Size);
>     }
>     // Write out the data in buffer-sized blocks until the remainder
> @@ -353,6 +365,17 @@
>   return pos;
>  }
>
> +size_t raw_fd_ostream::preferred_buffer_size() {
> +#if !defined(_MSC_VER) // Windows reportedly doesn't have st_blksize.
> +  assert(FD >= 0 && "File not yet open!");
> +  struct stat statbuf;
> +  if (fstat(FD, &statbuf) == 0)
> +    return statbuf.st_blksize;
> +  error_detected();
> +#endif
> +  return raw_ostream::preferred_buffer_size();
> +}
> +
>  raw_ostream &raw_fd_ostream::changeColor(enum Colors colors, bool bold,
>                                          bool bg) {
>   if (sys::Process::ColorNeedsFlush())
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>




More information about the llvm-commits mailing list