FSM advantages?

Vance Shipley <>
Wed Jan 22 20:54:06 CET 2003


Eduardo,

The function gen_fsm:sync_send_event will fail when the timeout
is reached.  Take this example:

-module(test_fsm).
-behaviour(gen_fsm).
-export([start/0, init/1, one/3, two/3]).


start() ->
   gen_fsm:start_link(test_fsm, [], []).

init(Args) ->
   {ok, one, []}.

one(Event, From, State) ->
   {reply, one_two, two, State}.

two(Event, From, State) ->
   {next_state, one, State}.


Here the state handler for state "one" will return a reply.  The second 
state will not.  This is because the return for state one is {reply,..}
while the return for state two is {next_state,...} which does not return
a reply but simply transitions to the next state.


1> {ok, Pid} = test_fsm:start().
{ok,<0.30.0>}
2> gen_fsm:sync_send_event(Pid, foo).
one_two
3> gen_fsm:sync_send_event(Pid, foo).
** exited: {timeout,{gen_fsm,sync_send_event,[<0.30.0>,foo]}} **


In the second case the default timeout (5000) took place and then the
function failed.  The exit value was {timeout,...}.

To use this you either let the crash occur and use the system supervision
principles or you wrap the call to gen_fsm:sync_send_event with a catch:

case catch gen_fsm:sync_send_event(Pid, foo) of
	{'EXIT',{timeout, _} ->
		...
	Other ->
		...
end,


	-Vance



	-Vance




More information about the erlang-questions mailing list