[erlang-questions] how: cascading events in gen_fsm

jm jeffm@REDACTED
Tue Nov 27 23:20:59 CET 2007


The problem: I'm using gen_fsm to model a network protocol based on 
messages. For the most part the messages are <<runlength, 
message:runlength/binary>>, except for a few special cases in the 
initial handshake. The messages are sent over TCP, but there is no 
guarantee that a complete message or only one message will arrive in a 
packet. To get around this a queue is mantained as part of the state record,

-record(state, {
                 queue
                 ....
                }).


which is used to hold the bytes recieved but are yet to be processed. 
When there are bytes remaining after processing the current state the 
remainder is placed on the queue and

gen_fsm:send_event(self(), {msg, <<>>}),
{next_state, new_state, State#{queue = Remainder}}.

is executed to cause the gen_fsm process to jump to the next state and 
continue processing. Two questions,

1) Can anyone see a problem doing it this way (race conditions, etc)?
2) Is there a better way to cascade states with gen_fsm?


Jeff.



More information about the erlang-questions mailing list