Skip to content

Commit 113fc91

Browse files
committed
Merge branch 'maint'
* maint: ssl: Save supervisor memory
2 parents 34343eb + e337c52 commit 113fc91

3 files changed

Lines changed: 53 additions & 28 deletions

File tree

lib/ssl/src/dtls_connection_sup.erl

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,22 @@ start_link() ->
4545
start_link_dist() ->
4646
supervisor:start_link({local, dtls_connection_sup_dist}, ?MODULE, []).
4747

48-
start_child(Args) ->
49-
supervisor:start_child(?MODULE, Args).
50-
51-
start_child_dist(Args) ->
52-
supervisor:start_child(dtls_connection_sup_dist, Args).
53-
48+
start_child([_Role, _Host, _Port, _Socket, {SslOpts, _, _}, _User, _CbInfo] = Args) ->
49+
start_child(?MODULE, SslOpts, Args).
50+
51+
start_child_dist([_Role, _Host, _Port, _Socket, {SslOpts, _, _}, _User, _CbInfo] = Args) ->
52+
start_child(dtls_connection_sup_dist, SslOpts, Args).
53+
54+
start_child(Module, SslOpts, Args) ->
55+
ReceiverSpawnOpts = maps:get(receiver_spawn_opts, SslOpts, []),
56+
case supervisor:start_child(Module, [self(), ReceiverSpawnOpts]) of
57+
{ok, Pid} ->
58+
Pid ! {self(), options, Args},
59+
{ok, Pid};
60+
Error ->
61+
Error
62+
end.
63+
5464
%%%=========================================================================
5565
%%% Supervisor callback
5666
%%%=========================================================================

lib/ssl/src/ssl_gen_statem.erl

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636
-include("tls_connection.hrl").
3737

3838
%% Initial Erlang process setup
39-
-export([tls_start_link/7,
40-
dtls_start_link/7,
39+
-export([tls_start_link/2,
40+
dtls_start_link/2,
4141
init/1]).
4242

4343
%% TLS connection setup
@@ -110,37 +110,43 @@
110110
%%% Initial Erlang process setup
111111
%%--------------------------------------------------------------------
112112
%%--------------------------------------------------------------------
113-
-spec tls_start_link(client | server, ssl:host(), inet:port_number(), port(), tuple(), pid(), tuple()) ->
113+
-spec tls_start_link(pid(), list()) ->
114114
{ok, pid()} | ignore | {error, ssl:reason()}.
115115
%%
116116
%% Description: Creates a process which calls Module:init/1 to
117-
%% choose appropriat gen_statem and initialize.
117+
%% choose appropriate gen_statem and initialize.
118118
%%--------------------------------------------------------------------
119-
tls_start_link(Role, Host, Port, Socket, {SslOpts, _, _} = Options, User, CbInfo) ->
120-
ReceiverOpts = maps:get(receiver_spawn_opts, SslOpts, []),
121-
Opts = [link | proplists:delete(link, ReceiverOpts)],
122-
Pid = proc_lib:spawn_opt(?MODULE, init, [[Role, self(), Host, Port, Socket, Options, User, CbInfo]], Opts),
119+
tls_start_link(ConnSupv, ReceiverSpawnOpts) ->
120+
Opts = [link | proplists:delete(link, ReceiverSpawnOpts)],
121+
Pid = proc_lib:spawn_opt(?MODULE, init, [ConnSupv], Opts),
123122
{ok, Pid}.
124123

125124
%%--------------------------------------------------------------------
126-
-spec dtls_start_link(client | server, ssl:host(), inet:port_number(), port(), tuple(), pid(), tuple()) ->
125+
-spec dtls_start_link(pid(), list()) ->
127126
{ok, pid()} | ignore | {error, ssl:reason()}.
128127
%%
129128
%% Description: Creates a gen_statem process which calls Module:init/1 to
130129
%% initialize.
131130
%%--------------------------------------------------------------------
132-
dtls_start_link(Role, Host, Port, Socket, {SslOpts, _, _} = Options, User, CbInfo) ->
133-
ReceiverOpts = maps:get(receiver_spawn_opts, SslOpts, []),
134-
Opts = [link | proplists:delete(link, ReceiverOpts)],
135-
Pid = proc_lib:spawn_opt(?MODULE, init, [[Role, Host, Port, Socket, Options, User, CbInfo]], Opts),
131+
dtls_start_link(ConnSupv, ReceiverSpawnOpts) ->
132+
Opts = [link | proplists:delete(link, ReceiverSpawnOpts)],
133+
Pid = proc_lib:spawn_opt(?MODULE, init, [ConnSupv], Opts),
136134
{ok, Pid}.
137135

138136

139137
%%--------------------------------------------------------------------
140-
-spec init(list()) -> no_return().
138+
-spec init(pid()) -> no_return().
141139
%% Description: Initialization
140+
%% We are linked through the supervisors here so either we die or get
141+
%% the message from the supervisor.
142142
%%--------------------------------------------------------------------
143-
init([Role, Sup, Host, Port, Socket, {TLSOpts, EmOpts, Trackers}, User, CbInfo]) ->
143+
init(ConnSupv) ->
144+
receive
145+
{ConnSupv, options, Args} ->
146+
init_statem(Args)
147+
end.
148+
149+
init_statem([Role, Sup, Host, Port, Socket, {TLSOpts, EmOpts, Trackers}, User, CbInfo]) ->
144150
process_flag(trap_exit, true),
145151

146152
{ok, {_, Sender,_,_}} = supervisor:which_child(Sup, sender),
@@ -176,7 +182,7 @@ init([Role, Sup, Host, Port, Socket, {TLSOpts, EmOpts, Trackers}, User, CbInfo])
176182
tls_server_connection:init([Role, Sender, Tab|InitArgs])
177183
end
178184
end;
179-
init([Role, Host, Port, Socket, {DTLSOpts,EmOpts,Trackers}, User, CbInfo]) ->
185+
init_statem([Role, Host, Port, Socket, {DTLSOpts,EmOpts,Trackers}, User, CbInfo]) ->
180186
process_flag(trap_exit, true),
181187

182188
init_label(Role, Host, Port, DTLSOpts),

lib/ssl/src/tls_dyn_connection_sup.erl

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,28 @@
4242
%%%=========================================================================
4343
%%% API
4444
%%%=========================================================================
45-
start_link(SenderArgs, ReciverArgs) ->
46-
supervisor:start_link(?MODULE, [SenderArgs, ReciverArgs]).
45+
start_link(SenderArgs, ReceiverArgs) ->
46+
[Role, _Host, _Port, _Socket, {SslOpts, _, _}, _User, _CbInfo] = ReceiverArgs,
47+
ReceiverSpawnOpts = maps:get(receiver_spawn_opts, SslOpts, []),
48+
case supervisor:start_link(?MODULE, [self(), SenderArgs, ReceiverSpawnOpts]) of
49+
{ok, Sup} ->
50+
{ok, {_, Receiver, _, _}} = supervisor:which_child(Sup, receiver),
51+
Receiver ! {self(), options, [Role, Sup | tl(ReceiverArgs)]},
52+
{ok, Sup};
53+
Error ->
54+
Error
55+
end.
4756

4857
%%%=========================================================================
4958
%%% Supervisor callback
5059
%%%=========================================================================
51-
init([SenderArgs, ReciverArgs]) ->
60+
init([Parent, SenderArgs, ReceiverSpawnOpts]) ->
5261
SupFlags = #{strategy => one_for_all,
5362
auto_shutdown => any_significant,
5463
intensity => 0,
5564
period => 3600
5665
},
57-
ChildSpecs = [sender(SenderArgs), receiver(ReciverArgs)],
66+
ChildSpecs = [sender(SenderArgs), receiver(Parent, ReceiverSpawnOpts)],
5867
{ok, {SupFlags, ChildSpecs}}.
5968

6069
sender(Args) ->
@@ -65,12 +74,12 @@ sender(Args) ->
6574
modules => [tls_sender]
6675
}.
6776

68-
receiver(Args) ->
77+
receiver(Parent, SpawnOpts) ->
6978
#{id => receiver,
7079
restart => temporary,
7180
type => worker,
7281
significant => true,
73-
start => {ssl_gen_statem, tls_start_link, Args},
82+
start => {ssl_gen_statem, tls_start_link, [Parent, SpawnOpts]},
7483
modules => [ssl_gen_statem,
7584
tls_client_connection,
7685
tls_server_connection,

0 commit comments

Comments
 (0)