-module(prime_server). -export([start/1]). %% Run by calling: prime_server:start(Number of Digits) start(Digits) -> io:format("Creating a ~w digit random number~n", [Digits]), StartNum = lib_primes:make_random_int(Digits), Counter = spawn(counter, start, [StartNum]), %% Spawn checkers for stuff already online spawn_current_nodes(Counter, nodes()), io:format("Waiting for nodes to come online~n"), monitor([], [], Counter). spawn_current_nodes(Counter, Nodes) -> case Nodes of [] -> ok; [Node | T] -> io:format("~n~p is up.~n", [Node]), io:format("Nodes are now ~p~n", [nodes()]), spawn(checker, start, [Counter, Node]), spawn_current_nodes(Counter, T) end. monitor(UpFun, DownFun, Counter) -> case net_kernel:monitor_nodes(true) of ok -> receive {nodeup, Node} -> flush_nodedown_messages(), flush_nodeup_messages(), io:format("~n~p is up.~n", [Node]), io:format("Nodes are now ~p~n", [nodes()]), spawn(checker, start, [Counter, Node]), %%io:format("Spawned checker to handle new node ~w~n", [Node]), monitor(UpFun, DownFun, Counter); {nodedown, Node} -> flush_nodedown_messages(), flush_nodeup_messages(), io:format("~n~p is down.~n",[Node]), io:format("Nodes are now ~p~n", [nodes()]), monitor(UpFun, DownFun, Counter); Any -> io:format("Unknown message received in node_mon: ~w~n", [Any]), monitor(UpFun, DownFun, Counter) end; Other -> io:format("Unable to start monitor - ~w~n", [Other]) end. flush_nodedown_messages() -> receive {nodedown,_Node} -> flush_nodedown_messages() after 0 -> done end. flush_nodeup_messages() -> receive {nodeup,_Node} -> flush_nodeup_messages() after 0 -> done end.