diff options
author | Matthew Sackman <matthew@rabbitmq.com> | 2010-05-24 16:15:40 +0100 |
---|---|---|
committer | Matthew Sackman <matthew@rabbitmq.com> | 2010-05-24 16:15:40 +0100 |
commit | f7f5b34ea829434d1071b11a72d0c4fc47ce31e6 (patch) | |
tree | 1fc4cb93bbe3e6bd3a5ce1c54611313c028e1e8d | |
parent | f225f3fbad2e7abd2b1c8432d6d849a13a2271e0 (diff) | |
download | rabbitmq-server-f7f5b34ea829434d1071b11a72d0c4fc47ce31e6.tar.gz |
1) stop accepting new connections
-rw-r--r-- | src/tcp_acceptor.erl | 21 |
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 |