[PATCH] D15553: PR25717: fatal IO error writing large outputs to console on Windows
Yunzhong Gao via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 17 15:03:24 PST 2015
ygao updated this revision to Diff 43188.
ygao marked 2 inline comments as done.
ygao added a comment.
Ok, this does make my codes simpler. I have a question: the IsWindows8OrGreater() API comes from VersionHelpers.h, which is part of Visual Studio 2013. Will this change cause problems for, say, mingw or cygwin builds (I am not sure whether we support them)?
http://reviews.llvm.org/D15553
Files:
lib/Support/raw_ostream.cpp
Index: lib/Support/raw_ostream.cpp
===================================================================
--- lib/Support/raw_ostream.cpp
+++ lib/Support/raw_ostream.cpp
@@ -57,6 +57,12 @@
#endif
#endif
+#ifdef LLVM_ON_WIN32
+#define NOMINMAX
+#include "Windows/WindowsSupport.h"
+#include <VersionHelpers.h>
+#endif
+
using namespace llvm;
raw_ostream::~raw_ostream() {
@@ -567,8 +573,21 @@
assert(FD >= 0 && "File already closed.");
pos += Size;
+#ifndef LLVM_ON_WIN32
+ bool ShouldWriteInChunks = false;
+#else
+ // Writing a large size of output to Windows console returns ENOMEM. It seems
+ // that, prior to Windows 8, WriteFile() is redirecting to WriteConsole(), and
+ // the latter has a size limit (66000 bytes or less, depending on heap usage).
+ bool ShouldWriteInChunks = !!::_isatty(FD) && !IsWindows8OrGreater();
+#endif
+
do {
- ssize_t ret = ::write(FD, Ptr, Size);
+ size_t ChunkSize = Size;
+ if (ChunkSize > 32767 && ShouldWriteInChunks)
+ ChunkSize = 32767;
+
+ ssize_t ret = ::write(FD, Ptr, ChunkSize);
if (ret < 0) {
// If it's a recoverable error, swallow it and retry the write.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D15553.43188.patch
Type: text/x-patch
Size: 1159 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151217/11c82fac/attachment.bin>
More information about the llvm-commits
mailing list