consolidated IOV_MAX/UIO_MAXIOV handling per GLib + legacy behaviour for osx/ios

This commit is contained in:
Jim Mason 2019-09-07 12:32:40 +01:00 committed by Tim-Philipp Müller
parent c2d10bd6c4
commit abeb5e677f

View file

@ -121,18 +121,23 @@ struct iovec
#define FDSINK_MAX_ALLOCA_SIZE (64 * 1024) /* 64k */ #define FDSINK_MAX_ALLOCA_SIZE (64 * 1024) /* 64k */
#define FDSINK_MAX_MALLOC_SIZE ( 8 * 1024 * 1024) /* 8M */ #define FDSINK_MAX_MALLOC_SIZE ( 8 * 1024 * 1024) /* 8M */
/* UIO_MAXIOV is documented in writev(2) on osx/ios, but <sys/uio.h> /* Adapted from GLib (gio/gioprivate.h)
*
* POSIX defines IOV_MAX/UIO_MAXIOV as the maximum number of iovecs that can
* be sent in one go. We define our own version of it here as there are two
* possible names, and also define a fall-back value if none of the constants
* are defined */
#if defined(IOV_MAX)
#define GST_IOV_MAX IOV_MAX
#elif defined(UIO_MAXIOV)
#define GST_IOV_MAX UIO_MAXIOV
#elif defined(__APPLE__)
/* For osx/ios, UIO_MAXIOV is documented in writev(2), but <sys/uio.h>
* only declares it if defined(KERNEL) */ * only declares it if defined(KERNEL) */
#ifndef UIO_MAXIOV #define GST_IOV_MAX 512
#define UIO_MAXIOV 512 #else
#endif /* 16 is the minimum value required by POSIX */
#define GST_IOV_MAX 16
/*
* POSIX writev(2) documents IOV_MAX as the max length of the iov array.
* If IOV_MAX is undefined, fall back to the legacy UIO_MAXIOV.
*/
#ifndef IOV_MAX
#define IOV_MAX UIO_MAXIOV
#endif #endif
static gssize static gssize
@ -141,7 +146,7 @@ gst_writev (gint fd, const struct iovec *iov, gint iovcnt, gsize total_bytes)
gssize written; gssize written;
#ifdef HAVE_SYS_UIO_H #ifdef HAVE_SYS_UIO_H
if (iovcnt <= IOV_MAX) { if (iovcnt <= GST_IOV_MAX) {
do { do {
written = writev (fd, iov, iovcnt); written = writev (fd, iov, iovcnt);
} while (written < 0 && errno == EINTR); } while (written < 0 && errno == EINTR);