aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Support/raw_ostream.cpp
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2010-05-06 02:06:20 +0000
committerDan Gohman <gohman@apple.com>2010-05-06 02:06:20 +0000
commitd351116be0a02923e0b6fdf57bd0d52c669cede3 (patch)
treee092b12340d944f60114e193198beee808db6420 /llvm/lib/Support/raw_ostream.cpp
parent8fd7b510d6fc9760f6eddd1e0e85aab3373cf3a6 (diff)
downloadllvm-d351116be0a02923e0b6fdf57bd0d52c669cede3.zip
llvm-d351116be0a02923e0b6fdf57bd0d52c669cede3.tar.gz
llvm-d351116be0a02923e0b6fdf57bd0d52c669cede3.tar.bz2
Handle the case where open(2) or close(2) is interrupted by a signal when
automatic syscall restarting is disabled. Also, fix the build on systems which don't define EWOULDBLOCK. llvm-svn: 103158
Diffstat (limited to 'llvm/lib/Support/raw_ostream.cpp')
-rw-r--r--llvm/lib/Support/raw_ostream.cpp35
1 files changed, 24 insertions, 11 deletions
diff --git a/llvm/lib/Support/raw_ostream.cpp b/llvm/lib/Support/raw_ostream.cpp
index ad47cb6..14c6a102 100644
--- a/llvm/lib/Support/raw_ostream.cpp
+++ b/llvm/lib/Support/raw_ostream.cpp
@@ -400,21 +400,27 @@ raw_fd_ostream::raw_fd_ostream(const char *Filename, std::string &ErrorInfo,
if (Flags & F_Excl)
OpenFlags |= O_EXCL;
- FD = open(Filename, OpenFlags, 0664);
- if (FD < 0) {
- ErrorInfo = "Error opening output file '" + std::string(Filename) + "'";
- ShouldClose = false;
- } else {
- ShouldClose = true;
+ while ((FD = open(Filename, OpenFlags, 0664)) < 0) {
+ if (errno != EINTR) {
+ ErrorInfo = "Error opening output file '" + std::string(Filename) + "'";
+ ShouldClose = false;
+ return;
+ }
}
+
+ // Ok, we successfully opened the file, so it'll need to be closed.
+ ShouldClose = true;
}
raw_fd_ostream::~raw_fd_ostream() {
if (FD < 0) return;
flush();
if (ShouldClose)
- if (::close(FD) != 0)
- error_detected();
+ while (::close(FD) != 0)
+ if (errno != EINTR) {
+ error_detected();
+ break;
+ }
}
@@ -432,7 +438,11 @@ void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {
// some programs, such as bjam, assume that their child processes
// will treat them as if they are. If you don't want this code to
// spin, don't use O_NONBLOCK file descriptors with raw_ostream.
- if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)
+ if (errno == EINTR || errno == EAGAIN
+#ifdef EWOULDBLOCK
+ || errno == EWOULDBLOCK
+#endif
+ )
continue;
// Otherwise it's a non-recoverable error. Note it and quit.
@@ -452,8 +462,11 @@ void raw_fd_ostream::close() {
assert(ShouldClose);
ShouldClose = false;
flush();
- if (::close(FD) != 0)
- error_detected();
+ while (::close(FD) != 0)
+ if (errno != EINTR) {
+ error_detected();
+ break;
+ }
FD = -1;
}