FSM advantages?

Vance Shipley <>
Wed Jan 22 19:48:51 CET 2003


Eduardo,

You should also note that you can set a timeout as the FSM enters each
state.  Your callback function for init may return:

	{ok, idle, #s{}, 4000}

In which case it will enter state "idle" and if no event is received
in four seconds the event "timeout" will be received. 

idle(seize, State) ->
	...
	{next_state, seized, State, 1000}.
idle(timeout, State) ->
	...
	{next_state, idle, State, 4000}.

Each state handler, as well as handle_event/3, handle_sync_event/4 and
handle_info/3, may include a timeout in their return.

In addition to this method you can of course use timers explicitly:

idle(seize, State) ->
        ...     
	{ok, TimerReference} = timer:apply_after(1000,
			gen_fsm, send_event, [self(), seize_timer]),
	NewState#s{seize_ref = TimerReference};
        {next_state, seized, NewState}.


seized(seize_timer, State) ->
	...
seized(Other, State) ->
	timer:cancel(State#s.seize_ref),
	...


On Thu, Jan 23, 2003 at 03:18:01PM +0100, Eduardo Figoli wrote:
}  
}  Thank you I've found the  function
}  sync_send_event(FsmRef, Event, Timeout) -> Reply
}  which does exactly what I need.
}  
}  I just only need to know what's the reply term when the Timeout ocurr?
}  
}  
}  Regards,
}  Eduardo Figoli
}  INSwitch Solutions

This doesn't seem to be documented does it?  I don't know the answer as 
I've never found a reason to program synchronously in Erlang.  Try it and
see.  I suspect the answer is the atom timeout.

	-Vance




More information about the erlang-questions mailing list