summaryrefslogtreecommitdiff
path: root/lib/ssl/src/dtls_listener_sup.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ssl/src/dtls_listener_sup.erl')
-rw-r--r--lib/ssl/src/dtls_listener_sup.erl32
1 files changed, 17 insertions, 15 deletions
diff --git a/lib/ssl/src/dtls_listener_sup.erl b/lib/ssl/src/dtls_listener_sup.erl
index ab1c5eee20..4f46407290 100644
--- a/lib/ssl/src/dtls_listener_sup.erl
+++ b/lib/ssl/src/dtls_listener_sup.erl
@@ -30,8 +30,8 @@
%% API
-export([start_link/0]).
-export([start_child/1,
- lookup_listner/1,
- register_listner/2]).
+ lookup_listener/2,
+ register_listener/3]).
%% Supervisor callback
-export([init/1]).
@@ -44,32 +44,34 @@ start_link() ->
start_child(Args) ->
supervisor:start_child(?MODULE, Args).
-
-lookup_listner(0) ->
- undefined;
-lookup_listner(Port) ->
- try ets:lookup(dtls_listener_sup, Port) of
- [{Port, {Owner, Handler}}] ->
+
+lookup_listener(IP, Port) ->
+ try ets:lookup(dtls_listener_sup, {IP, Port}) of
+ [] ->
+ undefined;
+ [{{IP, Port}, {Owner, Handler}}] ->
case erlang:is_process_alive(Handler) of
true ->
- case (Owner =/= undefined) andalso erlang:is_process_alive(Owner) of
+ case (Owner =/= undefined) andalso
+ erlang:is_process_alive(Owner) of
true ->
+ %% Trying to bind port that is already bound
{error, already_listening};
false ->
+ %% Re-open same listen socket when the handler
+ %% is dead.
{ok, Handler}
end;
false ->
- ets:delete(dtls_listener_sup, Port),
+ ets:delete(dtls_listener_sup, {IP, Port}),
undefined
- end;
- [] ->
- undefined
+ end
catch _:_ ->
undefined
end.
-register_listner(OwnerAndListner, Port) ->
- ets:insert(dtls_listener_sup, {Port, OwnerAndListner}).
+register_listener(OwnerAndListner, IP, Port) ->
+ ets:insert(dtls_listener_sup, {{IP, Port}, OwnerAndListner}).
%%%=========================================================================
%%% Supervisor callback