gen_fsm

Van Oudheusden <>
Fri Jun 22 14:36:42 CEST 2001


Hello again,


It's firday afternoon and I'm getting a bit impatient with the code (see
attachment). It's a simple instantiation of the 'gen_fsm' behaviour.
Could somebody please tell me what I am doing wrong?


Besides that, I have a more fundamental question:  If I am not mistaken,
the implementation of gen_fsm implies that one or more processes are
spawned.  My question is whether it is a good idea to keep this issue
transparent from the user who is using the behaviour.  Doesn't this
influence the performance of his implementation?  How efficient is a
behavriour with respect to inheritance in an onject oriented program in
which the same design pattern is implemented?


any comments are welcome,
KVO.
-------------- next part --------------
-module(fsmkvo).
-behaviour(gen_fsm).

-import(lists, [append/2]).

%% --------------------------------------------------------------------
%% CALLBACK functions:
%% --------------------------------------------------------------------
%% Initialisation routine:
init(Args) ->
	{ok, sleeping, [1]}.

%% Termination routine:
terminate(Reason,State,Data) -> 
	ok.

%% Stop the FSM no matter what state it is in:
handle_event(stopit, AnyState, TheStateData) ->
	{stop, stopInvocation, []};

%% Print the State Data of the Current State of the FSM:
handle_event(printState, AnyState, TheStateData) ->
	io:format(" Currently in state  ~w~n", [AnyState]),
	io:format(" with state data: ~w~n", [TheStateData]),
	io:format(" ~n"),
	{next_state, AnyState, TheStateData}.

%% The STATE MACHINE:

sleeping({eat}, Data) ->
	%% ... actions for change from sleep to eat ...
	{next_state, eating, lists:append(Data,[2])}.

eating({work}, Data) ->
	{next_state, working, lists:append(Data,[3])}.

working({sleep}, Data) ->
	{next_state, sleeping, lists:append(Data,[4])};

working({eat}, Data) ->
	{next_state, eating, lists:append(Data,[5])}.
%% --------------------------------------------------------------------
%% CALLBACK end.
%% --------------------------------------------------------------------

%% ----------------------------------------------------------------------------------------------------------------

%% --------------------------------------------------------------------
%% interface routines:
%% --------------------------------------------------------------------
start() ->
	gen_fsm:start({local,fsmkvo}, fsmkvo, [], []).

letsEat() ->
	gen_fsm:send_event(fsmkvo, {eat}).

letsWork() ->
	gen_fsm:send_event(fsmkvo, {work}).

letsSleep() ->
	gen_fsm:send_event(fsmkvo, {sleep}).

printState() ->
	gen_fsm:send_all_state_event(fsmkvo, printState).

stop() ->
	gen_fsm:send_all_state_event(fsmkvo, stopit).
%% --------------------------------------------------------------------
%% interface end.
%% --------------------------------------------------------------------





More information about the erlang-questions mailing list