summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@rabbitmq.com>2010-05-24 16:15:40 +0100
committerMatthew Sackman <matthew@rabbitmq.com>2010-05-24 16:15:40 +0100
commitf7f5b34ea829434d1071b11a72d0c4fc47ce31e6 (patch)
tree1fc4cb93bbe3e6bd3a5ce1c54611313c028e1e8d
parentf225f3fbad2e7abd2b1c8432d6d849a13a2271e0 (diff)
downloadrabbitmq-server-f7f5b34ea829434d1071b11a72d0c4fc47ce31e6.tar.gz
1) stop accepting new connections
-rw-r--r--src/tcp_acceptor.erl21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/tcp_acceptor.erl b/src/tcp_acceptor.erl
index cc4982c9..10efee42 100644
--- a/src/tcp_acceptor.erl
+++ b/src/tcp_acceptor.erl
@@ -38,18 +38,25 @@
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
--record(state, {callback, sock, ref}).
+-export([conserve_memory/2]).
+
+-record(state, {callback, sock, ref, conserving, needs_accept}).
%%--------------------------------------------------------------------
start_link(Callback, LSock) ->
gen_server:start_link(?MODULE, {Callback, LSock}, []).
+conserve_memory(Pid, Conserve) ->
+ gen_server:cast(Pid, {conserve_memory, Conserve}).
+
%%--------------------------------------------------------------------
init({Callback, LSock}) ->
gen_server:cast(self(), accept),
- {ok, #state{callback=Callback, sock=LSock}}.
+ rabbit_alarm:register(self(), {?MODULE, conserve_memory, []}),
+ {ok, #state{callback=Callback, sock=LSock, conserving = false,
+ needs_accept = false}}.
handle_call(_Request, _From, State) ->
{noreply, State}.
@@ -57,6 +64,14 @@ handle_call(_Request, _From, State) ->
handle_cast(accept, State) ->
accept(State);
+handle_cast({conserve_memory, Conserve}, State) ->
+ State1 = case State#state.needs_accept andalso not Conserve of
+ true -> gen_server:cast(self(), accept),
+ State#state{needs_accept = false};
+ false -> State
+ end,
+ {noreply, State1#state{conserving = Conserve}};
+
handle_cast(_Msg, State) ->
{noreply, State}.
@@ -110,6 +125,8 @@ code_change(_OldVsn, State, _Extra) ->
inet_op(F) -> rabbit_misc:throw_on_error(inet_error, F).
+accept(State = #state{conserving = true}) ->
+ {noreply, State#state{needs_accept = true}};
accept(State = #state{sock=LSock}) ->
ok = file_handle_cache:obtain(),
case prim_inet:async_accept(LSock, -1) of