aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukas Larsson <[email protected]>2016-08-12 11:42:58 +0200
committerLukas Larsson <[email protected]>2016-08-12 11:42:58 +0200
commit6c41e0910b2ccb12c7a431f4398a7d0213b5b02e (patch)
treea236fd9fb3ab5967ff30f4f99bcaf56bc3c27cc6
parentdaa0f831aee9dedf8cdf29fd5f97f98f55e072e3 (diff)
parent53a487cd5019e7f7e3abee6b4a5e2d0b05aa34c6 (diff)
downloadotp-6c41e0910b2ccb12c7a431f4398a7d0213b5b02e.tar.gz
otp-6c41e0910b2ccb12c7a431f4398a7d0213b5b02e.tar.bz2
otp-6c41e0910b2ccb12c7a431f4398a7d0213b5b02e.zip
Merge branch 'lukas/erts/fix_init_stop_code_load_race/OTP-13802' into maint
* lukas/erts/fix_init_stop_code_load_race/OTP-13802: erts/kernel: Fix code loading deadlock during init:stop
-rw-r--r--erts/preloaded/ebin/init.beambin50048 -> 50036 bytes
-rw-r--r--erts/preloaded/src/init.erl5
-rw-r--r--lib/kernel/src/code_server.erl6
3 files changed, 7 insertions, 4 deletions
diff --git a/erts/preloaded/ebin/init.beam b/erts/preloaded/ebin/init.beam
index b856bff4fe..f0344fd6ba 100644
--- a/erts/preloaded/ebin/init.beam
+++ b/erts/preloaded/ebin/init.beam
Binary files differ
diff --git a/erts/preloaded/src/init.erl b/erts/preloaded/src/init.erl
index 45468b3b9c..67929c53c2 100644
--- a/erts/preloaded/src/init.erl
+++ b/erts/preloaded/src/init.erl
@@ -423,9 +423,6 @@ loop(State) ->
Loaded = State#state.loaded, %% boot_loop but is handled here
From ! {init,Loaded}, %% anyway.
loop(State);
- {From, {ensure_loaded, _}} ->
- From ! {init, not_allowed},
- loop(State);
Msg ->
loop(handle_msg(Msg,State))
end.
@@ -465,6 +462,8 @@ do_handle_msg(Msg,State) ->
From ! {init,ok},
{new_state,State#state{subscribed = [Pid|Subscribed]}}
end;
+ {From, {ensure_loaded, _}} ->
+ From ! {init, not_allowed};
X ->
case whereis(user) of
undefined ->
diff --git a/lib/kernel/src/code_server.erl b/lib/kernel/src/code_server.erl
index 1792f9e908..48541ec500 100644
--- a/lib/kernel/src/code_server.erl
+++ b/lib/kernel/src/code_server.erl
@@ -135,10 +135,14 @@ split_paths([], _S, Path, Paths) ->
-spec call(term()) -> term().
call(Req) ->
+ Ref = erlang:monitor(process, ?MODULE),
?MODULE ! {code_call, self(), Req},
receive
{?MODULE, Reply} ->
- Reply
+ erlang:demonitor(Ref,[flush]),
+ Reply;
+ {'DOWN',Ref,process,_,_} ->
+ exit({'DOWN',code_server,Req})
end.
reply(Pid, Res) ->