diff options
author | Raimo Niskanen <raimo@erlang.org> | 2022-02-11 14:00:26 +0100 |
---|---|---|
committer | Raimo Niskanen <raimo@erlang.org> | 2022-02-11 14:00:26 +0100 |
commit | bdc38920e2d51a156d65c4eda9088f482dd00462 (patch) | |
tree | 7246a03abfa3cd8462b0b15dc5773f608e58a273 /erts/emulator/drivers | |
parent | 2822043305fbe50309e9a92e0fa36f3aefdecb7c (diff) | |
parent | af09b7bf435bb9755fecb16ebefb665b1ed19d30 (diff) | |
download | erlang-bdc38920e2d51a156d65c4eda9088f482dd00462.tar.gz |
Merge branch 'maint'
Diffstat (limited to 'erts/emulator/drivers')
-rw-r--r-- | erts/emulator/drivers/common/inet_drv.c | 31 |
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; |