%% ---
%%  Excerpted from "Programming Erlang",
%%  published by The Pragmatic Bookshelf.
%%  Copyrights apply to this code. It may not be used to create training material,
%%  courses, books, articles, and the like. Contact us if you are in doubt.
%%  We make no guarantees that this code is fit for any purpose.
%%  Visit http://www.pragmaticprogrammer.com/titles/jaerlang for more book information.
%%  
%%  日本語版の『プログラミングErlang』、およびサンプルコードについては、
%%   http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06714-3 を確認してください。
%% ---
%%START:all
-module(sellaprime_supervisor).
-behaviour(supervisor).		% erl -man supervisorを参照

-export([start/0, start_in_shell_for_testing/0, start_link/1, init/1]).

start() ->
    spawn(fun() ->
		  supervisor:start_link({local,?MODULE}, ?MODULE, _Arg = [])
	  end).

start_in_shell_for_testing() ->
    {ok, Pid} = supervisor:start_link({local,?MODULE}, ?MODULE, _Arg = []),
    unlink(Pid).

start_link(Args) ->
    supervisor:start_link({local,?MODULE}, ?MODULE, Args).

init([]) ->
    %% 自分用のエラーハンドラをインストールする
     gen_event:swap_handler(alarm_handler, 
                                   {alarm_handler, swap},
				   {my_alarm_handler, xyz}),

    {ok, {{one_for_one, 3, 10},
	  [{tag1, 
	    {area_server, start_link, []},
	    permanent, 
	    10000, 
	    worker, 
	    [area_server]},
	   {tag2, 
	    {prime_server, start_link, []},
	    permanent, 
	    10000, 
	    worker, 
	    [prime_server]}
	  ]}}.



%% スーパバイザは起動時にinit(Arg)を呼び出す。
%% この関数は{ok, {SupFlags, Children}}を返すことになっている。
%%
%% SupFlags : {supervision_strategy(), maxR(), maxT()}
%% supervision_strategy() : one_for_one | one_for_all | simple_one_for_one
%%
%% Children : [ChildStartSpecification]
%% ChildStartSpecification : {internal_name(),
%%                            {module(), function(), args()},
%%                            shutdown_time(),
%%                            child_type(),
%%                            modules()}
%% 詳細についてはerl -man supervisorを参照。
%%
%% MaxR/MaxTについての注意：
%% 適切な再起動間隔を決めるのは難しい。以下の考え方が参考になるかもしれない：
%%
%% - MaxRは問題の発覚が不必要に遅くならない程度に小さくするとよい。
%%   スーパバイザを複数層で構成している場合、MaxRは乗算で効いてくることに注意。
%%   最上位のスーパバイザにはMaxR=0を設定してもよいかもしれない。
%% - MaxTは無関係な再起動が再起動のループとして認識されない程度に小さくするとよい。
%%  （問題の影響が収束するにはどれだけ時間がかかるか考えてみよう）
%%   MaxTが小さすぎると、MaxR回の再起動のための時間を確保できなくなってしまう。
%%
%% 一般に、あるプロセスが再起動した場合にどうすべきかを考えるとよい。
%% 「カーネルプロセス」として設計されているようなプロセスの場合、クラッシュしたときの
%% 適切な対処はノードを終了させることだ。
%%
%% ここでは10秒間で3回の再起動を条件とした。
%%
