aboutsummaryrefslogtreecommitdiffstats
path: root/lib/kernel/src
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2014-06-05 11:49:41 +0200
committerBjörn Gustavsson <[email protected]>2014-06-05 11:49:41 +0200
commit269a7f1cfdc46fb2a81e8d40210747f77f6aab37 (patch)
treea768126937533ef5f68ff065d4ea8663385191a9 /lib/kernel/src
parent5eb7105fb6f479ed50db5435d510aae0306b8d46 (diff)
parented06dd12ea74018b902a2c4c7924313d23cedb75 (diff)
downloadotp-269a7f1cfdc46fb2a81e8d40210747f77f6aab37.tar.gz
otp-269a7f1cfdc46fb2a81e8d40210747f77f6aab37.tar.bz2
otp-269a7f1cfdc46fb2a81e8d40210747f77f6aab37.zip
Merge branch 'bjorn/kernel/stick-preloaded/OTP-11913' into maint
* bjorn/kernel/stick-preloaded/OTP-11913: Make pre-loaded modules permanently sticky application_SUITE: Clean up the code after the test is done Teach code:del_path/1 to ignore superfluous slashes
Diffstat (limited to 'lib/kernel/src')
-rw-r--r--lib/kernel/src/code_server.erl18
1 files changed, 15 insertions, 3 deletions
diff --git a/lib/kernel/src/code_server.erl b/lib/kernel/src/code_server.erl
index fc7ac08699..dd06affd70 100644
--- a/lib/kernel/src/code_server.erl
+++ b/lib/kernel/src/code_server.erl
@@ -63,7 +63,10 @@ init(Ref, Parent, [Root,Mode0]) ->
process_flag(trap_exit, true),
Db = ets:new(code, [private]),
- foreach(fun (M) -> ets:insert(Db, {M,preloaded}) end, erlang:pre_loaded()),
+ foreach(fun (M) ->
+ %% Pre-loaded modules are always sticky.
+ ets:insert(Db, [{M,preloaded},{{sticky,M},true}])
+ end, erlang:pre_loaded()),
ets:insert(Db, init:fetch_loaded()),
Mode =
@@ -988,7 +991,7 @@ try_archive_subdirs(_Archive, Base, []) ->
%% the complete directory name.
%%
del_path(Name0,Path,NameDb) ->
- case catch to_list(Name0)of
+ case catch filename:join([to_list(Name0)]) of
{'EXIT',_} ->
{{error,bad_name},Path};
Name ->
@@ -1165,7 +1168,7 @@ stick_dir(Dir, Stick, St) ->
true ->
foreach(fun (M) -> ets:insert(Db, {{sticky,M},true}) end, Mods);
false ->
- foreach(fun (M) -> ets:delete(Db, {sticky,M}) end, Mods)
+ foreach(fun (M) -> do_unstick_mod(Db, M) end, Mods)
end;
Error ->
Error
@@ -1177,6 +1180,15 @@ stick_mod(M, Stick, St) ->
true ->
ets:insert(Db, {{sticky,M},true});
false ->
+ do_unstick_mod(Db, M)
+ end.
+
+do_unstick_mod(Db, M) ->
+ case ets:lookup(Db, M) of
+ [{M,preloaded}] ->
+ %% Never unstick pre-loaded modules.
+ true;
+ _ ->
ets:delete(Db, {sticky,M})
end.