[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