File 2054-Fix-Dialyzer-problems.patch of Package erlang
From ebf66ed11fc01e354e1ef7381a641f9a655e90ea Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Thu, 19 Mar 2020 14:29:22 +0100
Subject: [PATCH 4/6] Fix Dialyzer problems
---
lib/kernel/src/gen_tcp_socket.erl | 204 ++++++++++++++++++++++----------------
lib/stdlib/src/gen_statem.erl | 1 +
2 files changed, 122 insertions(+), 83 deletions(-)
diff --git a/lib/kernel/src/gen_tcp_socket.erl b/lib/kernel/src/gen_tcp_socket.erl
index 26c0a357c1..fe58cc0cba 100644
--- a/lib/kernel/src/gen_tcp_socket.erl
+++ b/lib/kernel/src/gen_tcp_socket.erl
@@ -52,10 +52,16 @@
(Size):(Packet)/unit:8-integer-big-unsigned).
-define(badarg_exit(Error),
+ case begin Error end of
+ {error, badarg} -> exit(badarg);
+ OTHER__ -> OTHER__
+ end).
+
+-define(badarg_einval_exit(Error),
case begin Error end of
{error, badarg} -> exit(badarg);
{error, einval} -> exit(badarg);
- Error__ -> Error__
+ OTHER__ -> OTHER__
end).
-define(socket_abort(Socket, SelectRef, Reason),
@@ -87,12 +93,11 @@ connect_lookup(Address, Port, Opts, Timer) ->
{Mod, Opts_2} = inet:tcp_module(Opts_1, Address),
Domain = domain(Mod),
{StartOpts, Opts_3} = setopts_split(start, Opts_2),
- ErrorRef = make_ref(),
- Ok = ok_fun(ErrorRef),
+ ErrRef = make_ref(),
try
- {ok, IPs} = Ok(Mod:getaddrs(Address, Timer)),
- {ok, TP} = Ok(Mod:getserv(Port)),
- {ok, CO} = Ok(inet:connect_options(Opts_3, Mod)),
+ IPs = val(ErrRef, Mod:getaddrs(Address, Timer)),
+ TP = val(ErrRef, Mod:getserv(Port)),
+ CO = val(ErrRef, inet:connect_options(Opts_3, Mod)),
{sockaddrs(IPs, TP, Domain), CO}
of
{Addrs,
@@ -109,8 +114,8 @@ connect_lookup(Address, Port, Opts, Timer) ->
connect_open(
Addrs, Domain, ConnectOpts, StartOpts, Fd, Timer, BindAddr)
catch
- throw : {ErrorRef, Error} ->
- ?badarg_exit(Error)
+ throw : {ErrRef, Reason} ->
+ ?badarg_exit({error, Reason})
end.
connect_open(Addrs, Domain, ConnectOpts, Opts, Fd, Timer, BindAddr) ->
@@ -135,19 +140,19 @@ connect_open(Addrs, Domain, ConnectOpts, Opts, Fd, Timer, BindAddr) ->
setopts_split(
#{socket => [], server_read => [], server_write => []},
ConnectOpts),
- ErrorRef = make_ref(),
- Ok = ok_fun(ErrorRef),
+ ErrRef = make_ref(),
try
- Ok(call(Server, {setopts, SocketOpts ++ Setopts})),
- Ok(call(Server, {bind, BindAddr})),
+ ok(ErrRef, call(Server, {setopts, SocketOpts ++ Setopts})),
+ ok(ErrRef, call(Server, {bind, BindAddr})),
DefaultError = {error, einval},
- {ok, Socket} =
- Ok(connect_loop(Addrs, Server, DefaultError, Timer)),
+ Socket =
+ val(ErrRef,
+ connect_loop(Addrs, Server, DefaultError, Timer)),
{ok, ?module_socket(Server, Socket)}
catch
- throw : {ErrorRef, Error} ->
+ throw : {ErrRef, Reason} ->
close_server(Server),
- ?badarg_exit(Error)
+ ?badarg_exit({error, Reason})
end;
{error, _} = Error ->
?badarg_exit(Error)
@@ -175,8 +180,8 @@ listen(Port, Opts) ->
case Mod:getserv(Port) of
{ok, TP} ->
case inet:listen_options([{port, TP} | Opts_3], Mod) of
- {error, _} = Error ->
- ?badarg_exit(Error);
+ {error, badarg} ->
+ exit(badarg);
{ok,
#listen_opts{
fd = Fd,
@@ -216,20 +221,20 @@ listen_open(Domain, ListenOpts, Opts, Fd, Backlog, BindAddr) ->
setopts_split(
#{socket => [], server_read => [], server_write => []},
ListenOpts),
- ErrorRef = make_ref(),
- Ok = ok_fun(ErrorRef),
+ ErrRef = make_ref(),
try
- Ok(call(
+ ok(ErrRef,
+ call(
Server,
{setopts,
[{start_opts, StartOpts}] ++ SocketOpts ++ Setopts})),
- Ok(call(Server, {bind, BindAddr})),
- {ok, Socket} = Ok(call(Server, {listen, Backlog})),
+ ok(ErrRef, call(Server, {bind, BindAddr})),
+ Socket = val(ErrRef, call(Server, {listen, Backlog})),
{ok, ?module_socket(Server, Socket)}
catch
- throw : {ErrorRef, Error} ->
+ throw : {ErrRef, Reason} ->
close_server(Server),
- ?badarg_exit(Error)
+ ?badarg_exit({error, Reason})
end;
{error, {shutdown, Reason}} ->
?badarg_exit({error, Reason});
@@ -242,24 +247,25 @@ listen_open(Domain, ListenOpts, Opts, Fd, Backlog, BindAddr) ->
accept(?module_socket(ListenServer, ListenSocket), Timeout) ->
%%
Timer = inet:start_timer(Timeout),
- ErrorRef = make_ref(),
- Ok = ok_fun(ErrorRef),
+ ErrRef = make_ref(),
try
- {ok, #{start_opts := StartOpts} = ServerData} =
- Ok(call(ListenServer, get_server_opts)),
- {ok, Server} =
- Ok(start_server(
+ #{start_opts := StartOpts} = ServerData =
+ val(ErrRef, call(ListenServer, get_server_opts)),
+ Server =
+ val(ErrRef,
+ start_server(
ServerData,
[{timeout, inet:timeout(Timer)} | start_opts(StartOpts)])),
- case call(Server, {accept, ListenSocket, inet:timeout(Timer)}) of
- {ok, Socket} ->
- {ok, ?module_socket(Server, Socket)};
- {error, _} = Error_1 ->
- stop_server(Server),
- throw({ErrorRef, Error_1})
- end
- catch throw : {ErrorRef, Error_2} ->
- ?badarg_exit(Error_2)
+ Socket =
+ val({ErrRef, Server},
+ call(Server, {accept, ListenSocket, inet:timeout(Timer)})),
+ {ok, ?module_socket(Server, Socket)}
+ catch
+ throw : {{ErrRef, Srv}, Reason} ->
+ stop_server(Srv),
+ ?badarg_exit({error, Reason});
+ throw : {ErrRef, Reason} ->
+ ?badarg_exit({error, Reason})
after
_ = inet:stop_timer(Timer)
end.
@@ -297,31 +303,53 @@ send_result(Server, Meta, Result) ->
%% To handle RestData we would have to pass
%% all writes through a single process that buffers
%% the write data, which would be a bottleneck
- send_error(Server, Meta, {error, Reason});
- {error, _} = Error ->
- send_error(Server, Meta, Error);
- ok -> ok
- end.
-
-send_error(Server, Meta, Error) ->
- %% Since send data may have been lost, and there is no room
- %% in this API to inform the caller, we at least close
- %% the socket in the write direction
+ %%
+ %% Since send data may have been lost, and there is no room
+ %% in this API to inform the caller, we at least close
+ %% the socket in the write direction
%%% erlang:display({{self(), ?MODULE, ?LINE, ?FUNCTION_NAME},
-%%% Error}),
- case Error of
- {error, econnreset} ->
- case maps:get(show_econnreset, Meta) of
- true -> ?badarg_exit(Error);
- false -> {error, closed}
+%%% Result}),
+ case Reason of
+ econnreset ->
+ case maps:get(show_econnreset, Meta) of
+ true -> {error, econnreset};
+ false -> {error, closed}
+ end;
+ timeout ->
+ _ = maps:get(send_timeout_close, Meta)
+ andalso close_server(Server),
+ {error, Reason};
+ _ ->
+ ?badarg_exit({error, Reason})
end;
- {error, timeout} ->
- _ = maps:get(send_timeout_close, Meta)
- andalso close_server(Server),
- ?badarg_exit(Error);
- _ ->
- ?badarg_exit(Error)
+ ok ->
+ ok
end.
+%%% send_error(Server, Meta, {error, Reason});
+%%% {error, _} = Error ->
+%%% send_error(Server, Meta, Error);
+%%% ok -> ok
+%%% end.
+
+%%%send_error(Server, Meta, Error) ->
+%%% %% Since send data may have been lost, and there is no room
+%%% %% in this API to inform the caller, we at least close
+%%% %% the socket in the write direction
+%%%%%% erlang:display({{self(), ?MODULE, ?LINE, ?FUNCTION_NAME},
+%%%%%% Error}),
+%%% case Error of
+%%% {error, econnreset} ->
+%%% case maps:get(show_econnreset, Meta) of
+%%% true -> ?badarg_exit(Error);
+%%% false -> {error, closed}
+%%% end;
+%%% {error, timeout} ->
+%%% _ = maps:get(send_timeout_close, Meta)
+%%% andalso close_server(Server),
+%%% ?badarg_exit(Error);
+%%% _ ->
+%%% ?badarg_exit(Error)
+%%% end.
%% -------------------------------------------------------------------------
@@ -466,11 +494,14 @@ socket_cancel(Socket, SelectInfo) ->
%%% API Helpers
%%%
-ok_fun(ErrorRef) ->
- fun (ok) -> ok;
- ({ok, _} = Ret) -> Ret;
- ({error, _} = Error) -> throw({ErrorRef, Error})
- end.
+%% Deep return helpers
+
+ok(_ErrRef, ok) -> ok;
+ok(ErrRef, {error, Reason}) -> throw({ErrRef, Reason}).
+
+val(_ErrRef, {ok, Val}) -> Val;
+val(ErrRef, {error, Reason}) -> throw({ErrRef, Reason}).
+
address(SockAddr) ->
case SockAddr of
@@ -551,7 +582,7 @@ conv_setopt(list) -> {mode, list};
conv_setopt(inet) -> {tcp_module, inet_tcp};
conv_setopt(inet6) -> {tcp_module, inet6_tcp};
conv_setopt(local) -> {tcp_module, local_tcp};
-conv_setopt({_, _} = Other) -> Other.
+conv_setopt(Other) -> Other.
%% Socket options
@@ -767,9 +798,11 @@ call(Server, Call) ->
end.
stop_server(Server) ->
- try gen_statem:stop(Server)
- catch _:_ -> ok
- end, ok.
+ try gen_statem:stop(Server) of
+ _ -> ok
+ catch
+ _:_ -> ok
+ end.
%% reply(From, Reply) ->
%% gen_statem:reply(From, Reply).
@@ -810,8 +843,7 @@ callback_mode() -> handle_event_function.
-record(params,
- {key :: reference(),
- socket :: undefined | socket:socket(),
+ {socket :: undefined | socket:socket(),
owner :: pid(),
owner_mon :: reference()}).
@@ -860,13 +892,15 @@ terminate(State, {#params{socket = Socket} = P, D}) ->
case State of
'closed' -> ok;
'closed_read' ->
- _ = socket_close(Socket), ok;
+ _ = socket_close(Socket),
+ ok;
_ ->
case State of
'accept' -> ok;
#accept{} -> ok;
_ ->
- _ = socket_close(Socket), ok
+ _ = socket_close(Socket),
+ ok
end,
{_D_1, ActionsR} =
case State of
@@ -1594,16 +1628,21 @@ cleanup_recv_reply(
%%% {ModuleSocket, Reason}}),
case Reason of
timeout ->
- Owner ! {tcp_error, ModuleSocket, Reason};
+ Owner ! {tcp_error, ModuleSocket, Reason},
+ ok;
closed ->
- Owner ! {tcp_closed, ModuleSocket};
+ Owner ! {tcp_closed, ModuleSocket},
+ ok;
emsgsize ->
- Owner ! {tcp_error, ModuleSocket, Reason};
+ Owner ! {tcp_error, ModuleSocket, Reason},
+ ok;
econnreset when ShowEconnreset =:= false ->
- Owner ! {tcp_closed, ModuleSocket};
+ Owner ! {tcp_closed, ModuleSocket},
+ ok;
_ ->
Owner ! {tcp_error, ModuleSocket, Reason},
- Owner ! {tcp_closed, ModuleSocket}
+ Owner ! {tcp_closed, ModuleSocket},
+ ok
end
end,
{recv_stop(D#{active := false}),
@@ -1838,7 +1877,8 @@ state_setopts_active(P, D, State, Opts, Active) ->
Active =:= false ->
case D of
#{active := OldActive} when is_integer(OldActive) ->
- P#params.owner ! {tcp_passive, module_socket(P)};
+ P#params.owner ! {tcp_passive, module_socket(P)},
+ ok;
#{active := _OldActive} -> ok
end,
state_setopts(P, D#{active := Active}, State, Opts);
@@ -1896,8 +1936,6 @@ state_getopts(P, D, State, [Tag | Tags], Acc) ->
#{server_read := _} ->
Value = maps:get(Tag, D),
state_getopts(P, D, State, Tags, [{Tag, Value} | Acc]);
- #{einval := _} ->
- state_getopts(P, D, State, Tags, Acc);
#{} -> % extra | einval
{error, einval}
end.
diff --git a/lib/stdlib/src/gen_statem.erl b/lib/stdlib/src/gen_statem.erl
index 96c849715e..adf1a82a08 100644
--- a/lib/stdlib/src/gen_statem.erl
+++ b/lib/stdlib/src/gen_statem.erl
@@ -59,6 +59,7 @@
%% Type exports for templates and callback modules
-export_type(
[event_type/0,
+ from/0,
callback_mode_result/0,
init_result/1,
state_enter_result/1,
--
2.16.4