diff src/w32.c @ 108749:48378bcd6c35

Fix bug #6237. w32.c (sys_write): Break writes into chunks smaller than 32MB.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 22 May 2010 22:09:51 +0300
parents e30aff0bf9d5
children e27859da5624
line wrap: on
line diff
--- a/src/w32.c	Sat May 22 10:39:35 2010 -0700
+++ b/src/w32.c	Sat May 22 22:09:51 2010 +0300
@@ -5700,7 +5700,34 @@
     }
   else
 #endif
-    nchars = _write (fd, buffer, count);
+    {
+      /* Some networked filesystems don't like too large writes, so
+	 break them into smaller chunks.  See the Comments section of
+	 the MSDN documentation of WriteFile for details behind the
+	 choice of the value of CHUNK below.  See also the thread
+	 http://thread.gmane.org/gmane.comp.version-control.git/145294
+	 in the git mailing list.  */
+      const unsigned char *p = buffer;
+      const unsigned chunk = 30 * 1024 * 1024;
+
+      nchars = 0;
+      while (count > 0)
+	{
+	  unsigned this_chunk = count < chunk ? count : chunk;
+	  int n = _write (fd, p, this_chunk);
+
+	  nchars += n;
+	  if (n < 0)
+	    {
+	      nchars = n;
+	      break;
+	    }
+	  else if (n < this_chunk)
+	    break;
+	  count -= n;
+	  p += n;
+	}
+    }
 
   return nchars;
 }