Tag: gen_server

  • I like Erlang and I like gen_servers, I end up coding a lot of stuff as gen_servers and I like behaviors in generally. I even wrote some myself. I haven’t used Erlang for a while. I’ve been playing with it in the last couple of days, hopefully I’ll announce something soon.

    I ended up creating my own gen_servers template to get started. It’s a very verbose one and I’m putting it here more for me to know where it is that anything else; but, maybe it’s of use for someone else:

    -module(module).
    -compile(export_all).
    
    -behaviour(gen_server).
    -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
    
    %% Public API
    
    start() ->
      gen_server:start({local, ?MODULE}, ?MODULE, [], []).
    
    stop(Module) ->
      gen_server:call(Module, stop).
    
    stop() ->
      stop(?MODULE).
    
    state(Module) ->
      gen_server:call(Module, state).
    
    state() ->
      state(?MODULE).
    
    %% Server implementation, a.k.a.: callbacks
    
    init([]) ->
      say("init", []),
      {ok, []}.
    
    
    handle_call(stop, _From, State) ->
      say("stopping by ~p, state was ~p.", [_From, State]),
      {stop, normal, stopped, State};
    
    handle_call(state, _From, State) ->
      say("~p is asking for the state.", [_From]),
      {reply, State, State};
    
    handle_call(_Request, _From, State) ->
      say("call ~p, ~p, ~p.", [_Request, _From, State]),
      {reply, ok, State}.
    
    
    handle_cast(_Msg, State) ->
      say("cast ~p, ~p.", [_Msg, State]),
      {noreply, State}.
    
    
    handle_info(_Info, State) ->
      say("info ~p, ~p.", [_Info, State]),
      {noreply, State}.
    
    
    terminate(_Reason, _State) ->
      say("terminate ~p, ~p", [_Reason, _State]),
      ok.
    
    
    code_change(_OldVsn, State, _Extra) ->
      say("code_change ~p, ~p, ~p", [_OldVsn, State, _Extra]),
      {ok, State}.
    
    %% Some helper methods.
    
    say(Format) ->
      say(Format, []).
    say(Format, Data) ->
      io:format("~p:~p: ~s~n", [?MODULE, self(), io_lib:format(Format, Data)]).
    

    Update 2010-01-04: I keep changing the actual contents of the template as I’m coding a little Erlang app. I’ve recently added, among other things, a call to get the state of the process, useful for debugging.