Skip to content

Commit 2995f96

Browse files
author
Erlang/OTP
committed
Merge branch 'bmk/kernel/20220427/gen_tcp_socket_shutdown_24.3.3/OTP-18080' into maint-24
* bmk/kernel/20220427/gen_tcp_socket_shutdown_24.3.3/OTP-18080: [kernel|gen-tcp|test] Tweaked shutdown (api) test case(s) [kernel|gen-tcp-socket] Changed the behaviour of shutdown [erts|esock] Add caller pid to the initial debug printout for close
2 parents 8fef31d + 9e1f560 commit 2995f96

File tree

3 files changed

+50
-12
lines changed

3 files changed

+50
-12
lines changed

erts/emulator/nifs/common/prim_socket_nif.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9164,7 +9164,7 @@ ERL_NIF_TERM nif_close(ErlNifEnv* env,
91649164
return enif_raise_exception(env, MKA(env, "notsup"));
91659165
#else
91669166
ESockDescriptor* descP;
9167-
ERL_NIF_TERM res;
9167+
ERL_NIF_TERM res;
91689168

91699169
ESOCK_ASSERT( argc == 1 );
91709170

@@ -9178,8 +9178,16 @@ ERL_NIF_TERM nif_close(ErlNifEnv* env,
91789178
MLOCK(descP->writeMtx);
91799179

91809180
SSDBG( descP,
9181-
("SOCKET", "nif_close(%T), {%d,0x%X}\r\n",
9182-
argv[0], descP->sock, descP->readState) );
9181+
("SOCKET", "nif_close(%T) ->"
9182+
"\r\n Socket: %d"
9183+
"\r\n Read State: 0x%X"
9184+
"\r\n Write State: 0x%X"
9185+
"\r\n Caller: %T"
9186+
"\r\n",
9187+
argv[0],
9188+
descP->sock,
9189+
descP->readState, descP->writeState,
9190+
esock_self(env)) );
91839191

91849192
res = esock_close(env, descP);
91859193

lib/kernel/src/gen_tcp_socket.erl

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1718,9 +1718,19 @@ handle_event(Type, Content, State, P_D) ->
17181718
%% Event handler helpers
17191719

17201720

1721-
%% We only accept/perform shutdown when socket is 'connected'.
1721+
%% We only accept/perform shutdown when socket is 'connected'
1722+
%% We only accept/perform shutdown when socket is 'connected'
1723+
%% (or closed_read | closed_write).
17221724
%% This is done to be "compatible" with the inet-driver!
17231725

1726+
handle_shutdown(#params{socket = Socket},
1727+
closed_write = _State,
1728+
read = How) ->
1729+
handle_shutdown2(Socket, closed_read_write, How);
1730+
handle_shutdown(#params{socket = Socket},
1731+
closed_read = _State,
1732+
write = How) ->
1733+
handle_shutdown2(Socket, closed_read_write, How);
17241734
handle_shutdown(#params{socket = Socket},
17251735
connected = _State,
17261736
write = How) ->

lib/kernel/test/gen_tcp_api_SUITE.erl

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -437,25 +437,45 @@ do_recv_delim(Config) ->
437437
%%% gen_tcp:shutdown/2
438438

439439
t_shutdown_write(Config) when is_list(Config) ->
440+
?P("create listen socket"),
440441
{ok, L} = gen_tcp:listen(0, ?INET_BACKEND_OPTS(Config)),
441442
{ok, Port} = inet:port(L),
442-
{ok, Client} = gen_tcp:connect(localhost, Port,
443-
?INET_BACKEND_OPTS(Config) ++
444-
[{active, false}]),
443+
?P("create connect socket (C)"),
444+
{ok, C} = gen_tcp:connect(localhost, Port,
445+
?INET_BACKEND_OPTS(Config) ++
446+
[{active, false}]),
447+
?P("create accept socket (A)"),
445448
{ok, A} = gen_tcp:accept(L),
449+
?P("send message A -> C"),
450+
ok = gen_tcp:send(A, "Hej Client"),
451+
?P("socket A shutdown(write)"),
446452
ok = gen_tcp:shutdown(A, write),
447-
{error, closed} = gen_tcp:recv(Client, 0),
453+
?P("socket C recv - expect message"),
454+
{ok, "Hej Client"} = gen_tcp:recv(C, 0),
455+
?P("socket C recv - expect closed"),
456+
{error, closed} = gen_tcp:recv(C, 0),
457+
?P("done"),
448458
ok.
449459

450460
t_shutdown_both(Config) when is_list(Config) ->
461+
?P("create listen socket"),
451462
{ok, L} = gen_tcp:listen(0, ?INET_BACKEND_OPTS(Config)),
452463
{ok, Port} = inet:port(L),
453-
{ok, Client} = gen_tcp:connect(localhost, Port,
454-
?INET_BACKEND_OPTS(Config) ++
455-
[{active, false}]),
464+
?P("create connect socket (C)"),
465+
{ok, C} = gen_tcp:connect(localhost, Port,
466+
?INET_BACKEND_OPTS(Config) ++
467+
[{active, false}]),
468+
?P("create accept socket (A)"),
456469
{ok, A} = gen_tcp:accept(L),
470+
?P("send message A -> C"),
471+
ok = gen_tcp:send(A, "Hej Client"),
472+
?P("socket A shutdown(read_write)"),
457473
ok = gen_tcp:shutdown(A, read_write),
458-
{error, closed} = gen_tcp:recv(Client, 0),
474+
?P("socket C recv - expect message"),
475+
{ok, "Hej Client"} = gen_tcp:recv(C, 0),
476+
?P("socket C recv - expect closed"),
477+
{error, closed} = gen_tcp:recv(C, 0),
478+
?P("done"),
459479
ok.
460480

461481
t_shutdown_error(Config) when is_list(Config) ->

0 commit comments

Comments
 (0)