Merge branch 'jc/max-io-size-and-ssize-max'
authorJunio C Hamano <gitster@pobox.com>
Wed, 25 Feb 2015 23:40:13 +0000 (15:40 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Feb 2015 23:40:13 +0000 (15:40 -0800)
Our default I/O size (8 MiB) for large files was too large for some
platforms with smaller SSIZE_MAX, leading to read(2)/write(2)
failures.

* jc/max-io-size-and-ssize-max:
xread/xwrite: clip MAX_IO_SIZE to SSIZE_MAX

1  2 
wrapper.c
diff --cc wrapper.c
index 007ec0d8eac529579cc00b14f9baaddb7ac68487,cfaf23d387b16ef2491abc0b41fa52d7c9cc009d..d5a6cef2be0fb13b262bed2e0b58bd58fbb5454d
+++ b/wrapper.c
@@@ -170,10 -133,24 +170,24 @@@ void *xcalloc(size_t nmemb, size_t size
  /*
   * Limit size of IO chunks, because huge chunks only cause pain.  OS X
   * 64-bit is buggy, returning EINVAL if len >= INT_MAX; and even in
 - * the absense of bugs, large chunks can result in bad latencies when
 + * the absence of bugs, large chunks can result in bad latencies when
   * you decide to kill the process.
+  *
+  * We pick 8 MiB as our default, but if the platform defines SSIZE_MAX
+  * that is smaller than that, clip it to SSIZE_MAX, as a call to
+  * read(2) or write(2) larger than that is allowed to fail.  As the last
+  * resort, we allow a port to pass via CFLAGS e.g. "-DMAX_IO_SIZE=value"
+  * to override this, if the definition of SSIZE_MAX given by the platform
+  * is broken.
   */
- #define MAX_IO_SIZE (8*1024*1024)
+ #ifndef MAX_IO_SIZE
+ # define MAX_IO_SIZE_DEFAULT (8*1024*1024)
+ # if defined(SSIZE_MAX) && (SSIZE_MAX < MAX_IO_SIZE_DEFAULT)
+ #  define MAX_IO_SIZE SSIZE_MAX
+ # else
+ #  define MAX_IO_SIZE MAX_IO_SIZE_DEFAULT
+ # endif
+ #endif
  
  /*
   * xread() is the same a read(), but it automatically restarts read()