Skip to content

Commit

Permalink
Merge branch 'jc/max-io-size-and-ssize-max'
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Junio C Hamano committed Feb 25, 2015
2 parents 90eea88 + a983e6a commit 81a535d
Showing 1 changed file with 15 additions and 1 deletion.
16 changes: 15 additions & 1 deletion wrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,8 +172,22 @@ void *xcalloc(size_t nmemb, size_t size)
* 64-bit is buggy, returning EINVAL if len >= INT_MAX; and even in
* 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()
Expand Down

0 comments on commit 81a535d

Please sign in to comment.