From ccf7a242b4899c70595ff8fa9e531cf3bea6e0e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Sun, 3 Apr 2011 01:44:52 +0200 Subject: [PATCH] Ensure the listening socket gets closed with the listener supervisor. Moved the Transport:listen call to cowboy_acceptors_sup. This make it depend on a child of cowboy_listener_sup instead of cowboy_sup, which isn't getting shut down when calling cowboy:stop_listener/1 and thus didn't close the listening socket. --- src/cowboy_acceptors_sup.erl | 9 +++++---- src/cowboy_listener_sup.erl | 31 +++++++++---------------------- 2 files changed, 14 insertions(+), 26 deletions(-) diff --git a/src/cowboy_acceptors_sup.erl b/src/cowboy_acceptors_sup.erl index c5e7db41..66ac4a93 100644 --- a/src/cowboy_acceptors_sup.erl +++ b/src/cowboy_acceptors_sup.erl @@ -25,14 +25,15 @@ -spec start_link(NbAcceptors::non_neg_integer(), Transport::module(), TransOpts::term(), Protocol::module(), ProtoOpts::term(), ReqsPid::pid()) -> {ok, Pid::pid()}. -start_link(LSocket, NbAcceptors, Transport, Protocol, ProtoOpts, ReqsPid) -> - supervisor:start_link(?MODULE, [LSocket, NbAcceptors, - Transport, Protocol, ProtoOpts, ReqsPid]). +start_link(NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts, ReqsPid) -> + supervisor:start_link(?MODULE, [NbAcceptors, + Transport, TransOpts, Protocol, ProtoOpts, ReqsPid]). %% supervisor. -spec init(list(term())) -> term(). %% @todo These specs should be improved. -init([LSocket, NbAcceptors, Transport, Protocol, ProtoOpts, ReqsPid]) -> +init([NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts, ReqsPid]) -> + {ok, LSocket} = Transport:listen(TransOpts), Procs = [{{acceptor, self(), N}, {cowboy_acceptor, start_link, [ LSocket, Transport, Protocol, ProtoOpts, ReqsPid ]}, permanent, brutal_kill, worker, dynamic} diff --git a/src/cowboy_listener_sup.erl b/src/cowboy_listener_sup.erl index 85b17efb..e77c237b 100644 --- a/src/cowboy_listener_sup.erl +++ b/src/cowboy_listener_sup.erl @@ -24,12 +24,15 @@ TransOpts::term(), Protocol::module(), ProtoOpts::term()) -> {ok, Pid::pid()}. start_link(NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts) -> - case Transport:listen(TransOpts) of - {ok, LSocket} -> - start_sup(LSocket, NbAcceptors, Transport, Protocol, ProtoOpts); - {error, Reason} -> - {error, Reason} - end. + {ok, SupPid} = supervisor:start_link(?MODULE, []), + {ok, ReqsPid} = supervisor:start_child(SupPid, + {cowboy_requests_sup, {cowboy_requests_sup, start_link, []}, + permanent, 5000, supervisor, [cowboy_requests_sup]}), + {ok, _PoolPid} = supervisor:start_child(SupPid, + {cowboy_acceptors_sup, {cowboy_acceptors_sup, start_link, [ + NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts, ReqsPid + ]}, permanent, 5000, supervisor, [cowboy_acceptors_sup]}), + {ok, SupPid}. %% supervisor. @@ -37,19 +40,3 @@ start_link(NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts) -> -spec init([]) -> term(). init([]) -> {ok, {{one_for_one, 0, 1}, []}}. - -%% Internal. - --spec start_sup(NbAcceptors::non_neg_integer(), Transport::module(), - TransOpts::term(), Protocol::module(), ProtoOpts::term()) - -> {ok, Pid::pid()}. -start_sup(LSocket, NbAcceptors, Transport, Protocol, ProtoOpts) -> - {ok, SupPid} = supervisor:start_link(?MODULE, []), - {ok, ReqsPid} = supervisor:start_child(SupPid, - {cowboy_requests_sup, {cowboy_requests_sup, start_link, []}, - permanent, 5000, supervisor, [cowboy_requests_sup]}), - {ok, _PoolPid} = supervisor:start_child(SupPid, - {cowboy_acceptors_sup, {cowboy_acceptors_sup, start_link, [ - LSocket, NbAcceptors, Transport, Protocol, ProtoOpts, ReqsPid - ]}, permanent, 5000, supervisor, [cowboy_acceptors_sup]}), - {ok, SupPid}.