0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-15 12:40:25 +00:00

Refactor cowboy_listener for more consistency

This commit is contained in:
Loïc Hoguin 2012-01-31 09:25:23 +01:00
parent e927a8228b
commit 42bf0ea57d

View file

@ -133,27 +133,21 @@ handle_call(_Request, _From, State) ->
-spec handle_cast(_, State) -> {noreply, State}. -spec handle_cast(_, State) -> {noreply, State}.
handle_cast({move_connection, DestPool, ConnPid}, State=#state{ handle_cast({move_connection, DestPool, ConnPid}, State=#state{
req_pools=Pools, reqs_table=ReqsTable}) -> req_pools=Pools, reqs_table=ReqsTable}) ->
{MonitorRef, SrcPool} = ets:lookup_element(ReqsTable, ConnPid, 2), Pools2 = move_pid(ConnPid, DestPool, Pools, ReqsTable),
ets:insert(ReqsTable, {ConnPid, {MonitorRef, DestPool}}), {noreply, State#state{req_pools=Pools2}};
{SrcPool, SrcNbConns} = lists:keyfind(SrcPool, 1, Pools), handle_cast({remove_connection, ConnPid}, State=#state{
DestNbConns = case lists:keyfind(DestPool, 1, Pools) of req_pools=Pools, reqs_table=ReqsTable, queue=Queue}) ->
false -> 1; {Pools2, Queue2} = remove_pid(ConnPid, Pools, ReqsTable, Queue),
{DestPool, NbConns} -> NbConns + 1 {noreply, State#state{req_pools=Pools2, queue=Queue2}};
end,
Pools2 = lists:keydelete(SrcPool, 1, lists:keydelete(DestPool, 1, Pools)),
Pools3 = [{SrcPool, SrcNbConns - 1}, {DestPool, DestNbConns}|Pools2],
{noreply, State#state{req_pools=Pools3}};
handle_cast({remove_connection, ConnPid}, State) ->
State2 = remove_pid(ConnPid, State),
{noreply, State2};
handle_cast(_Msg, State) -> handle_cast(_Msg, State) ->
{noreply, State}. {noreply, State}.
%% @private %% @private
-spec handle_info(_, State) -> {noreply, State}. -spec handle_info(_, State) -> {noreply, State}.
handle_info({'DOWN', _Ref, process, Pid, _Info}, State) -> handle_info({'DOWN', _Ref, process, Pid, _Info}, State=#state{
State2 = remove_pid(Pid, State), req_pools=Pools, reqs_table=ReqsTable, queue=Queue}) ->
{noreply, State2}; {Pools2, Queue2} = remove_pid(Pid, Pools, ReqsTable, Queue),
{noreply, State#state{req_pools=Pools2, queue=Queue2}};
handle_info(_Info, State) -> handle_info(_Info, State) ->
{noreply, State}. {noreply, State}.
@ -186,9 +180,22 @@ add_pid(ConnPid, Pool, Pools, ReqsTable) ->
{NbConnsRet, Pools2}. {NbConnsRet, Pools2}.
%% @private %% @private
-spec remove_pid(pid(), State) -> State. -spec move_pid(pid(), atom(), pools(), ets:tid()) -> pools().
remove_pid(Pid, State=#state{ move_pid(ConnPid, DestPool, Pools, ReqsTable) ->
req_pools=Pools, reqs_table=ReqsTable, queue=Queue}) -> {MonitorRef, SrcPool} = ets:lookup_element(ReqsTable, ConnPid, 2),
ets:insert(ReqsTable, {ConnPid, {MonitorRef, DestPool}}),
{SrcPool, SrcNbConns} = lists:keyfind(SrcPool, 1, Pools),
DestNbConns = case lists:keyfind(DestPool, 1, Pools) of
false -> 1;
{DestPool, NbConns} -> NbConns + 1
end,
Pools2 = lists:keydelete(SrcPool, 1, lists:keydelete(DestPool, 1, Pools)),
[{SrcPool, SrcNbConns - 1}, {DestPool, DestNbConns}|Pools2].
%% @private
-spec remove_pid(pid(), pools(), ets:tid(), [{pid(), reference()}])
-> {pools(), [{pid(), reference()}]}.
remove_pid(Pid, Pools, ReqsTable, Queue) ->
{MonitorRef, Pool} = ets:lookup_element(ReqsTable, Pid, 2), {MonitorRef, Pool} = ets:lookup_element(ReqsTable, Pid, 2),
erlang:demonitor(MonitorRef, [flush]), erlang:demonitor(MonitorRef, [flush]),
{Pool, NbConns} = lists:keyfind(Pool, 1, Pools), {Pool, NbConns} = lists:keyfind(Pool, 1, Pools),
@ -196,8 +203,8 @@ remove_pid(Pid, State=#state{
ets:delete(ReqsTable, Pid), ets:delete(ReqsTable, Pid),
case Queue of case Queue of
[] -> [] ->
State#state{req_pools=Pools2}; {Pools2, Queue};
[Client|Queue2] -> [Client|Queue2] ->
gen_server:reply(Client, ok), gen_server:reply(Client, ok),
State#state{req_pools=Pools2, queue=Queue2} {Pools2, Queue2}
end. end.