summaryrefslogtreecommitdiff
path: root/erts/emulator/drivers
diff options
context:
space:
mode:
authorRaimo Niskanen <raimo@erlang.org>2022-02-11 14:00:26 +0100
committerRaimo Niskanen <raimo@erlang.org>2022-02-11 14:00:26 +0100
commitbdc38920e2d51a156d65c4eda9088f482dd00462 (patch)
tree7246a03abfa3cd8462b0b15dc5773f608e58a273 /erts/emulator/drivers
parent2822043305fbe50309e9a92e0fa36f3aefdecb7c (diff)
parentaf09b7bf435bb9755fecb16ebefb665b1ed19d30 (diff)
downloaderlang-bdc38920e2d51a156d65c4eda9088f482dd00462.tar.gz
Merge branch 'maint'
Diffstat (limited to 'erts/emulator/drivers')
-rw-r--r--erts/emulator/drivers/common/inet_drv.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c
index 04a1f70bf4..1a2e93d867 100644
--- a/erts/emulator/drivers/common/inet_drv.c
+++ b/erts/emulator/drivers/common/inet_drv.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1997-2021. All Rights Reserved.
+ * Copyright Ericsson AB 1997-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -10684,7 +10684,7 @@ static void tcp_inet_commandv(ErlDrvData e, ErlIOVec* ev)
tcp_descriptor* desc = (tcp_descriptor*)e;
desc->inet.caller = driver_caller(desc->inet.port);
- DEBUGF(("tcp_inet_commanv(%p) {s=%d\r\n",
+ DEBUGF(("tcp_inet_commandv(%p) {s=%d\r\n",
desc->inet.port, desc->inet.s));
if (!IS_CONNECTED(INETP(desc))) {
if (desc->tcp_add_flags & TCP_ADDF_DELAYED_CLOSE_SEND) {
@@ -11658,8 +11658,6 @@ static int tcp_sendv(tcp_descriptor* desc, ErlIOVec* ev)
h_len = 4;
break;
default:
- if (len == 0)
- return 0;
h_len = 0;
break;
}
@@ -11677,6 +11675,11 @@ static int tcp_sendv(tcp_descriptor* desc, ErlIOVec* ev)
if ((desc->tcp_add_flags & TCP_ADDF_SENDFILE) || sz > 0) {
driver_enqv(ix, ev, 0);
if (sz+ev->size >= desc->high) {
+ if (desc->send_timeout == 0) {
+ /* Shortcut to speed up polling of high water mark */
+ inet_reply_error_am(INETP(desc), am_timeout);
+ return 1;
+ }
DEBUGF(("tcp_sendv(%p): s=%d, sender forced busy\r\n",
desc->inet.port, desc->inet.s));
desc->inet.state |= INET_F_BUSY; /* mark for low-watermark */
@@ -11692,9 +11695,13 @@ static int tcp_sendv(tcp_descriptor* desc, ErlIOVec* ev)
}
}
else {
- int vsize = (ev->vsize > MAX_VSIZE) ? MAX_VSIZE : ev->vsize;
+ int vsize;
- DEBUGF(("tcp_sendv(%p): s=%d, "
+ if ((h_len == 0) && (len == 0)) /* Shortcut for empty send */
+ return 0;
+ vsize = (ev->vsize > MAX_VSIZE) ? MAX_VSIZE : ev->vsize;
+
+ DEBUGF(("tcp_sendv(%p): s=%d, "
"about to send "LLU","LLU" bytes\r\n",
desc->inet.port, desc->inet.s,
(llu_t)h_len, (llu_t)len));
@@ -11746,7 +11753,7 @@ static int tcp_sendv(tcp_descriptor* desc, ErlIOVec* ev)
*/
static int tcp_send(tcp_descriptor* desc, char* ptr, ErlDrvSizeT len)
{
- int sz;
+ ErlDrvSizeT sz;
char buf[4];
int h_len;
int n;
@@ -11767,8 +11774,6 @@ static int tcp_send(tcp_descriptor* desc, char* ptr, ErlDrvSizeT len)
h_len = 4;
break;
default:
- if (len == 0)
- return 0;
h_len = 0;
break;
}
@@ -11782,6 +11787,11 @@ static int tcp_send(tcp_descriptor* desc, char* ptr, ErlDrvSizeT len)
driver_enq(ix, buf, h_len);
driver_enq(ix, ptr, len);
if (sz+h_len+len >= desc->high) {
+ if (desc->send_timeout == 0) {
+ /* Shortcut to speed up polling of high water mark */
+ inet_reply_error_am(INETP(desc), am_timeout);
+ return 1;
+ }
DEBUGF(("tcp_send(%p): s=%d, sender forced busy\r\n",
desc->inet.port, desc->inet.s));
desc->inet.state |= INET_F_BUSY; /* mark for low-watermark */
@@ -11797,6 +11807,9 @@ static int tcp_send(tcp_descriptor* desc, char* ptr, ErlDrvSizeT len)
}
}
else {
+ if ((h_len == 0) && (len == 0)) /* Shortcut for empty send */
+ return 0;
+
iov[0].iov_base = buf;
iov[0].iov_len = h_len;
iov[1].iov_base = ptr;