diff options
author | Guillermo Ramos | 2012-05-11 00:49:36 +0200 |
---|---|---|
committer | Guillermo Ramos | 2012-05-11 00:49:36 +0200 |
commit | 5d8c20c0a91dbd58a1676581c4374ecb67e639a7 (patch) | |
tree | 15ef8efe0a214a088274c1db58408caeff29fdd2 | |
parent | 67a898893884f229d64886a220ba422dd0d66e78 (diff) | |
download | 7l-5d8c20c0a91dbd58a1676581c4374ecb67e639a7.tar.gz |
[Erlang] Día 3 (1/2)
-rw-r--r-- | erlang/coroner.erl | 15 | ||||
-rw-r--r-- | erlang/doctor.erl | 25 | ||||
-rw-r--r-- | erlang/monitor_doctor.erl | 20 | ||||
-rw-r--r-- | erlang/monitor_translate.erl | 16 | ||||
-rw-r--r-- | erlang/roulette.erl | 8 | ||||
-rw-r--r-- | erlang/server.erl | 59 | ||||
-rw-r--r-- | erlang/translate.erl | 9 | ||||
-rw-r--r-- | erlang/translate_service.erl | 22 |
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. |