[erlang-questions] gen_statem next_event and appending to the event queue

Raimo Niskanen raimo+erlang-questions@REDACTED
Wed Oct 4 11:20:09 CEST 2017

On Wed, Oct 04, 2017 at 11:03:33AM +0200, Frans Schneider wrote:
> Dear list,
> I have a state machine which implements the RTPS reader locator [1]. 
> Basically, it has a list of unsent changes which should be send one by 
> one to some transport. If the list is empty, the state becomes idle, 
> otherwise it keeps the state pushing and uses the state callback action 
> {next_event, internal, can_send} to process the next change from the list.
> However, the state machine also has to respond to some other events like 
> the one which will replace the list with unsent changes with a new one 
> (this is according to the specs.) But, since the callback action 
> next_event inserts events in front of the event queue, an event like 
> (re)setting the unsent changes list is only processed after all internal 
> events have been processed.
> Adding events to the back of the queue can of course be done using a 
> gen_statem:cast or a simple '!', but I would like to use a callback 
> action for this as well, which looks tidier and feels better. What about 
> adding an action {add_event, EventType, EventContent}?

The gen_statem {next_event,,} event queue is not intended to solve all
possible event queue problems, and in particular not intended to be a
complete event execution model which would create a language within
the language.  One may handle this with a specific queue in the state
e.g with the module 'queue'.

That said, there is a trick that might solve this problem, and that is to
use a timeout 0.  It is guaranteed to be handled by the state machine
before all external events.

> Frans
> [1] http://www.omg.org/spec/DDSI-RTPS/2.2/


/ Raimo Niskanen, Erlang/OTP, Ericsson AB

More information about the erlang-questions mailing list