diff options
| author | Björn Gustavsson <[email protected]> | 2015-12-17 07:31:03 +0100 | 
|---|---|---|
| committer | Björn Gustavsson <[email protected]> | 2015-12-17 07:31:03 +0100 | 
| commit | a985104c38d154b7d0f2eb8ccf9f8fe053b6aad5 (patch) | |
| tree | ebcd62114e6925347f69704a9333ba4d5fede651 /lib/kernel/src | |
| parent | 568cd49812ff0b59b0b8f1ebfc2da588f78d55a4 (diff) | |
| parent | 3131a94b5d2ce2b95aa0efb99c767e3658f24550 (diff) | |
| download | otp-a985104c38d154b7d0f2eb8ccf9f8fe053b6aad5.tar.gz otp-a985104c38d154b7d0f2eb8ccf9f8fe053b6aad5.tar.bz2 otp-a985104c38d154b7d0f2eb8ccf9f8fe053b6aad5.zip | |
Merge branch 'bjorn/kernel/remove-code-path-cache/OTP-13191'
* bjorn/kernel/remove-code-path-cache/OTP-13191:
  Remove the code path cache in the code server
Diffstat (limited to 'lib/kernel/src')
| -rw-r--r-- | lib/kernel/src/code.erl | 45 | ||||
| -rw-r--r-- | lib/kernel/src/code_server.erl | 170 | 
2 files changed, 40 insertions, 175 deletions
| diff --git a/lib/kernel/src/code.erl b/lib/kernel/src/code.erl index 352c02562b..ae28c97b47 100644 --- a/lib/kernel/src/code.erl +++ b/lib/kernel/src/code.erl @@ -68,6 +68,8 @@  	 clash/0,       get_mode/0]). +-deprecated({rehash,0,next_major_release}). +  -export_type([load_error_rsn/0, load_ret/0]).  -include_lib("kernel/include/file.hrl"). @@ -293,7 +295,9 @@ replace_path(Name, Dir) when (is_atom(Name) orelse is_list(Name)),      call({replace_path,Name,Dir}).  -spec rehash() -> 'ok'. -rehash() -> call(rehash). +rehash() -> +    cache_warning(), +    ok.  -spec get_mode() -> 'embedded' | 'interactive'.  get_mode() -> call(get_mode). @@ -322,6 +326,7 @@ start_link(Flags) ->  %%-----------------------------------------------------------------  do_start(Flags) -> +    maybe_warn_for_cache(),      load_code_server_prerequisites(),      Mode = get_mode(Flags), @@ -452,30 +457,14 @@ which(File, Base, [Directory|Tail]) ->        Filename :: file:filename(),        Absname :: file:filename().  where_is_file(File) when is_list(File) -> -    case call({is_cached,File}) of -	no -> -	    Path = get_path(), -	    which(File, ".", Path); -	Dir -> -	    filename:join(Dir, File) -    end. +    Path = get_path(), +    which(File, ".", Path).  -spec where_is_file(Path :: file:filename(), Filename :: file:filename()) ->          file:filename() | 'non_existing'.  where_is_file(Path, File) when is_list(Path), is_list(File) -> -    CodePath = get_path(), -    if -	Path =:= CodePath -> -	    case call({is_cached, File}) of -		no -> -		    which(File, ".", Path); -		Dir -> -		    filename:join(Dir, File) -	    end; -	true -> -	    which(File, ".", Path) -    end. +    which(File, ".", Path).  -spec set_primary_archive(ArchiveFile :: file:filename(),  			  ArchiveBin :: binary(), @@ -553,6 +542,22 @@ has_ext(Ext, Extlen, File) ->      end.  %%% +%%% Warning for deprecated code path cache. +%%% + +maybe_warn_for_cache() -> +    case init:get_argument(code_path_cache) of +	{ok, _} -> +	    cache_warning(); +	error -> +	    ok +    end. + +cache_warning() -> +    W = "The code path cache functionality has been removed", +    error_logger:warning_report(W). + +%%%  %%% Silently load native code for all modules loaded so far.  %%% diff --git a/lib/kernel/src/code_server.erl b/lib/kernel/src/code_server.erl index 68dd21b1d7..4361bb7b60 100644 --- a/lib/kernel/src/code_server.erl +++ b/lib/kernel/src/code_server.erl @@ -40,7 +40,6 @@  		path,  		moddb,  		namedb, -		cache = no_cache,  		mode = interactive,  		on_load = []}).  -type state() :: #state{}. @@ -89,19 +88,11 @@ init(Ref, Parent, [Root,Mode0]) ->  	end,      Path = add_loader_path(IPath, Mode), -    State0 = #state{root = Root, -		    path = Path, -		    moddb = Db, -		    namedb = init_namedb(Path), -		    mode = Mode}, - -    State = -	case init:get_argument(code_path_cache) of -	    {ok, _} ->  -		create_cache(State0); -	    error ->  -		State0 -	end, +    State = #state{root = Root, +		   path = Path, +		   moddb = Db, +		   namedb = init_namedb(Path), +		   mode = Mode},      put(?ANY_NATIVE_CODE_LOADED, false), @@ -264,50 +255,29 @@ handle_call({load_file,Mod}, Caller, St) ->      end;  handle_call({add_path,Where,Dir0}, {_From,_Tag}, -	    #state{cache=Cache0,namedb=Namedb,path=Path0}=S) -> -    case Cache0 of -	no_cache -> -	    {Resp,Path} = add_path(Where, Dir0, Path0, Namedb), -	    {reply,Resp,S#state{path=Path}}; -	_ -> -	    Dir = absname(Dir0), %% Cache always expands the path  -	    {Resp,Path} = add_path(Where, Dir, Path0, Namedb), -	    Cache = update_cache([Dir], Where, Cache0), -	    {reply,Resp,S#state{path=Path,cache=Cache}} -    end; +	    #state{namedb=Namedb,path=Path0}=S) -> +    {Resp,Path} = add_path(Where, Dir0, Path0, Namedb), +    {reply,Resp,S#state{path=Path}};  handle_call({add_paths,Where,Dirs0}, {_From,_Tag}, -	    #state{cache=Cache0,namedb=Namedb,path=Path0}=S) -> -    case Cache0 of -	no_cache -> -	    {Resp,Path} = add_paths(Where, Dirs0, Path0, Namedb), -	    {reply,Resp,S#state{path=Path}}; -	_ -> -	    %% Cache always expands the path  -	    Dirs = [absname(Dir) || Dir <- Dirs0],  -	    {Resp,Path} = add_paths(Where, Dirs, Path0, Namedb), -	    Cache=update_cache(Dirs,Where,Cache0), -	    {reply,Resp,S#state{cache=Cache,path=Path}} -    end; +	    #state{namedb=Namedb,path=Path0}=S) -> +    {Resp,Path} = add_paths(Where, Dirs0, Path0, Namedb), +    {reply,Resp,S#state{path=Path}};  handle_call({set_path,PathList}, {_From,_Tag},  	    #state{path=Path0,namedb=Namedb}=S) ->      {Resp,Path,NewDb} = set_path(PathList, Path0, Namedb), -    {reply,Resp,rehash_cache(S#state{path=Path,namedb=NewDb})}; +    {reply,Resp,S#state{path=Path,namedb=NewDb}};  handle_call({del_path,Name}, {_From,_Tag},  	    #state{path=Path0,namedb=Namedb}=S) ->      {Resp,Path} = del_path(Name, Path0, Namedb), -    {reply,Resp,rehash_cache(S#state{path=Path})}; +    {reply,Resp,S#state{path=Path}};  handle_call({replace_path,Name,Dir}, {_From,_Tag},  	    #state{path=Path0,namedb=Namedb}=S) ->      {Resp,Path} = replace_path(Name, Dir, Path0, Namedb), -    {reply,Resp,rehash_cache(S#state{path=Path})}; - -handle_call(rehash, {_From,_Tag}, S0) -> -    S = create_cache(S0), -    {reply,ok,S}; +    {reply,Resp,S#state{path=Path}};  handle_call(get_path, {_From,_Tag}, S) ->      {reply,S#state.path,S}; @@ -398,9 +368,6 @@ handle_call({is_sticky, Mod}, {_From,_Tag}, S) ->  handle_call(stop,{_From,_Tag}, S) ->      {stop,normal,stopped,S}; -handle_call({is_cached,_File}, {_From,_Tag}, S=#state{cache=no_cache}) -> -    {reply, no, S}; -  handle_call({set_primary_archive, File, ArchiveBin, FileInfo, ParserFun}, {_From,_Tag}, S=#state{mode=Mode}) ->      case erl_prim_loader:set_primary_archive(File, ArchiveBin, FileInfo, ParserFun) of  	{ok, Files} -> @@ -409,26 +376,6 @@ handle_call({set_primary_archive, File, ArchiveBin, FileInfo, ParserFun}, {_From  	    {reply, Error, S}      end; -handle_call({is_cached,File}, {_From,_Tag}, S=#state{cache=Cache}) -> -    ObjExt = objfile_extension(), -    Ext = filename:extension(File), -    Type = case Ext of -	       ObjExt -> obj; -	       ".app" -> app; -	       _ -> undef -	   end, -    if Type =:= undef ->  -	    {reply, no, S}; -       true -> -	    Key = {Type,list_to_atom(filename:rootname(File, Ext))}, -	    case ets:lookup(Cache, Key) of -		[] ->  -		    {reply, no, S}; -		[{Key,Dir}] -> -		    {reply, Dir, S} -	    end -    end; -  handle_call(get_mode, {_From,_Tag}, S=#state{mode=Mode}) ->      {reply, Mode, S}; @@ -448,69 +395,6 @@ do_mod_call(Action, Module, Error, St) ->      end.  %% -------------------------------------------------------------- -%% Cache functions  -%% -------------------------------------------------------------- - -create_cache(St = #state{cache = no_cache}) -> -    Cache = ets:new(code_cache, [protected]), -    rehash_cache(Cache, St); -create_cache(St) -> -    rehash_cache(St). - -rehash_cache(St = #state{cache = no_cache}) -> -    St; -rehash_cache(St = #state{cache = OldCache}) -> -    ets:delete(OldCache),  -    Cache = ets:new(code_cache, [protected]), -    rehash_cache(Cache, St). - -rehash_cache(Cache, St = #state{path = Path}) -> -    Exts = [{obj,objfile_extension()}, {app,".app"}], -    {Cache,NewPath} = locate_mods(lists:reverse(Path), first, Exts, Cache, []), -    St#state{cache = Cache, path=NewPath}. - -update_cache(Dirs, Where, Cache0) -> -    Exts = [{obj,objfile_extension()}, {app,".app"}], -    {Cache, _} = locate_mods(Dirs, Where, Exts, Cache0, []), -    Cache. - -locate_mods([Dir0|Path], Where, Exts, Cache, Acc) -> -    Dir = absname(Dir0), %% Cache always expands the path  -    case erl_prim_loader:list_dir(Dir) of -	{ok, Files} ->  -	    Cache = filter_mods(Files, Where, Exts, Dir, Cache), -	    locate_mods(Path, Where, Exts, Cache, [Dir|Acc]); -	error -> -	    locate_mods(Path, Where, Exts, Cache, Acc) -    end; -locate_mods([], _, _, Cache, Path) -> -    {Cache,Path}. - -filter_mods([File|Rest], Where, Exts, Dir, Cache) -> -    Ext = filename:extension(File), -    Root = list_to_atom(filename:rootname(File, Ext)), -    case lists:keyfind(Ext, 2, Exts) of -	{Type, _} -> -	    Key = {Type,Root}, -	    case Where of -		first -> -		    true = ets:insert(Cache, {Key,Dir}); -		last -> -		    case ets:lookup(Cache, Key) of -			[] -> -			    true = ets:insert(Cache, {Key,Dir}); -			_ -> -			    ignore -		    end -	    end; -	false -> -	    ok -    end, -    filter_mods(Rest, Where, Exts, Dir, Cache); -filter_mods([], _, _, _, Cache) -> -    Cache. - -%% --------------------------------------------------------------  %% Path handling functions.  %% -------------------------------------------------------------- @@ -1238,16 +1122,6 @@ load_abs(File, Mod0, Caller, St) ->  	    {reply,{error,nofile},St}      end. -try_load_module(Mod, Dir, Caller, St) -> -    File = filename:append(Dir, to_list(Mod) ++ -			   objfile_extension()), -    case erl_prim_loader:get_file(File) of -	error ->  -	    {reply,error,St}; -	{ok,Binary,FName} -> -	    try_load_module(absname(FName), Mod, Binary, Caller, St) -    end. -  try_load_module(File, Mod, Bin, {From,_}=Caller, St0) ->      M = to_atom(Mod),      case pending_on_load(M, From, St0) of @@ -1345,26 +1219,12 @@ load_file(Mod0, {From,_}=Caller, St0) ->  	{yes,St} -> {noreply,St}      end. -load_file_1(Mod, Caller, #state{path=Path,cache=no_cache}=St) -> +load_file_1(Mod, Caller, #state{path=Path}=St) ->      case mod_to_bin(Path, Mod) of  	error ->  	    {reply,{error,nofile},St};  	{Mod,Binary,File} ->  	    try_load_module(File, Mod, Binary, Caller, St) -    end; -load_file_1(Mod, Caller, #state{cache=Cache}=St0) -> -    Key = {obj,Mod}, -    case ets:lookup(Cache, Key) of -	[] ->  -	    St = rehash_cache(St0), -	    case ets:lookup(St#state.cache, Key) of -		[] ->  -		    {reply,{error,nofile},St}; -		[{Key,Dir}] -> -		    try_load_module(Mod, Dir, Caller, St) -	    end; -	[{Key,Dir}] -> -	    try_load_module(Mod, Dir, Caller, St0)      end.  mod_to_bin([Dir|Tail], Mod) -> | 
