File 3171-Move-empty-send-shortcut-to-not-interfere-with-send_.patch of Package erlang
From 9c01190706fc4920d6826281e42cf9dff2dd3120 Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Mon, 3 Jan 2022 17:30:37 +0100
Subject: [PATCH 1/2] Move empty send shortcut to not interfere with
send_timeout
---
erts/emulator/drivers/common/inet_drv.c | 31 ++++++++++++++++++-------
1 file changed, 22 insertions(+), 9 deletions(-)
diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c
index 49db7077de..b007d1d2d5 100644
--- a/erts/emulator/drivers/common/inet_drv.c
+++ b/erts/emulator/drivers/common/inet_drv.c
@@ -10633,7 +10633,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) {
@@ -11607,8 +11607,6 @@ static int tcp_sendv(tcp_descriptor* desc, ErlIOVec* ev)
h_len = 4;
break;
default:
- if (len == 0)
- return 0;
h_len = 0;
break;
}
@@ -11626,6 +11624,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 */
@@ -11641,9 +11644,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));
@@ -11695,7 +11702,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;
@@ -11716,8 +11723,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;
}
@@ -11731,6 +11736,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 */
@@ -11746,6 +11756,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;
--
2.34.1