diff options
author | Chris Lattner <sabre@nondot.org> | 2010-08-17 23:11:56 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-08-17 23:11:56 +0000 |
commit | ce3b2c3f77a2ba64439e30cd11828aef4ec87c31 (patch) | |
tree | 8b6df7fa923e654a96c6b6d4b31c0138bec4ea57 /llvm | |
parent | 6217082dc3227a6cca70a5e038a6d682b2e87c5b (diff) | |
download | bcm5719-llvm-ce3b2c3f77a2ba64439e30cd11828aef4ec87c31.tar.gz bcm5719-llvm-ce3b2c3f77a2ba64439e30cd11828aef4ec87c31.zip |
Fix the rest of rdar://8318441 which happens when a raw_fd_ostream
(e.g. errs()) fails in close() due to (e.g.) a broken pipe. As
previously written, the had_error() flag would get set and then
the raw_ostream dtor would report a fatal error. There is nothing
the client can do about this and we have no way to report the error,
so just eat it.
llvm-svn: 111321
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Support/raw_ostream.cpp | 42 |
1 files changed, 23 insertions, 19 deletions
diff --git a/llvm/lib/Support/raw_ostream.cpp b/llvm/lib/Support/raw_ostream.cpp index ac118a91a3f..76c83d16ac8 100644 --- a/llvm/lib/Support/raw_ostream.cpp +++ b/llvm/lib/Support/raw_ostream.cpp @@ -415,15 +415,31 @@ raw_fd_ostream::raw_fd_ostream(const char *Filename, std::string &ErrorInfo, raw_fd_ostream::~raw_fd_ostream() { if (FD < 0) return; - flush(); - if (ShouldClose) - while (::close(FD) != 0) - if (errno != EINTR) { - error_detected(); - break; - } + if (!ShouldClose) { + flush(); + return; + } + + bool HadError = has_error(); + close(); + + // If we had a failure closing the stream, there is no way for the client to + // handle it, just eat the failure. + if (!HadError && has_error()) + clear_error(); } +void raw_fd_ostream::close() { + assert(ShouldClose); + ShouldClose = false; + flush(); + while (::close(FD) != 0) + if (errno != EINTR) { + error_detected(); + break; + } + FD = -1; +} void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) { assert(FD >= 0 && "File already closed."); @@ -461,18 +477,6 @@ void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) { } while (Size > 0); } -void raw_fd_ostream::close() { - assert(ShouldClose); - ShouldClose = false; - flush(); - while (::close(FD) != 0) - if (errno != EINTR) { - error_detected(); - break; - } - FD = -1; -} - uint64_t raw_fd_ostream::seek(uint64_t off) { flush(); pos = ::lseek(FD, off, SEEK_SET); |