|
@@ -86,12 +86,42 @@ sh(Params) ->
|
|
|
repl_intro(),
|
|
|
case os:type() of
|
|
|
{win32,nt} -> os:cmd("chcp 65001"), shell:start();
|
|
|
- _ -> Driver:start() end,
|
|
|
+ _ -> O = whereis(user),
|
|
|
+ supervisor:terminate_child(kernel_sup, user),
|
|
|
+ Driver:start(),
|
|
|
+ wait(3000),
|
|
|
+ rewrite_leaders(O,whereis(user)) end,
|
|
|
load_apps(Params,Config,[]),
|
|
|
case Params of
|
|
|
["applist"] -> skip;
|
|
|
_ -> timer:sleep(infinity) end.
|
|
|
|
|
|
+remove(0) -> skip;
|
|
|
+remove(N) -> case gen_event:delete_handler(error_logger, error_logger, []) of
|
|
|
+ {error, module_not_found} -> ok;
|
|
|
+ {error_logger, _} -> remove(N-1) end.
|
|
|
+
|
|
|
+wait(0) -> erlang:error(timeout);
|
|
|
+wait(Timeout) -> case whereis(user) of undefined -> timer:sleep(100), wait(Timeout - 100); _ -> ok end.
|
|
|
+
|
|
|
+rewrite_leaders(OldUser, NewUser) ->
|
|
|
+ _ = [catch erlang:group_leader(NewUser, Pid)
|
|
|
+ || Pid <- erlang:processes(),
|
|
|
+ proplists:get_value(group_leader, erlang:process_info(Pid)) == OldUser,
|
|
|
+ is_process_alive(Pid)],
|
|
|
+ OldMasters = [Pid
|
|
|
+ || Pid <- erlang:processes(),
|
|
|
+ Pid < NewUser, % only change old masters
|
|
|
+ {_,Dict} <- [erlang:process_info(Pid, dictionary)],
|
|
|
+ {application_master,init,4} == proplists:get_value('$initial_call', Dict)],
|
|
|
+ _ = [catch erlang:group_leader(NewUser, Pid)
|
|
|
+ || Pid <- erlang:processes(),
|
|
|
+ lists:member(proplists:get_value(group_leader, erlang:process_info(Pid)),
|
|
|
+ OldMasters)],
|
|
|
+ try error_logger:swap_handler(tty),
|
|
|
+ remove(3)
|
|
|
+ catch E:R -> hope_for_best end.
|
|
|
+
|
|
|
load() ->
|
|
|
ets_created(),
|
|
|
{ok,Sections} = escript:extract(escript:script_name(),[]),
|