summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillermo Ramos2012-05-11 00:49:36 +0200
committerGuillermo Ramos2012-05-11 00:49:36 +0200
commit5d8c20c0a91dbd58a1676581c4374ecb67e639a7 (patch)
tree15ef8efe0a214a088274c1db58408caeff29fdd2
parent67a898893884f229d64886a220ba422dd0d66e78 (diff)
download7l-5d8c20c0a91dbd58a1676581c4374ecb67e639a7.tar.gz
[Erlang] Día 3 (1/2)
-rw-r--r--erlang/coroner.erl15
-rw-r--r--erlang/doctor.erl25
-rw-r--r--erlang/monitor_doctor.erl20
-rw-r--r--erlang/monitor_translate.erl16
-rw-r--r--erlang/roulette.erl8
-rw-r--r--erlang/server.erl59
-rw-r--r--erlang/translate.erl9
-rw-r--r--erlang/translate_service.erl22
8 files changed, 174 insertions, 0 deletions
diff --git a/erlang/coroner.erl b/erlang/coroner.erl
new file mode 100644
index 0000000..bdda443
--- /dev/null
+++ b/erlang/coroner.erl
@@ -0,0 +1,15 @@
+-module(coroner).
+-export([loop/0]).
+
+loop() ->
+ process_flag(trap_exit, true),
+ receive
+ {monitor, Process} ->
+ link(Process),
+ io:format("Monitoring process.~n"),
+ loop();
+ {'EXIT', From, Reason} ->
+ io:format("The shooter ~p died with reason ~p.", [From, Reason]),
+ io:format("Start another one.~n"),
+ loop()
+ end.
diff --git a/erlang/doctor.erl b/erlang/doctor.erl
new file mode 100644
index 0000000..9f69429
--- /dev/null
+++ b/erlang/doctor.erl
@@ -0,0 +1,25 @@
+-module(doctor).
+-export([loop/0]).
+
+loop() ->
+ process_flag(trap_exit, true),
+ receive
+ die -> exit(doctor);
+ {monitorize, Process} ->
+ io:format("Doctor: monitoring ~p.~n", [Process]),
+ link(Process);
+ new_mon ->
+ io:format("Doctor: starting new monitor.~n"),
+ register(mon, spawn_link(monitor_doctor, loop, [])),
+ mon ! {mon, self()};
+ new_rev ->
+ io:format("Doctor: starting new revolver.~n"),
+ register(revolver, spawn_link(roulette, loop, []));
+ {'EXIT', _, mon} ->
+ io:format("Doctor: oh SWEET JESUS CHRIST, my monitor just DIED!~n"),
+ self() ! new_mon;
+ {'EXIT', _, revolver} ->
+ io:format("Doctor: The shooter died, restarting...~n"),
+ self() ! new_rev
+ end,
+ loop().
diff --git a/erlang/monitor_doctor.erl b/erlang/monitor_doctor.erl
new file mode 100644
index 0000000..537f59a
--- /dev/null
+++ b/erlang/monitor_doctor.erl
@@ -0,0 +1,20 @@
+-module(monitor_doctor).
+-export([loop/0]).
+
+loop() ->
+ process_flag(trap_exit, true),
+ receive
+ die -> exit(mon);
+ {monitorize, Doctor} ->
+ io:format("Monitor: monitoring ~p.~n", [Doctor]),
+ link(Doctor);
+ new_doc ->
+ io:format("Monitor: starting new doctor.~n"),
+ register(doc, spawn_link(doctor, loop, [])),
+ doc ! {monitorize, self()},
+ doc ! new_rev;
+ {'EXIT', From, _} ->
+ io:format("Monitor: doctor ~p died, restarting.~n", [From]),
+ self() ! new_doc
+ end,
+ loop().
diff --git a/erlang/monitor_translate.erl b/erlang/monitor_translate.erl
new file mode 100644
index 0000000..03e4bfe
--- /dev/null
+++ b/erlang/monitor_translate.erl
@@ -0,0 +1,16 @@
+-module(monitor_translate).
+-export([loop/0]).
+
+loop() ->
+ process_flag(trap_exit, true),
+ receive
+ new ->
+ io:format("Starting translator.~n"),
+ register(translator, spawn_link(translate_service, loop, [])),
+ loop();
+ {'EXIT', From, Reason} ->
+ io:format("Translator ~p died with reason ~p, restarting.~n",
+ [From, Reason]),
+ self() ! new,
+ loop()
+ end.
diff --git a/erlang/roulette.erl b/erlang/roulette.erl
new file mode 100644
index 0000000..06e532c
--- /dev/null
+++ b/erlang/roulette.erl
@@ -0,0 +1,8 @@
+-module(roulette).
+-export([loop/0]).
+
+loop() ->
+ receive
+ 3 -> io:format("bang~n"), exit(revolver);
+ _ -> io:format("click~n"), loop()
+ end.
diff --git a/erlang/server.erl b/erlang/server.erl
new file mode 100644
index 0000000..6769b68
--- /dev/null
+++ b/erlang/server.erl
@@ -0,0 +1,59 @@
+-module(server).
+-behaviour(gen_server).
+
+-export([main/0]).
+-export([start_link/0, stop/0]).
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,
+ code_change/3]).
+
+%%==============================================================================
+%% Server API
+%%==============================================================================
+
+start_link() ->
+ Result = gen_server:start_link({local, server}, server, [], []),
+ io:fwrite("Server started.~n"),
+ Result.
+
+stop() ->
+ gen_server:cast(server, shutdown).
+
+message(Msg) ->
+ gen_server:cast(server, Msg).
+
+
+%%==============================================================================
+%% gen_server callbacks
+%%==============================================================================
+
+init([]) ->
+ file:open("server_log.txt", [write]).
+
+handle_call(_Msg, _From, Fd) ->
+ {reply, ok, Fd}.
+
+handle_cast(shutdown, Fd) ->
+ {stop, normal, Fd};
+
+handle_cast(Msg, Fd) ->
+ io:fwrite("Server writing into file: '~p'.~n", [Msg]),
+ io:format(Fd, "~w~n", [Msg]),
+ {noreply, Fd}.
+
+code_change(_OldVsn, Fd, _Extra) ->
+ {ok, Fd}.
+
+terminate(_Reason, Fd) ->
+ io:fwrite("Server is shutting down.~n"),
+ file:close(Fd),
+ ok.
+
+handle_info(_Info, Fd) ->
+ {noreply, Fd}.
+
+main() ->
+ start_link(),
+ message(hoola),
+ message(blrblrlb),
+ message(wakawaka),
+ stop().
diff --git a/erlang/translate.erl b/erlang/translate.erl
new file mode 100644
index 0000000..2510c4c
--- /dev/null
+++ b/erlang/translate.erl
@@ -0,0 +1,9 @@
+-module(translate).
+-export([loop/0]).
+
+loop() ->
+ receive
+ "casa" -> io:format("house~n"), loop();
+ "blanca" -> io:format("white~n"), loop();
+ _ -> io:format("I don't understand.~n"), loop()
+ end.
diff --git a/erlang/translate_service.erl b/erlang/translate_service.erl
new file mode 100644
index 0000000..a19c5af
--- /dev/null
+++ b/erlang/translate_service.erl
@@ -0,0 +1,22 @@
+-module(translate_service).
+-export([loop/0, translate/2]).
+
+loop() ->
+ receive
+ die -> exit({translator,died,violently,at,erlang:time()});
+ {From, "casa"} ->
+ From ! "house",
+ loop();
+ {From, "blanca"} ->
+ From ! "white",
+ loop();
+ {From, _} ->
+ From ! "I don't understand.",
+ loop()
+ end.
+
+translate(To, Word) ->
+ To ! {self(), Word},
+ receive
+ Translation -> Translation
+ end.