xread/xwrite: clip MAX_IO_SIZE to SSIZE_MAX
Since 0b6806b9
(xread, xwrite: limit size of IO to 8MB, 2013-08-20),
we chomp our calls to read(2) and write(2) into chunks of
MAX_IO_SIZE bytes (8 MiB), because a large IO results in a bad
latency when the program needs to be killed. This also brought our
IO below SSIZE_MAX, which is a limit POSIX allows read(2) and
write(2) to fail when the IO size exceeds it, for OS X, where a
problem was originally reported.
However, there are other systems that define SSIZE_MAX smaller than
our default, and feeding 8 MiB to underlying read(2)/write(2) would
fail. Make sure we clip our calls to the lower limit as well.
Reported-by: Joachim Schmitz <jojo@schmitz-digital.de>
Helped-by: Torsten Bögershausen <tboegi@web.de>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
0b6806b9e4
commit
a983e6ac58
16
wrapper.c
16
wrapper.c
@ -135,8 +135,22 @@ void *xcalloc(size_t nmemb, size_t size)
|
||||
* 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
|
||||
* 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()
|
||||
|
Loading…
Reference in New Issue
Block a user