summaryrefslogtreecommitdiff
path: root/erts/emulator/drivers
diff options
context:
space:
mode:
authorRickard Green <rickard@erlang.org>2020-10-28 16:38:17 +0100
committerRickard Green <rickard@erlang.org>2020-10-28 16:38:17 +0100
commitaebed0a6086f31c7875fe528afe50aea41a29bb4 (patch)
tree749f74e24eaf53ab4d9bce85ca7facec272a867e /erts/emulator/drivers
parent84e4641fc151d6ab3599a7d487ae3cc11423f631 (diff)
parenta5f677ef3a7b906b2c60a33b025994198c092222 (diff)
downloaderlang-aebed0a6086f31c7875fe528afe50aea41a29bb4.tar.gz
Merge branch 'maint'
* maint: Look up IOV_MAX instead of assuming 16
Diffstat (limited to 'erts/emulator/drivers')
-rw-r--r--erts/emulator/drivers/common/inet_drv.c33
1 files changed, 30 insertions, 3 deletions
diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c
index 00cf260d7b..efb9cbdb77 100644
--- a/erts/emulator/drivers/common/inet_drv.c
+++ b/erts/emulator/drivers/common/inet_drv.c
@@ -1155,9 +1155,24 @@ typedef struct {
#define TCP_MAX_PACKET_SIZE 0x4000000 /* 64 M */
-#define MAX_VSIZE 16 /* Max number of entries allowed in an I/O
- * vector sock_sendv().
- */
+/* Max number of entries allowed in an I/O vector sock_sendv(). */
+#if defined(__WIN32__)
+/*
+ * Windows 95, 98, and ME is limited to 16, but we do not
+ * support those. Documentation unfortunately does not say
+ * anything about newer windows, so we guess 1024 which
+ * seems to be what most systems use...
+ */
+#define MAX_VSIZE 1024
+#elif !defined(NO_SYSCONF)
+static int iov_max;
+#define MAX_VSIZE iov_max
+#elif defined(IOV_MAX)
+#define MAX_VSIZE IOV_MAX
+#else
+/* POSIX require at least 16 */
+#define MAX_VSIZE 16
+#endif
static int tcp_inet_init(void);
static void tcp_inet_stop(ErlDrvData);
@@ -4127,6 +4142,18 @@ static int inet_init()
if (!sock_init())
goto error;
+#if !defined(__WIN32__) && !defined(NO_SYSCONF)
+ iov_max = (int) sysconf(_SC_IOV_MAX);
+ if (iov_max < 0) {
+#ifdef IOV_MAX
+ iov_max = IOV_MAX;
+#else
+ iov_max = 16; /* min value required by POSIX */
+#endif
+ }
+ ASSERT(iov_max >= 16);
+#endif
+
if (0 != erl_drv_tsd_key_create("inet_buffer_stack_key", &buffer_stack_key))
goto error;