aboutsummaryrefslogtreecommitdiffstats
path: root/system/doc/tutorial/complex2.erl
diff options
context:
space:
mode:
Diffstat (limited to 'system/doc/tutorial/complex2.erl')
-rw-r--r--system/doc/tutorial/complex2.erl45
1 files changed, 45 insertions, 0 deletions
diff --git a/system/doc/tutorial/complex2.erl b/system/doc/tutorial/complex2.erl
new file mode 100644
index 0000000000..93d00dab6b
--- /dev/null
+++ b/system/doc/tutorial/complex2.erl
@@ -0,0 +1,45 @@
+-module(complex2).
+-export([start/1, stop/0, init/1]).
+-export([foo/1, bar/1]).
+
+start(ExtPrg) ->
+ spawn(?MODULE, init, [ExtPrg]).
+stop() ->
+ complex ! stop.
+
+foo(X) ->
+ call_port({foo, X}).
+bar(Y) ->
+ call_port({bar, Y}).
+
+call_port(Msg) ->
+ complex ! {call, self(), Msg},
+ receive
+ {complex, Result} ->
+ Result
+ end.
+
+init(ExtPrg) ->
+ register(complex, self()),
+ process_flag(trap_exit, true),
+ Port = open_port({spawn, ExtPrg}, [{packet, 2}, binary]),
+ loop(Port).
+
+loop(Port) ->
+ receive
+ {call, Caller, Msg} ->
+ Port ! {self(), {command, term_to_binary(Msg)}},
+ receive
+ {Port, {data, Data}} ->
+ Caller ! {complex, binary_to_term(Data)}
+ end,
+ loop(Port);
+ stop ->
+ Port ! {self(), close},
+ receive
+ {Port, closed} ->
+ exit(normal)
+ end;
+ {'EXIT', Port, Reason} ->
+ exit(port_terminated)
+ end.