[erlang-questions] gen_statem confusion

Vans S <>
Thu Jan 19 17:15:54 CET 2017


Yea ignore that. That is because I was not up to R19.2 when I tested. 
Let me get up to date.



On Thursday, January 19, 2017 11:08 AM, Vans S <> wrote:
Actually I jumped the gun here:


using a state_timeout as next event which is a valid 
event_type() as said in the docs produces:

** Reason for termination = error:{bad_action_from_state_function,
{next_event,state_timeout,hi}}
So state_timeout cant be used here. 

timeout,  cast, info can be used.

{call, pid()} also cant be used. 




On Thursday, January 19, 2017 11:01 AM, Vans S <> wrote:
> So if you in a state callback insert more next_event messages these are
> inserted first in the queue, and a state_timeout 0 message is inserted last
> in the queue.

This clarifies things nicely.  Also what if one was to use {next_event, state_timeout .. vs {state_timeout ..
Also is there a priority such as external, internal, timeout, state_timeout, etc?

Or anything with next_event goes first into the queue (or top of stack if using {next_event, external .. ?) 
regardless queue or stack the idea is the same, it will be first to dequeue/pop. And this will happen before receive 
is called.





On Thursday, January 19, 2017 5:14 AM, Raimo Niskanen <> wrote:
On Thu, Jan 19, 2017 at 11:59:37AM +0300, Alex S. wrote:

> 
> > 19 янв. 2017 г., в 6:01, Vans S <> написал(а):
> > 
> > 
> > 
> > This wording is really confusing:
> > 
> >> instead the the time-out event is enqueued to ensure 
> >> that it gets processed before any not yet received 
> >> external event
> > Because when I tried a test case
> > 
> > init() ->
> >  send(self(), hi),
> >  {_,_,_,0}.  %0 timeout basically
> > 
> > The 0 timeout procced before the 'hi' message.
> > Using 1 as the timeout, 'hi' message procs first.
> > 
> > But it says not yet received external event.  To me send() seems like 
> > an external event. Hence confusing.
> Well, it was sent, but not yet received by the gen_statem’s main loop.

Perfectly correct.

While gen_statem processes enqueued events it is guaranteed to not enter a
receive statement, so no new messages are received until after ther
state_timeout 0 message.

Other enqueued messages that are being processed such as next_event
messages will be processed before a state_timeout 0 message.

So if you in a state callback insert more next_event messages these are
inserted first in the queue, and a state_timeout 0 message is inserted last
in the queue.
-- 

/ Raimo Niskanen, Erlang/OTP, Ericsson AB
_______________________________________________
erlang-questions mailing list

http://erlang.org/mailman/listinfo/erlang-questions


More information about the erlang-questions mailing list