From 43d1f02b547b146d81abeb0ed0f88628f0fdc7dc Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Thu, 23 Oct 2008 23:49:09 +0000 Subject: [PATCH] Added raw_fd_ostream::close(). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58052 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/raw_ostream.h | 3 +++ lib/Support/raw_ostream.cpp | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/include/llvm/Support/raw_ostream.h b/include/llvm/Support/raw_ostream.h index af53477cea3..9b307dbf956 100644 --- a/include/llvm/Support/raw_ostream.h +++ b/include/llvm/Support/raw_ostream.h @@ -168,6 +168,9 @@ public: /// subclasses. This outputs the currently buffered data and resets the /// buffer to empty. virtual void flush_impl(); + + /// close - Manually flush the stream and close the file. + void close(); }; /// raw_stdout_ostream - This is a stream that always prints to stdout. diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp index f3a53a50617..a4c293660b0 100644 --- a/lib/Support/raw_ostream.cpp +++ b/lib/Support/raw_ostream.cpp @@ -220,17 +220,28 @@ raw_fd_ostream::raw_fd_ostream(const char *Filename, std::string &ErrorInfo) { } raw_fd_ostream::~raw_fd_ostream() { - flush(); - if (ShouldClose) - close(FD); + if (FD >= 0) { + flush(); + if (ShouldClose) + ::close(FD); + } } void raw_fd_ostream::flush_impl() { + assert (FD >= 0 && "File already closed."); if (OutBufCur-OutBufStart) ::write(FD, OutBufStart, OutBufCur-OutBufStart); HandleFlush(); } +void raw_fd_ostream::close() { + assert (ShouldClose); + ShouldClose = false; + flush(); + ::close(FD); + FD = -1; +} + //===----------------------------------------------------------------------===// // raw_stdout/err_ostream //===----------------------------------------------------------------------===//