EP Exercise 4-2: The Process Ring
2 November 2011 Leave a Comment
My solution for Exercise 4-2 in the book Erlang Programming
%%
%% Erlang Programming Exercise 4-2
%%
-module(ring).
-export([start/3,create_node/3,stop/0]).
create_node(M,N,Msg) ->
io:format("Creating node ~w (~w)~n", [N,self()]),
if
N-1 > 0 -> NextPid = spawn(ring,create_node,[M,N-1,Msg]);
N-1 == 0 -> NextPid = head
end,
print_m_times(NextPid,N,Msg,M),
loop(NextPid).
start(M, N, Msg) ->
io:format("Spawning ~w nodes!~n",[N]),
Pid = spawn(ring,create_node,[M,N,Msg]),
register(head, Pid),
ok.
stop() ->
head ! quit,
ok.
loop(NextPid) ->
receive
{print, Pid, NodeNum, MsgContents} when Pid /= self() ->
io:format("(~w) msg from node ~w: ~s~n",[self(),NodeNum,MsgContents]),
NextPid ! {print, Pid, NodeNum, MsgContents},
loop(NextPid);
quit ->
NextPid ! quit,
io:format("Destroying node (~w)~n", [self()]),
true
end.
print_m_times(_,_,_,0) ->
true;
print_m_times(NextPid,FromNode,Msg,M_Times) ->
NextPid ! {print, self(), FromNode, Msg},
print_m_times(NextPid,FromNode,Msg,M_Times-1).
Advertisement