|
19 | 19 | #include "llvm/Config/llvm-config.h" // for LLVM_ENABLE_THREADS
|
20 | 20 | #include "llvm/Support/Debug.h"
|
21 | 21 | #include "llvm/Support/Errc.h"
|
| 22 | +#include "llvm/Support/Errno.h" |
22 | 23 | #include "llvm/Support/Error.h"
|
23 | 24 | #include "llvm/Support/Process.h"
|
24 | 25 | #include "llvm/Support/Signals.h"
|
@@ -62,6 +63,17 @@ static std::mutex ErrorHandlerMutex;
|
62 | 63 | static std::mutex BadAllocErrorHandlerMutex;
|
63 | 64 | #endif
|
64 | 65 |
|
| 66 | +static bool write_retry(int fd, const char *buf, size_t count) { |
| 67 | + while (count > 0) { |
| 68 | + ssize_t written = sys::RetryAfterSignal(-1, ::write, fd, buf, count); |
| 69 | + if (written <= 0) |
| 70 | + return false; |
| 71 | + buf += written; |
| 72 | + count -= written; |
| 73 | + } |
| 74 | + return true; |
| 75 | +} |
| 76 | + |
65 | 77 | void llvm::install_fatal_error_handler(fatal_error_handler_t handler,
|
66 | 78 | void *user_data) {
|
67 | 79 | #if LLVM_ENABLE_THREADS == 1
|
@@ -111,8 +123,7 @@ void llvm::report_fatal_error(const Twine &Reason, bool GenCrashDiag) {
|
111 | 123 | raw_svector_ostream OS(Buffer);
|
112 | 124 | OS << "LLVM ERROR: " << Reason << "\n";
|
113 | 125 | StringRef MessageStr = OS.str();
|
114 |
| - ssize_t written = ::write(2, MessageStr.data(), MessageStr.size()); |
115 |
| - (void)written; // If something went wrong, we deliberately just give up. |
| 126 | + write_retry(2, MessageStr.data(), MessageStr.size()); |
116 | 127 | }
|
117 | 128 |
|
118 | 129 | // If we reached here, we are failing ungracefully. Run the interrupt handlers
|
@@ -190,9 +201,9 @@ void llvm::report_bad_alloc_error(const char *Reason, bool GenCrashDiag) {
|
190 | 201 | // an OOM to stderr and abort.
|
191 | 202 | const char *OOMMessage = "LLVM ERROR: out of memory\n";
|
192 | 203 | const char *Newline = "\n";
|
193 |
| - (void)!::write(2, OOMMessage, strlen(OOMMessage)); |
194 |
| - (void)!::write(2, Reason, strlen(Reason)); |
195 |
| - (void)!::write(2, Newline, strlen(Newline)); |
| 204 | + write_retry(2, OOMMessage, strlen(OOMMessage)); |
| 205 | + write_retry(2, Reason, strlen(Reason)); |
| 206 | + write_retry(2, Newline, strlen(Newline)); |
196 | 207 | abort();
|
197 | 208 | #endif
|
198 | 209 | }
|
|
0 commit comments