From: Junio C Hamano Date: Wed, 25 Feb 2015 23:40:13 +0000 (-0800) Subject: Merge branch 'jc/max-io-size-and-ssize-max' X-Git-Tag: v2.4.0-rc0~89 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/81a535da88617e2ae24b79a9d7413008e0ebc23b Merge branch 'jc/max-io-size-and-ssize-max' 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 --- 81a535da88617e2ae24b79a9d7413008e0ebc23b diff --cc wrapper.c index 007ec0d8ea,cfaf23d387..d5a6cef2be --- a/wrapper.c +++ 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()