large gen_fsms
Richard Cameron
camster@REDACTED
Mon Mar 20 15:31:25 CET 2006
On 20 Mar 2006, at 13:43, Serge Aleynikov wrote:
> I wonder if someone could share their experience at dealing with
> large FSMs. We are in the midst of implementing an FSM which
> logically can be broken down in two groups of states. It would be
> good to be able to split these states among two separate modules,
> but gen_fsm doesn't allow to do this easily.
I always seem end up writing large FSMs as special processes (<http://
erlang.se/doc/doc-5.4.12/doc/design_principles/spec_proc.html>) and
simply doing things the old fashioned pure Erlang way:
state1() ->
receive
go_to_state_2 -> state2();
_ -> state1()
end.
state2() ->
receive
go_to_state_1 -> state1();
go_to_state_3 -> state2()
end.
...
Something like that would let you split the states over multiple
modules (assuming you can keep a mental image of the maze of cross-
module calls in your head).
The problem always find I have with gen_fsm is that events need to be
dealt with immediately. You've got the option to either pattern match
with a "don't care" variable to simply ignore an event if it occurs
when you don't want it, or you can have the FSM abnormally. What you
can't do is queue the event up to be dealt with when the FSM moves
into a more appropriate state.
I generally find that I want precisely this behaviour in at least one
of my states (and this becomes more likely the bigger the FSM is). As
Erlang's syntax is almost ideal of writing FSMs anyway, I just don't
find gen_fsm adding much (other than taking care of OTP system
messages automatically.).
Richard.
More information about the erlang-questions
mailing list