Browse Source

fix error_logger on unixes

Namdak Tonpa 9 years ago
parent
commit
9f2f1fffb8
1 changed files with 31 additions and 1 deletions
  1. 31 1
      src/provision/mad_repl.erl

+ 31 - 1
src/provision/mad_repl.erl

@@ -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(),[]),