diff --git a/pe/chapter12.erl b/pe/chapter12.erl new file mode 100644 index 0000000..7ac0e47 --- /dev/null +++ b/pe/chapter12.erl @@ -0,0 +1,32 @@ +-module(chapter12). +-compile(exportall). +-export([start/2, registrar/0]). + +registrar(Client, {Name, Fun}) -> + case whereis(Name) of + undefined -> + Pid = spawn(Fun), + register(Name, Pid), + Client ! {ok, Name, Pid}; + Pid -> Client ! {error, exists, Pid} + end. + +registrar() -> + receive + {Client, {Name, Fun}} -> + registrar(Client, {Name, Fun}), + registrar(); + X -> io:format("Spurious message ~w received~n", [X]) + end. + +start(AnAtom, Fun) -> + %% start the registrar if it's not been started. + case whereis(registrar_proc) of + undefined -> + Pid = spawn(chapter12, registrar, []), + register(registrar_proc, Pid); + _ -> void + end, + registrar_proc ! {self(), {AnAtom, Fun}}, + receive X -> X end. + diff --git a/pe/processes.erl b/pe/processes.erl new file mode 100644 index 0000000..2d7cf78 --- /dev/null +++ b/pe/processes.erl @@ -0,0 +1,29 @@ +-module(processes). +-export([max/1]). + +%% max(N) +%% +%% Create N processes then destroy them +%% See how much time this takes +max(N) -> + Max = erlang:system_info(process_limit), + RealN = if N > Max -> Max; true -> N end, + io:format("Max allowed processes: ~p~n", [Max]), + statistics(runtime), + statistics(wall_clock), + L = for(1, RealN, fun() -> spawn(fun() -> wait() end) end), + {_, Time1} = statistics(runtime), + {_, Time2} = statistics(wall_clock), + lists:foreach(fun(Pid) -> Pid ! die end, L), + U1 = Time1 * 1000 / RealN, + U2 = Time2 * 1000 / RealN, + io:format("Process spawn time=~p (~p) microseconds~n", [U1, U2]). + +wait() -> + receive + die-> + void + end. + +for(N, N, F) -> [F()]; +for(I, N, F) -> [F()|for(I+1, N, F)].