diff options
author | Lukas Larsson <[email protected]> | 2016-08-12 11:42:58 +0200 |
---|---|---|
committer | Lukas Larsson <[email protected]> | 2016-08-12 11:42:58 +0200 |
commit | 6c41e0910b2ccb12c7a431f4398a7d0213b5b02e (patch) | |
tree | a236fd9fb3ab5967ff30f4f99bcaf56bc3c27cc6 | |
parent | daa0f831aee9dedf8cdf29fd5f97f98f55e072e3 (diff) | |
parent | 53a487cd5019e7f7e3abee6b4a5e2d0b05aa34c6 (diff) | |
download | otp-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.beam | bin | 50048 -> 50036 bytes | |||
-rw-r--r-- | erts/preloaded/src/init.erl | 5 | ||||
-rw-r--r-- | lib/kernel/src/code_server.erl | 6 |
3 files changed, 7 insertions, 4 deletions
diff --git a/erts/preloaded/ebin/init.beam b/erts/preloaded/ebin/init.beam Binary files differindex b856bff4fe..f0344fd6ba 100644 --- a/erts/preloaded/ebin/init.beam +++ b/erts/preloaded/ebin/init.beam 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) -> |