[erlang-questions] newbie: how to clear a mailbox of a process?

Matthias Lang <>
Mon Jan 28 14:17:13 CET 2008


Anthony Kong writes:

 > Sorry, I don't think the subject line makes much sense. Hopefully if
 > you read on, the example may speak for itself.

It's hard to know which parts of your example are intentionally
pointless, so I'll stick to the question in the subject line.

I can think of two ways to clear a process' mailbox. Either, you kill
the process, or you consume the messages. One way to kill a process is
suicide, perhaps preceeded by a message.

Matt

----------------------------------------------------------------------

 > 
 > I have again written a simple script:
 > 
 > =======
 > 
 > -module(p3).
 > -export([isprime/1, test_if_divisible/2]).
 > 
 > isprime(2) ->
 >   true;
 > 
 > isprime(N) when N > 2 ->
 >   C = lists:seq(2, N - 1),
 >   process_flag(trap_exit, true),
 >   lists:map(fun(Div) -> spawn_link(fun() -> test_if_divisible(N, Div)
 > end) end, C),
 >   isprime_poll(length(C)).
 > 
 > 
 > isprime_poll(0) ->
 >   true;
 > isprime_poll(NumVote) ->
 >   receive
 >     {'EXIT', _Pid, nondivisible} ->
 >         isprime_poll(NumVote - 1);
 >     {'EXIT', _Pid, divisible} ->
 >         false
 >   end.
 > 
 > 
 > test_if_divisible(N, Div) ->
 >   case N rem Div of
 >     0 -> exit(divisible);
 >     _ -> exit(nondivisible)
 >   end.
 > =======
 > 
 > The idea of this script are
 > 1) in order to check if a number, says N, is a prime or not, the
 > script will fire a process to test divisibility by each possible
 > divisor (in the range of 2 to N - 1)
 > 2) these processes are 'voting': if all these processes vote that N is
 > not divisible, then N is a prime
 > 3) I want to short circuit the voting process by looking for
 > 'non-divisible' exit message. If I got one, the isprime_poll/1 will
 > abort the tail-recursion and return false
 > 
 > So, if I run the following tests, they produces results as expected,
 > *provided* that I do not run them in one go:
 > 
 > 2> p3:isprime(6).
 > false
 > ...
 > (abort... then start erl again)
 > ...
 > 2> p3:isprime(7).
 > true
 > 
 > 
 > If I run like these 2 statements in the same shell, however, then what
 > I got is a wrong answer for 7.
 > 
 > 1> l(p3).
 > {module,p3}
 > 2> p3:isprime(6).
 > false
 > 3> p3:isprime(7).
 > false
 > 4> p3:isprime(7).
 > true
 > 
 > I believe it is because that while I make isprime_poll/1 return false
 > on first 'nondivisible' message, those remaining messages sent from
 > other processes are still in the mailbox. So if I immedately run
 > isprime(7) after isprime(6), it'll take in these messages from last
 > session and hence make a wrong conclusion.
 > 
 > So, here is my questions:
 > 
 > 1) Is it possible to force clearance of a process's mailbox?
 > 2) What is the usual 'pattern' for implementation of a
 > voting/committee algorithm?
 > 3) For testing I want to run the script noninteractively using command
 > line e.g. "/opt/erlang/otp-R12B-0/bin/erl  -run p3 isprime 7 -s init
 > stop -noshell" but I cannot get it to work. (I am getting badarith
 > exception and core dump. Did I miss some parameters in the command
 > line?
 > 4) If I made some obvious programming mistakes, please feel free to point out
 > 
 > Cheers,
 > 
 > Anthony
 > 
 > 
 > 
 > 
 > 
 > -- 
 > /*--*/
 > Don't EVER make the mistake that you can design something better than
 > what you get from ruthless massively parallel trial-and-error with a
 > feedback cycle. That's giving your intelligence _much_ too much
 > credit.
 > 
 > - Linus Torvalds
 > _______________________________________________
 > erlang-questions mailing list
 > 
 > http://www.erlang.org/mailman/listinfo/erlang-questions
 > 



More information about the erlang-questions mailing list