Have raw_fd_ostream keep track of the position in the file to make tell() go faster...
authorTed Kremenek <kremenek@apple.com>
Thu, 4 Dec 2008 22:51:11 +0000 (22:51 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 4 Dec 2008 22:51:11 +0000 (22:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60560 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/raw_ostream.h
lib/Support/raw_ostream.cpp

index 2b4b17d7b29792000d47e7be7f2dba4b15770109..1a4f6bf6f47174a5e02e58bec9fb28ec8b82d36a 100644 (file)
@@ -151,6 +151,7 @@ private:
 class raw_fd_ostream : public raw_ostream {
   int FD;
   bool ShouldClose;
+  uint64_t pos;
 public:
   /// raw_fd_ostream - Open the specified file for writing. If an
   /// error occurs, information about the error is put into ErrorInfo,
@@ -178,7 +179,9 @@ public:
   void close();
   
   /// tell - Return the current offset with the file.
-  uint64_t tell();
+  uint64_t tell() {
+    return pos + (OutBufCur - OutBufStart);
+  }  
 };
   
 /// raw_stdout_ostream - This is a stream that always prints to stdout.
index b10677e3f271d66342df47118f7f61deb1094995..96c9a3a263d025e15cb634622293f3e1b9f739f2 100644 (file)
@@ -202,7 +202,7 @@ void format_object_base::home() {
 /// stream should be immediately destroyed; the string will be empty
 /// if no error occurred.
 raw_fd_ostream::raw_fd_ostream(const char *Filename, bool Binary,
-                               std::string &ErrorInfo) {
+                               std::string &ErrorInfo) : pos(0) {
   ErrorInfo.clear();
 
   // Handle "-" as stdout.
@@ -240,8 +240,10 @@ raw_fd_ostream::~raw_fd_ostream() {
 
 void raw_fd_ostream::flush_impl() {
   assert (FD >= 0 && "File already closed.");
-  if (OutBufCur-OutBufStart)
+  if (OutBufCur-OutBufStart) {
+    pos += (OutBufCur - OutBufStart);
     ::write(FD, OutBufStart, OutBufCur-OutBufStart);
+  }
   HandleFlush();
 }
 
@@ -253,14 +255,6 @@ void raw_fd_ostream::close() {
   FD = -1;
 }
 
-uint64_t raw_fd_ostream::tell() {
-  // We have to take into account the bytes waiting in the buffer.  For now
-  // we do the easy thing and just flush the buffer before getting the
-  // current file offset.
-  flush();  
-  return (uint64_t) lseek(FD, 0, SEEK_CUR);
-}
-
 //===----------------------------------------------------------------------===//
 //  raw_stdout/err_ostream
 //===----------------------------------------------------------------------===//