[erlang-questions] EPmail-0.1 released

Jachym Holecek <>
Sat Jan 29 15:14:02 CET 2011


# Alexander Kuleshov 2011-01-29:
> Thank you Johan for help.
> 
> I try to supervisor start_child gen_gsm:
> 
> accept(Socket) ->
>    case gen_tcp:accept(Socket) of
>        {ok, Sock} ->
              Pid = popd_sup:add_socket(Sock),
	      ok = gen_tcp:controlling_process(Sock, Pid),
	      popd_fsm:kick(Pid),
	      accept(Socket);
	  [...]

Where popd_sup exports:

    add_socket(Sock) ->
        Child = {Sock, {popd_fsm, start_link, [Sock, [], []]},
                 temporary, 2000, worker, [popd_fsm]},
        {ok, Pid} = supervisor:start_child(popd_sup, Child),
	Pid.

Note unique child Id this time and more suitable restart strategy. I'd keep
the supervisor one_for_one, but that's just because I don't like
simple_one_for_one much for no clear reason.

And popd_fsm has something like:

    kick(Pid) ->
        catch gen_fsm:send_event(Pid, kick),
        ok.

    [...]

    initial(kick, #state{sock = Sock} = State) ->
	ok = inet:setopts(Sock, [{active, once}]),
        ok = gen_tcp:send(Sock, "+OK POP3 server ready \r\n"),
	{next_state, whatever, State};

Besides fixing bugs that others already pointed out, I suppose my point is
to encapsulate functionality into modules that actually provide it instead
of scattering "lowlevel" calls (supervisor:start_child/X, gen_server:call/X,
gen_fsm:send_event/X and such) all around the place.

Anyway, this is just a quick sketch written without much thought...

HTH,
	-- Jachym


More information about the erlang-questions mailing list