Parcourir la source

Merge pull request #1124 from ferd/improve-intermittent-shell-issues

Fix bugs/race conditions in shell
pull/1072/merge
Tristan Sloughter il y a 9 ans
Parent
révision
4e81c84fa0
1 fichiers modifiés avec 16 ajouts et 2 suppressions
  1. +16
    -2
      src/rebar_prv_shell.erl

+ 16
- 2
src/rebar_prv_shell.erl Voir le fichier

@ -133,11 +133,25 @@ kill_old_user() ->
%% fully die
[P] = [P || P <- element(2,process_info(whereis(user), links)), is_port(P)],
user ! {'EXIT', P, normal}, % pretend the port died, then the port can die!
exit(P, kill),
wait_for_port_death(1000, P),
OldUser.
wait_for_port_death(N, _) when N < 0 ->
%% This risks displaying a warning!
whatever;
wait_for_port_death(N, P) ->
case erlang:port_info(P) of
undefined ->
ok;
_ ->
timer:sleep(10),
wait_for_port_death(N-10, P)
end.
setup_new_shell() ->
%% terminate the current user supervision structure
ok = supervisor:terminate_child(kernel_sup, user),
%% terminate the current user supervision structure, if any
_ = supervisor:terminate_child(kernel_sup, user),
%% start a new shell (this also starts a new user under the correct group)
_ = user_drv:start(),
%% wait until user_drv and user have been registered (max 3 seconds)

Chargement…
Annuler
Enregistrer