diff options
| author | Dan Gohman <gohman@apple.com> | 2010-05-06 02:06:20 +0000 |
|---|---|---|
| committer | Dan Gohman <gohman@apple.com> | 2010-05-06 02:06:20 +0000 |
| commit | d351116be0a02923e0b6fdf57bd0d52c669cede3 (patch) | |
| tree | e092b12340d944f60114e193198beee808db6420 /llvm/lib/Support/raw_ostream.cpp | |
| parent | 8fd7b510d6fc9760f6eddd1e0e85aab3373cf3a6 (diff) | |
| download | llvm-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.cpp | 35 |
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; } |
