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

Anthony Kong anthony.hw.kong@REDACTED
Mon Jan 28 13:54:14 CET 2008

Hi, all,

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

I have again written a simple script:


-export([isprime/1, test_if_divisible/2]).

isprime(2) ->

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(0) ->
isprime_poll(NumVote) ->
    {'EXIT', _Pid, nondivisible} ->
        isprime_poll(NumVote - 1);
    {'EXIT', _Pid, divisible} ->

test_if_divisible(N, Div) ->
  case N rem Div of
    0 -> exit(divisible);
    _ -> exit(nondivisible)

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).
(abort... then start erl again)
2> p3:isprime(7).

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).
2> p3:isprime(6).
3> p3:isprime(7).
4> p3:isprime(7).

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
4) If I made some obvious programming mistakes, please feel free to point out



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

- Linus Torvalds

More information about the erlang-questions mailing list