From 4fe94be102150d2b2b31f188a8ef045209e79f8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Sat, 5 Nov 2016 09:02:23 +0100 Subject: Fix performance bug in erl_prim_loader:get_modules/{2,3} The erl_prim_loader:get_modules/{2,3} functions were introduced in cd283583f8. Unfortunately, while the functions worked correctly, there was a bug in that many garbage maessages would be sent to the erl_prim_loader process. The number of extra messages depended on both the length of the code path and of the number of modules that were fetched. The messages were ignored and ultimately discarded, causing no harm except for a performance degradation and increase of the heap size for the erl_prim_loader process. The following functions were hit by the performance bug: code:atomic_load/1 code:ensure_modules_loaded/1 code:prepare_loading/1 --- erts/preloaded/src/erl_prim_loader.erl | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) (limited to 'erts/preloaded/src/erl_prim_loader.erl') diff --git a/erts/preloaded/src/erl_prim_loader.erl b/erts/preloaded/src/erl_prim_loader.erl index b3ec73a60e..1d09aeded9 100644 --- a/erts/preloaded/src/erl_prim_loader.erl +++ b/erts/preloaded/src/erl_prim_loader.erl @@ -555,17 +555,18 @@ efile_gm_get(Paths, Mod, ParentRef, Process) -> efile_gm_get_1([P|Ps], File0, Mod, {Parent,Ref}=PR, Process) -> File = join(P, File0), - Res = try prim_file:read_file(File) of - {ok,Bin} -> - gm_process(Mod, File, Bin, Process); - Error -> - _ = check_file_result(get_modules, File, Error), - efile_gm_get_1(Ps, File0, Mod, PR, Process) - catch - _:Reason -> - {error,{crash,Reason}} - end, - Parent ! {Ref,Mod,Res}; + try prim_file:read_file(File) of + {ok,Bin} -> + Res = gm_process(Mod, File, Bin, Process), + Parent ! {Ref,Mod,Res}; + Error -> + _ = check_file_result(get_modules, File, Error), + efile_gm_get_1(Ps, File0, Mod, PR, Process) + catch + _:Reason -> + Res = {error,{crash,Reason}}, + Parent ! {Ref,Mod,Res} + end; efile_gm_get_1([], _, Mod, {Parent,Ref}, _Process) -> Parent ! {Ref,Mod,{error,enoent}}. -- cgit v1.2.3