mnesia_session_top_sup.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 209 行

ERL
209
字号
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%-module(mnesia_session_top_sup).%%%----------------------------------------------------------------------%%% Purpose : The top supervisor for mnesia_session%%%-----------------------------------------------------------------------behaviour(application).-behaviour(supervisor).-export([start/0, start/2, stop/1, init/1, 	 start_link_connector/1]).%% debug-export([kill/0, supervisor_timeout/1]).-define(SERVER_NAME, ?MODULE).-define(APPLICATION, mnesia_session).-define(VERBOSE(F, A),	mnesia_session_lib:verbose(F, A, mnesia_session_lib:get_env(debug))).%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% application and supervisor callback functionsstart(normal, Args) ->    SupName = {local,?MODULE},    case supervisor:start_link(SupName, ?MODULE, [Args]) of	{ok, Pid} ->	    {ok, Pid, {normal, Args}};	Error -> 	    Error    end;start(_, _) ->    {error, badarg}.start() ->    SupName = {local,?MODULE},    supervisor:start_link(SupName, ?MODULE, []).stop(_StartArgs) ->    ok.init([]) -> % Supervisor    init();init([[]]) -> % Application    init();init(BadArg) ->    {error, {badarg, BadArg}}.init() ->    mnesia_session_lib:get_initial_debug(),    Flags = {one_for_one, 4, 3600},    KillAfter = timer:seconds(1),    KA = supervisor_timeout(KillAfter),    GenServerProcs = gen_server_procs(KA),    CorbaProcs = corba_procs(KA),    Workers = GenServerProcs ++ CorbaProcs,    {ok, {Flags, Workers}}.session_sup_spec(Name) ->    Mods = [mnesia_session_sup, supervisor],    MFA = {mnesia_session_sup, start, [Name]},    {Name, MFA, permanent, infinity, supervisor, Mods}.    gen_server_procs(KA) ->    Name = mnesia_connector,    GenMod = mnesia_session_lib:get_env(gen_server_module),    ?VERBOSE("Env gen_server_module: ~p~n", [GenMod]),    Mods = [Name, GenMod, mnesia],    MFA = {?MODULE, start_link_connector, [Name]},    Conn = {Name, MFA, permanent, KA, worker, Mods},    SessionSup = session_sup_spec(mnesia_session_sup),        [Conn, SessionSup].corba_procs(KA) ->    case corba_enabled() of	false ->	    [];	true ->	    Name = mnesia_corba_connector,	    Mods = [Name, corba, mnesia],	    MFA = {?MODULE, start_link_connector, [Name]},	    Conn = {Name, MFA, permanent, KA, worker, Mods},	    [Conn]    end.corba_enabled() ->    EnabledCorba = mnesia_session_lib:get_env(enable_corba),    ?VERBOSE("Env enable_corba: ~p~n", [EnabledCorba]),    case EnabledCorba of	false -> 	    false;	true ->	    Appls = application:which_applications(),	    OrberStarted = lists:keymember(orber, 1, Appls),	    ?VERBOSE("orber application started: ~p~n",		 [OrberStarted]),	    case OrberStarted of		true -> true;		false -> exit(orber_not_started)	    end    end.start_link_connector(mnesia_connector) ->    Env = [],    Name = {local, mnesia_connector},    case mnesia_connector:oe_create_link(Env, Name) of	{ok, Pid} ->	    {ok, Pid};	Other ->	    Error = {connector_start_error, Other},	    ?VERBOSE("~p~n", [Error]),	    Other    end;%% Start a corba connector and  bind it to a namestart_link_connector(mnesia_corba_connector) ->    CorbaName = mnesia_session_lib:get_env(corba_connector_name),    ?VERBOSE("Env corba_connector_name: ~p~n", [CorbaName]),    catch	begin	    register_types(),	    Env = [],	    Opts = [{regname, {local, mnesia_corba_connector}},{sup_child,true}],	    CreateRes = (catch mnesia_corba_connector:oe_create_link(Env, Opts)),	    {ok, Pid, Key} = exit_to_error(CreateRes, corba_connector_create),	    NS = corba:resolve_initial_references("NameService"),	    BindRes = (catch 'CosNaming_NamingContext':bind(NS, CorbaName, Key)),	    ok = exit_to_error(BindRes, corba_bind_error),	    {ok, Pid}	end.exit_to_error(Result, Why) ->    case Result of	{'EXCEPTION', Reason} ->	    Error = {Why, {'EXCEPTION', Reason}},	    ?VERBOSE("~p~n", [Error]),	    throw({error, Error});	{'EXIT', Reason} ->	    Error = {Why, {'EXIT', Reason}},	    ?VERBOSE("~p~n", [Error]),	    throw({error, Error});	Other ->	    Other    end.    register_types() ->    TypeId = mnesia_corba_session:typeID(),    OE_IFR = orber_ifr:find_repository(),    case orber_ifr:'Repository_lookup_id'(OE_IFR, TypeId) of	[] ->	    RegRes = (catch oe_mnesia_corba_session:oe_register()),	    case exit_to_error(RegRes, corba_register_error) of		{error, Reason} ->		    throw({error, Reason});		ok ->		    ok	    end;	_ ->	    ok    end.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% debug functionskill() ->    Modules = mnesia_session_lib:ms(),    Kill = fun(Name) -> catch exit(whereis(Name), kill) end,    lists:foreach(Kill, Modules),    lists:foreach(fun ensure_dead/1, Modules),    timer:sleep(10),    Applications = application:which_applications(),    case lists:keymember(?APPLICATION, 1, Applications) of	true -> kill();	false -> ok    end.ensure_dead(Name) ->    case whereis(Name) of	undefined ->	    ok;	Pid when is_pid(Pid) ->	    exit(Pid, kill),	    timer:sleep(10),	    ensure_dead(Name)    end.-ifdef(debug_shutdown).supervisor_timeout(_KillAfter) -> timer:hours(500).-else.supervisor_timeout(KillAfter) -> KillAfter.-endif.    

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?