diff options
Diffstat (limited to 'lib/percept/doc/src/ipc_tree.erl')
-rw-r--r-- | lib/percept/doc/src/ipc_tree.erl | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/percept/doc/src/ipc_tree.erl b/lib/percept/doc/src/ipc_tree.erl new file mode 100644 index 0000000000..89360379c6 --- /dev/null +++ b/lib/percept/doc/src/ipc_tree.erl @@ -0,0 +1,30 @@ +-module(ipc_tree). +-export([go/1, init/2]). + +go(N) -> + start(N, self()), + receive {_,stop} -> ok end. + +start(Depth, ParentPid) -> + spawn(?MODULE, init, [Depth, ParentPid]). + +init(0, ParentPid) -> + workload(5000), + ParentPid ! {self(),stop}, + ok; +init(Depth, ParentPid) -> + Pid1 = spawn(?MODULE, init, [Depth - 1, self()]), + Pid2 = spawn(?MODULE, init, [Depth - 1, self()]), + main([Pid1,Pid2], ParentPid). + +main(Pids, ParentPid) -> + workload(5000), + gather(Pids), + ParentPid ! {self(),stop}, + ok. + +gather([]) -> ok; +gather([Pid|Pids]) -> receive {Pid,stop} -> gather(Pids) end. + +workload(0) -> ok; +workload(N) -> math:sin(2), workload(N - 1). |