diff options
author | Björn Gustavsson <[email protected]> | 2015-05-06 10:20:22 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2015-05-06 10:20:22 +0200 |
commit | 640010cc867ff2a5635c58f42ed208d5d0fb5b0d (patch) | |
tree | 77765f392a0e8fd99cbdf4f1519baf9e77c4b10e | |
parent | a1b62b45b5c78e23b1b3fab5285ae13219a96e37 (diff) | |
parent | 20a72ca2d491d6efa720828becb783c20e4508b5 (diff) | |
download | otp-640010cc867ff2a5635c58f42ed208d5d0fb5b0d.tar.gz otp-640010cc867ff2a5635c58f42ed208d5d0fb5b0d.tar.bz2 otp-640010cc867ff2a5635c58f42ed208d5d0fb5b0d.zip |
Merge branch 'bjorn/kernel/code-loading'
* bjorn/kernel/code-loading:
kernel application: Start code server first
code: Reduce overhead of native code checking for loaded modules
-rw-r--r-- | lib/kernel/src/code.erl | 49 | ||||
-rw-r--r-- | lib/kernel/src/kernel.erl | 6 |
2 files changed, 39 insertions, 16 deletions
diff --git a/lib/kernel/src/code.erl b/lib/kernel/src/code.erl index 0eda558ed5..a8cbdf9667 100644 --- a/lib/kernel/src/code.erl +++ b/lib/kernel/src/code.erl @@ -339,7 +339,7 @@ do_start(Flags) -> ok end, %% Quietly load native code for all modules loaded so far - catch load_native_code_for_all_loaded(), + load_native_code_for_all_loaded(), Ok2; Other -> Other @@ -550,18 +550,41 @@ has_ext(Ext, Extlen, File) -> _ -> false end. +%%% +%%% Silently load native code for all modules loaded so far. +%%% + -spec load_native_code_for_all_loaded() -> ok. load_native_code_for_all_loaded() -> Architecture = erlang:system_info(hipe_architecture), - ChunkName = hipe_unified_loader:chunk_name(Architecture), - lists:foreach(fun({Module, BeamFilename}) -> - case code:is_module_native(Module) of - false -> - case beam_lib:chunks(BeamFilename, [ChunkName]) of - {ok,{_,[{_,Bin}]}} when is_binary(Bin) -> - load_native_partial(Module, Bin); - {error, beam_lib, _} -> ok - end; - true -> ok - end - end, all_loaded()). + try hipe_unified_loader:chunk_name(Architecture) of + ChunkTag -> + Loaded = all_loaded(), + spawn(fun() -> load_all_native(Loaded, ChunkTag) end) + catch + _:_ -> + ok + end. + +load_all_native(Loaded, ChunkTag) -> + catch load_all_native_1(Loaded, ChunkTag). + +load_all_native_1([{_,preloaded}|T], ChunkTag) -> + load_all_native_1(T, ChunkTag); +load_all_native_1([{Mod,BeamFilename}|T], ChunkTag) -> + case code:is_module_native(Mod) of + false -> + %% prim_file is faster than file and the file server may + %% not be started yet. + {ok,Beam} = prim_file:read_file(BeamFilename), + case code:get_chunk(Beam, ChunkTag) of + undefined -> + ok; + NativeCode when is_binary(NativeCode) -> + load_native_partial(Mod, NativeCode) + end; + true -> ok + end, + load_all_native_1(T, ChunkTag); +load_all_native_1([], _) -> + ok. diff --git a/lib/kernel/src/kernel.erl b/lib/kernel/src/kernel.erl index ecdb32424a..cc5683ba06 100644 --- a/lib/kernel/src/kernel.erl +++ b/lib/kernel/src/kernel.erl @@ -117,7 +117,7 @@ init([]) -> [{local, kernel_safe_sup}, ?MODULE, safe]}, permanent, infinity, supervisor, [?MODULE]}, {ok, {SupFlags, - [File, Code, StdError, User, + [Code, File, StdError, User, Config, SafeSupervisor]}}; _ -> Rpc = {rex, {rpc, start_link, []}, @@ -139,8 +139,8 @@ init([]) -> [{local, kernel_safe_sup}, ?MODULE, safe]}, permanent, infinity, supervisor, [?MODULE]}, {ok, {SupFlags, - [Rpc, Global, InetDb | DistAC] ++ - [NetSup, Glo_grp, File, Code, + [Code, Rpc, Global, InetDb | DistAC] ++ + [NetSup, Glo_grp, File, StdError, User, Config, SafeSupervisor] ++ Timer}} end; init(safe) -> |