[erlang-questions] non-FIFO behavior in process mailboxes?
Michael Turner
michael.eugene.turner@REDACTED
Sun Apr 22 18:25:21 CEST 2012
When the code listed below executes with the first io:format call
commented out, it breaks, reporting:
** exception error: no match of right hand side value []
in function wg:init/0
When I don't have it commented out, it works (sort of), writing
val_for (P)=[]
val_for (P)=2
ok
Here's the code:
-----
-module(wg).
-export ([init/0, be/2]).
val_for (P) ->
P ! {tell, self(), val},
receive
{Val, for, P} -> Val
end.
be (Arg, Val) ->
receive
[H|T] ->
self() ! T,
self() ! H,
be (Arg, Val);
[] ->
be (Arg, Val);
{tell, X, val} ->
X ! {Val, for, self()},
be (Arg, Val);
{set_arg_to, A} ->
be (A, Val);
{set_val_to, V} ->
be (Arg, V)
end.
init() ->
P = spawn (wg, be, [[],[]]),
P ! [{set_arg_to, 1}, {set_val_to, 2}],
% io:format ("val_for (P)=~p~n", [val_for (P)]),
2 = val_for (P),
io:format ("val_for (P)=~p~n", [val_for (P)]),
ok.
-----
This is R14B on Windows XP. Haven't tried it elsewhere yet.
Seeing this really messes with my mental model of process mailboxes.
With the first io:format call commented out, I think process P should
be seeing messages queued up in the following order:
[{set_arg_to, 1}, {set_val_to, 2}]
[{set_val_to, 2}]
{set_arg_to, 1}
[]
{set_val_to, 2}
{tell, X, val}
And shouldn't this mean that Val = 2 in process P when the {tell, X,
val} message reaches P? As I interpret Armstrong pp.145-6, since
matches are guaranteed in this case, there's no save queue activity;
since there's no "after" close, the timer is irrelevant; so you should
get pure FIFO behavior, right?
-michael turner
More information about the erlang-questions
mailing list