[erlang-questions] How exactly Erlang receive expression works?
Athanasios Valsamakis
athanasios.valsamakis@REDACTED
Sat Mar 17 09:51:54 CET 2018
I think the timer should also be cleared in an earlier step.
On Fri, Mar 16, 2018 at 7:37 PM, Athanasios Valsamakis <
athanasios.valsamakis@REDACTED> wrote:
> Mr. Xavier, you are absolutely right!
>
> Thank you for pointing my error.
>
> Is the following flowchart closer to the truth?
>
>
> +-----------------+
> | Enter receive. | ** Timer may have already been
> elapsed
> | Start timer | when entering this state.
> +------+----------+
> |
> +-----v------+ +--------------------------------+
> | is mailbox | Yes | suspend process until |timer
> elapsed
> +------> empty? +------------> a new message is put in
> mailbox+-----------------+
> | | | | or timer has elapsed** |
> |
> | +------------+ +-----+--------------------------+
> +-------------v---------------------+ +-------------------+
> | |No | |if
> any messages have been put into | | evaluate |
> | +------v----------------+ |new msg arrived |the
> save queue, are reentered +-----> expressionsTimeout|
> | | take the head message | |
> |into the mailbox | | |
> | | from the mailbox <--------+
> +-----------------------------------+ +--------+----------+
> | +------+----------------+
> |
> | |
> +-----------------------------------+ +-------------+ |
> | +-----v-------------+ +---------------+ |if any messages
> have been put into +----->evaluate +---------->
> | | match the message +---->remove message +----->the save queue, are
> reentered | |expressions1 | |
> | | against pattern1 |Yes |from mailbox | |into the mailbox
> | +-------------+ |
> | +-------------------+ +---------------+
> +-----------------------------------+ |
> | |No
> |
> | |
> |
> | +-----v-------------+ +---------------+
> +-----------------------------------+ +-------------+ |
> | | match the message +---->remove message +----->if any messages
> have been put into +----->evaluate +---------->
> | | against pattern2 |Yes |from mailbox | |the save queue, are
> reentered | |expressions2 | |
> | +-------------------+ +---------------+ |into the mailbox
> | +-------------+ |
> | |No
> +-----------------------------------+ |
> | |
> |
> | +-----v-------------+ +---------------+
> +-----------------------------------+ +-------------+ |
> | | match the message +---->remove message +----->if any messages
> have been put into +----->evaluate +---------->
> | | against pattern3 |Yes |from mailbox | |the save queue, are
> reentered | |expressions3 | |
> | +-------------------+ +---------------+ |into the mailbox
> | +-------------+ |
> | |No
> +-----------------------------------+ |
> | |
> |
> | +-----v------------------------------+
> |
> | | message is removed from the mailbox|
> |
> +------+ and put into a "save queue" |
> |
> | |
> |
> +------------------------------------+
> |
>
> |
> +------------------+
> |
> | Exit receive. <-----------------------------
> ----------------------------------------------------------------+
> | Timer is cleared.|
> +------------------+
>
>
>
>
>
>
> On Fri, Mar 16, 2018 at 4:57 PM, Xavier Noria <fxn@REDACTED> wrote:
>
>> I think there is a detail that does not square.
>>
>> Take this example[*]:
>>
>> -module(foo).
>> -export([start/0]).
>>
>> start() ->
>> self() ! matched_by_b,
>> self() ! matched_by_a,
>> a(),
>> halt().
>>
>> a() ->
>> receive
>> matched_by_a ->
>> io:format("matched by a/0~n"),
>> b()
>> end.
>>
>> b() ->
>> receive
>> matched_by_b ->
>> io:format("matched by b/0~n")
>> end.
>>
>>
>> According to your (very nice!) diagram, this program should hang, because
>> when b/0 is invoked, the message `matched_by_b` has already been moved into
>> the save queue, and b/0 is called *while* the expression that matches
>> `matched_by_a` is evaluated. The diagram says `matched_by_b` is not in the
>> mailbox at that point.
>>
>> But the program terminates, ergo reductio ad absurdum :).
>>
>> I guess that diagram comes from the algorithm outlined on page 194 of the
>> book. I believe you need to factor in step (5).
>>
>> Xavier
>>
>> [*] erlc foo.erl && erl -noshell -run foo
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20180317/2fdcec75/attachment.htm>
-------------- next part --------------
+-----------------+
| Enter receive. | ** Timer may have already been elapsed
| Start timer | when entering this state.
+------+----------+
|
+-----v------+ +--------------------------------+
| is mailbox | Yes | suspend process until |timer elapsed
+------> empty? +------------> a new message is put in mailbox+-----------------+
| | | | or timer has elapsed** | |
| +------------+ +-----+--------------------------+ +-------------v---------------------+ +-------------------+
| |No | |if any messages have been put into | | evaluate |
| +------v----------------+ |new msg arrived |the save queue, are reentered +-----> expressionsTimeout|
| | take the head message | | |into the mailbox timer is cleared | | |
| | from the mailbox <--------+ +-----------------------------------+ +--------+----------+
| +------+----------------+ |
| | +-----------------------------------+ +-------------+ |
| +-----v-------------+ +---------------+ |if any messages have been put into +----->evaluate +---------->
| | match the message +---->remove message +----->the save queue, are reentered | |expressions1 | |
| | against pattern1 |Yes |from mailbox | |into the mailbox, timer is cleared | +-------------+ |
| +-------------------+ +---------------+ +-----------------------------------+ |
| |No |
| | |
| +-----v-------------+ +---------------+ +-----------------------------------+ +-------------+ |
| | match the message +---->remove message +----->if any messages have been put into +----->evaluate +---------->
| | against pattern2 |Yes |from mailbox | |the sa^e queue, are reentered | |expressions2 | |
| +-------------------+ +---------------+ |into the mailbox timer is cleared | +-------------+ |
| |No +-----------------------------------+ |
| | |
| +-----v-------------+ +---------------+ +-----------------------------------+ +-------------+ |
| | match the message +---->remove message +----->if any messages have been put into +----->evaluate +---------->
| | against pattern3 |Yes |from mailbox | |the save queue, are reentered | |expressions3 | |
| +-------------------+ +---------------+ |into the mailbox timer is cleared | +-------------+ |
| |No +-----------------------------------+ |
| | |
| +-----v------------------------------+ |
| | message is removed from the mailbox| |
+------+ and put into a "save queue" | |
| | |
+------------------------------------+ |
|
+--------------+ |
| Exit receive <-------------------------------------------------------------------------------------------------+
+--------------+
More information about the erlang-questions
mailing list