diff options
author | Erlang/OTP <[email protected]> | 2019-02-15 15:09:46 +0100 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2019-02-15 15:09:46 +0100 |
commit | 1fde40655c4b10f0b1c550c96f6eb9c2de20afba (patch) | |
tree | 1fca741e6304b4c4f1d3596880daf0ea9da0c76b | |
parent | 934f9974eb6bec43cd9445ec0f5019a4d1389428 (diff) | |
parent | e23b1ad7f296ae18cae143cdafcdaff044cee9f3 (diff) | |
download | otp-1fde40655c4b10f0b1c550c96f6eb9c2de20afba.tar.gz otp-1fde40655c4b10f0b1c550c96f6eb9c2de20afba.tar.bz2 otp-1fde40655c4b10f0b1c550c96f6eb9c2de20afba.zip |
Merge branch 'raimo/erts/gen_tcp-listen-linger-slow/ERIERL-303/OTP-14728' into maint-21
* raimo/erts/gen_tcp-listen-linger-slow/ERIERL-303/OTP-14728:
Check empty_out_q at close also for linger
-rw-r--r-- | erts/preloaded/ebin/prim_inet.beam | bin | 82228 -> 82572 bytes | |||
-rw-r--r-- | erts/preloaded/src/prim_inet.erl | 16 |
2 files changed, 13 insertions, 3 deletions
diff --git a/erts/preloaded/ebin/prim_inet.beam b/erts/preloaded/ebin/prim_inet.beam Binary files differindex 558968b58a..d39c988442 100644 --- a/erts/preloaded/ebin/prim_inet.beam +++ b/erts/preloaded/ebin/prim_inet.beam diff --git a/erts/preloaded/src/prim_inet.erl b/erts/preloaded/src/prim_inet.erl index f1d938c9a4..e964f0b174 100644 --- a/erts/preloaded/src/prim_inet.erl +++ b/erts/preloaded/src/prim_inet.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2000-2018. All Rights Reserved. +%% Copyright Ericsson AB 2000-2019. 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. @@ -172,8 +172,18 @@ close(S) when is_port(S) -> %% and is a contradiction in itself. %% We have hereby done our best... %% - Tref = erlang:start_timer(T * 1000, self(), close_port), - close_pend_loop(S, Tref, undefined); + case subscribe(S, [subs_empty_out_q]) of + {ok, [{subs_empty_out_q,0}]} -> + close_port(S); + {ok, [{subs_empty_out_q,N}]} when N > 0 -> + %% Wait for pending output to be sent + Tref = erlang:start_timer(T * 1000, self(), close_port), + close_pend_loop(S, Tref, N); + _ -> + %% Subscribe failed - wait full time + Tref = erlang:start_timer(T * 1000, self(), close_port), + close_pend_loop(S, Tref, undefined) + end; _ -> % Regard this as {ok,{false,_}} case subscribe(S, [subs_empty_out_q]) of {ok, [{subs_empty_out_q,N}]} when N > 0 -> |