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:
parent
e927a8228b
commit
42bf0ea57d
1 changed files with 28 additions and 21 deletions
|
@ -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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue