Merge branch 'jk/pipe-command-nonblock' into maint
Fix deadlocks between main Git process and subprocess spawned via the pipe_command() API, that can kill "git add -p" that was reimplemented in C recently. * jk/pipe-command-nonblock: pipe_command(): mark stdin descriptor as non-blocking pipe_command(): handle ENOSPC when writing to a pipe pipe_command(): avoid xwrite() for writing to pipe git-compat-util: make MAX_IO_SIZE define globally available nonblock: support Windows compat: add function to enable nonblocking pipes
This commit is contained in:
@ -998,6 +998,28 @@ static inline unsigned long cast_size_t_to_ulong(size_t a)
|
||||
return (unsigned long)a;
|
||||
}
|
||||
|
||||
/*
|
||||
* 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 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.
|
||||
*/
|
||||
#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
|
||||
|
||||
#ifdef HAVE_ALLOCA_H
|
||||
# include <alloca.h>
|
||||
# define xalloca(size) (alloca(size))
|
||||
|
Reference in New Issue
Block a user