Erlang at Facebook - hibernation and gen_server

eletuchy@REDACTED eletuchy@REDACTED
Wed Jul 8 13:16:41 CEST 2009


The incompatibility is on the client side (gen:call), not the server
side (gen_server:handle_call). There's a receive() loop inside
gen:call that prevents a client from hibernating between dispatching
the $call message and getting back the gen_server:reply().

On Jun 30, 10:41 am, Davide Marquês <nesr...@REDACTED> wrote:
> > This is really strange, that only gen_event supports explicit hibernate
> > ie. returning {ok, Reply, State1, hibernate} from handle_call.
>
> > gen_server and fsm lacks support for hibernate.
> > --
> > Witold Baryluk
>
> That's the thing... from what I can tell gen_server's support for
> hibernate is present and working!http://www.erlang.org/doc/man/gen_server.html#Module:init-1
>
> Using a gen_server looking like this:
> init([Data]) ->
>     {ok, #state{data=Data}}.
>
> handle_call(hibernate, _From, State) ->
>     {reply, going_to_hibernate, State, hibernate};
> handle_call(get_state, _From, State) ->
>     {reply, State, State};
> handle_call(_Request, _From, State) ->
>     {reply, ok, State}.
>
> We can see a gen_server hibernating:
> Eshell V5.7.2  (abort with ^G)
> 1> hibernate:start_link(initial_state).
> {ok,<0.34.0>}
> 2> gen_server:call(hibernate, get_state).
> {state,initial_state}
> 3> erlang:process_info(whereis(hibernate), total_heap_size).
> {total_heap_size,233}
> 4> gen_server:call(hibernate, hibernate).
> going_to_hibernate
> 5> erlang:process_info(whereis(hibernate), total_heap_size).
> {total_heap_size,31}
> 6> gen_server:call(hibernate, get_state).
> {state,initial_state}
> 7> erlang:process_info(whereis(hibernate), total_heap_size).
> {total_heap_size,267}
>
> It seems to work, so I'm left to wonder what "incompatibility"
> was described in Eugene's presentation.
>
> Cheers,
> :Davide


More information about the erlang-questions mailing list