dionisos@tigris.org wrote:
> http://subversion.tigris.org/issues/show_bug.cgi?id=1789
>
> ------- Additional comments from dionisos@tigris.org Thu Mar 15 15:56:14 -0700 2007 -------
> Created an attachment (id=629)
> Patch for Win32 to chunk large writes to console handles
>
>   
Erik,
attached is an updated version of your patch. I tested with a 400kb hunk
and that worked ok.
One thing I'm not sure of is on what error messages we'll have to check.
When I run the test the error is ERROR_NOT_ENOUGH_MEMORY, which is one
of the two error messages MSDN lists as possible outcome of WriteFile,
the other being ERROR_INVALID_USER_BUFFER. I don't know where you got
the error message from that you used in your patch? I didn't find more
details about those error messages, maybe we should just check for all
of the three?
Lieven
Index: subversion/libsvn_subr/io.c
===================================================================
--- subversion/libsvn_subr/io.c	(revision 23881)
+++ subversion/libsvn_subr/io.c	(working copy)
@@ -2,7 +2,7 @@
  * io.c:   shared file reading, writing, and probing code.
  *
  * ====================================================================
- * Copyright (c) 2000-2006 CollabNet.  All rights reserved.
+ * Copyright (c) 2000-2007 CollabNet.  All rights reserved.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
@@ -2700,8 +2700,29 @@
                        apr_size_t nbytes, apr_size_t *bytes_written,
                        apr_pool_t *pool)
 {
+  apr_status_t rv = apr_file_write_full(file, buf, nbytes, bytes_written);
+
+#ifdef WIN32
+#define MAXBUFSIZE 30*1024
+  if (rv == APR_FROM_OS_ERROR(ERROR_NOT_ENOUGH_MEMORY)
+      && nbytes > MAXBUFSIZE)
+    {
+      apr_size_t bw = 0;
+      *bytes_written = 0;
+
+      do {
+        rv = apr_file_write_full(file, buf,
+                                 nbytes > MAXBUFSIZE ? MAXBUFSIZE : nbytes, &bw);
+        *bytes_written += bw;
+        buf = (char *)buf + bw;
+        nbytes -= bw;
+      } while (rv == APR_SUCCESS && nbytes > 0);
+    }
+#undef MAXBUFSIZE
+#endif
+
   return do_io_file_wrapper_cleanup
-    (file, apr_file_write_full(file, buf, nbytes, bytes_written),
+    (file, rv,
      N_("Can't write to file '%s'"),
      N_("Can't write to stream"),
      pool);
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sat Mar 17 14:35:44 2007