From a2f3c685b5aeac798e12302cf8fe7df13184b669 Mon Sep 17 00:00:00 2001 From: Raimo Niskanen Date: Fri, 15 Apr 2016 10:09:54 +0200 Subject: Introduce corrections from Fred Hebert and Ingela --- lib/stdlib/doc/src/gen_statem.xml | 2 +- system/doc/design_principles/statem.xml | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/stdlib/doc/src/gen_statem.xml b/lib/stdlib/doc/src/gen_statem.xml index bd70c4c37e..c21398d64d 100644 --- a/lib/stdlib/doc/src/gen_statem.xml +++ b/lib/stdlib/doc/src/gen_statem.xml @@ -45,7 +45,7 @@ using this module will have a standard set of interface functions and include functionality for tracing and error reporting. It will also fit into an OTP supervision tree. Refer to - + OTP Design Principles for more information. diff --git a/system/doc/design_principles/statem.xml b/system/doc/design_principles/statem.xml index 65daeac782..02754bd23d 100644 --- a/system/doc/design_principles/statem.xml +++ b/system/doc/design_principles/statem.xml @@ -90,7 +90,7 @@ State(S) x Event(E) -> Actions(A), State(S')
 StateName(EventType, EventContent, Data) ->
     .. code for actions here ...
-    {next_state, StateName', Data'}.
+ {next_state, NewStateName, NewData}.

In the mode handle_event_function there is only one Erlang function that implements all state transition rules: @@ -612,7 +612,7 @@ stop() -> An example of event postponing comes in later in this chapter. See the - documentation + reference manual for details. You can for example actually reply to several callers and generate multiple next events to handle. @@ -735,7 +735,8 @@ open(cast, {button,_}, Data) -> erlang:cancel_timer(Tref). Note that a timeout message can not arrive after this, - unless you have postponed it before (why on earth one would do that). + unless you have postponed it (see the next section) before, + so make sure you do not accidentally postpone such messages.

Another way to cancel a timer is to not cancel it, @@ -837,15 +838,25 @@ do_unlock() -> The selective receive in this case causes open to implicitly postpone any events to the locked state.

+

+ A selective receive can not be used from a gen_statem + behaviour just as for any gen_* behavior + since the receive statement is within the gen_* engine itself. + It has to be there because all + sys + compatible behaviours must respond to system messages and therefore + do that in their engine receive loop, + passing non-system messages to the callback module. +

The state transition action postpone is designed to be able to model - selective receive. Selective receive implicitly postpones + selective receives. A selective receive implicitly postpones any not received events, but the postpone - state transition action explicitly postpones a received event. + state transition action explicitly postpones one received event.

Other than that both mechanisms have got the same theoretical -- cgit v1.2.3