<div class="gmail_quote">On Wed, May 5, 2010 at 10:55 AM, Dan Gohman <span dir="ltr"><<a href="mailto:gohman@apple.com">gohman@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><div></div><div class="h5"><br>
On May 5, 2010, at 8:17 AM, Benjamin Kramer wrote:<br>
<br>
> Author: d0k<br>
> Date: Wed May  5 10:17:47 2010<br>
> New Revision: 103085<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=103085&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=103085&view=rev</a><br>
> Log:<br>
> Try again if write(2) reports an recoverable error.<br>
><br>
> This should fix mysteriously crashing boost regression tests when stderr is<br>
> managed by bjam (PR7043).<br>
><br>
> Modified:<br>
>    llvm/trunk/lib/Support/raw_ostream.cpp<br>
><br>
> Modified: llvm/trunk/lib/Support/raw_ostream.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/raw_ostream.cpp?rev=103085&r1=103084&r2=103085&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/raw_ostream.cpp?rev=103085&r1=103084&r2=103085&view=diff</a><br>

> ==============================================================================<br>
> --- llvm/trunk/lib/Support/raw_ostream.cpp (original)<br>
> +++ llvm/trunk/lib/Support/raw_ostream.cpp Wed May  5 10:17:47 2010<br>
> @@ -21,6 +21,7 @@<br>
> #include "llvm/Support/ErrorHandling.h"<br>
> #include "llvm/ADT/STLExtras.h"<br>
> #include <cctype><br>
> +#include <cerrno><br>
> #include <sys/stat.h><br>
> #include <sys/types.h><br>
><br>
> @@ -420,7 +421,11 @@<br>
> void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {<br>
>   assert(FD >= 0 && "File already closed.");<br>
>   pos += Size;<br>
> -  if (::write(FD, Ptr, Size) != (ssize_t) Size)<br>
> +  ssize_t ret;<br>
> +  do {<br>
> +    ret = ::write(FD, Ptr, Size);<br>
> +  } while (ret < 0 && (errno == EAGAIN || errno == EINTR));<br>
<br>
</div></div>Is EAGAIN really a recoverable error? According to the documentation I<br>
have, EAGAIN is only used for non-blocking I/O (O_NONBLOCK), so<br>
immediately retrying the write in that case is likely to send the process<br>
into a spin. raw_ostream isn't really designed to be used with non-blocking<br>
I/O, so it seems better to just fail.<br></blockquote><div><br></div><div>It seems plausible that a shell or other process attaches a non-blocking file descriptor to stderr, so spinning (with some amount of yielding) seems reasonable in the face of EAGAIN.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">EINTR is recoverable, but it's not the only way that write can fail<br>
when interrupted.  Another possibility is that the write could be interrupted<br>
after some bytes have already been written, in which case it'll return<br>
a positive value less than Size to indicate the number of bytes written.<br>
<font color="#888888"><br>
Dan<br>
</font><div><div></div><div class="h5"><br>
> +  if (ret != (ssize_t) Size)<br>
>     error_detected();<br>
> }<br>
><br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br>