Browse Source

Refactor cowboy_listener for more consistency

Loïc Hoguin 13 years ago
parent
commit
42bf0ea57d
1 changed files with 28 additions and 21 deletions
  1. 28 21
      src/cowboy_listener.erl

+ 28 - 21
src/cowboy_listener.erl

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