⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boot_code_loader.erl

📁 OTP是开放电信平台的简称
💻 ERL
字号:
%% ``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 2002, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id $%%-module(boot_code_loader).%% -compile(export_all).-export([startMeUp/0, startMeUp/1, libDir/0, prim_loaded/1,	 include_file/2, ensure_loaded/1, go/1]).-import(lists, [member/2]).%% The EARS directory is found as follows%% 1) The current directory%% 2) The environment variable $ERLANG_EARS%% 3) The fixed directory /usr/local/lib/erlsae/lib%% The *first* directory which contains the file%% erlang.ear will be assumed to be the lib%% directorydefault_dir() ->    "/usr/local/lib/erlsae/lib".    startMeUp() ->    startMeUp(libDir()).libDir() ->    %% erlang:display({checking,"."}),    case boot_fprim:read_file_info("erlang.ear") of	{ok, _} ->  ".";	_       ->  libDir1()    end.libDir1() ->    case os:getenv("ERLANG_EARS") of	false -> libDir2();	Dir0  ->	    Dir = expand_env(Dir0),	    %% erlang:display({checking, Dir}),	    case boot_fprim:read_file_info(Dir ++ "/erlang.ear") of		{ok, _} -> Dir;		_       -> libDir2()	    end    end.libDir2() ->    D1 = default_dir(),    %% erlang:display({checking, D1}),    case boot_fprim:read_file_info(D1 ++ "/erlang.ear") of	{ok, _} -> D1;	_       -> erlang:display(fatal_error_cannot_locate_code_dir),		   halt(1)    end.startMeUp(Dir) ->    register(code_server, spawn(?MODULE, go, [Dir])).ensure_loaded(Mod) ->    code_server ! {ensure_loaded, self(), Mod},    receive	{code_server, Result} ->	    Result    end.prim_loaded(Mods) ->    code_server ! {prim_loaded, self(), Mods},    receive	{code_server, Result} ->	    Result    end.include_file(Lib, Name) ->    code_server ! {include_file, self(), Lib, Name},    receive	{code_server, Result} ->	    Result    end.		     go(Dir) ->    case boot_fprim:list_dir(Dir) of	{ok, Files} ->	    Desc = open_libs(Files, Dir, []),	    %% erlang:display({desc,Desc}),	    loop(Desc, []);	_ ->	    exit(library)    end.loop(Desc, Loaded) ->    receive	{ensure_loaded, From, Mod} ->	    %% erlang:display({boot_code_loader,ensure_loaded,Mod}),	    case member(Mod, Loaded) of		true ->		    %Err = {module, Mod},		    %erlang:display(Err),		    From ! {code_server, {module, Mod}},		    loop(Desc, Loaded);		false ->		    Result = load_mod(Mod, Desc),		    %% erlang:display({boot_code_loader_loop_result,Result}),		    From ! {code_server, Result},		    loop(Desc, [Mod|Loaded])	    end;	{include_file, From, Lib, Name} ->	    %% erlang:display({boot_code_loader, include_file,Lib,Name}),	    From ! {code_server, inc_file(Lib, Name, Desc)},	    loop(Desc, Loaded);	{prim_loaded, From, Mods} ->	    %% tell the server these were prim loaded	    From ! {code_server, ack},	    loop(Desc, Mods ++ Loaded);	{'$gen_call', {From, Tag}, get_path} ->	    {ok, Cwd} = file:get_cwd(),	    From ! {Tag, Cwd},	    loop(Desc, Loaded);	Other ->	    erlang:display({boot_code_loader,opps1, Other})    end.inc_file(_, Name, [{P,Lib,Keys}|_]) ->    %% erlang:display({boot_code_loader,checking,Lib,Name,Keys}),    case member({include,Name}, Keys) of	true ->	    boot_pds:fetch(P, {include,Name});	false ->	    error    end;inc_file(Lib, Name, [_|T]) ->    inc_file(Lib, Name, T);inc_file(_, _, []) ->    error.	    load_mod(Mod, [{P,_,Keys}|T]) ->    case member({mod,Mod}, Keys) of	true ->	    {ok, Bin} = boot_pds:fetch(P, {mod,Mod}),	    case erlang:load_module(Mod, Bin) of		M = {module,Mod} ->		    M;		Other ->		    {error, {cannotLoadModule, Mod, Other}}	    end;	false ->	    load_mod(Mod, T)    end;            load_mod(Mod, []) ->    {error, {cannotFindmodule,Mod}}.open_libs([H|T], Dir, L) ->    case reverse(H) of	"rae." ++ Rest ->	    Lib = Dir ++ "/" ++ H,	    %% erlang:display({reading, Lib}),	    P = boot_pds:open(Lib, read),	    open_libs(T, Dir, [{P,reverse(Rest),boot_pds:keys(P)}|L]);	_ ->	    open_libs(T, Dir, L)    end;open_libs([], _, L) ->    L.expand_env(Str) ->    Cset = seq($a, $z, seq($A, $Z, seq($0, $9, "_"))),    expand_env(Str, Cset).expand_env([$$|Cs], Cset) ->    subst_var(Cs, Cset, []);expand_env([C|Cs], Cset) ->    [C|expand_env(Cs, Cset)];expand_env([], _) -> [].subst_var([C|Cs0]=Cs, Cset, Acc) ->    case member(C, Cset) of	true ->	    subst_var(Cs0, Cset, [C|Acc]);	false ->	    Name = reverse(Acc),	    case os:getenv(Name) of		false ->		    [$$|Name ++ expand_env(Cs, Cset)];		Val ->		    Val ++ expand_env(Cs, Cset)	    end    end;subst_var([], _, Acc) ->    Name = reverse(Acc),    case os:getenv(Name) of	false -> [$$|Name];	Val -> Val    end.seq(Min, Min, L) -> [Min|L];seq(Min, Max, L) -> seq(Min, Max-1, [Max|L]).reverse(X) -> lists:reverse(X, []).

⌨️ 快捷键说明

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