diff options
author | Tristan Sloughter <t@crashfast.com> | 2016-03-19 13:10:16 -0500 |
---|---|---|
committer | Tristan Sloughter <t@crashfast.com> | 2016-03-19 13:10:16 -0500 |
commit | 4e81c84fa0c0094cf1bb2ac0231ba8ebb5d99db0 (patch) | |
tree | a661085f3126618792738a6ad63bdb0fbe31a7c8 /src | |
parent | 7d29b74a221ef082e4bbee496019c8f1612e8f0b (diff) | |
parent | 8e6a1ad62e3db7be3b1fa75c8268997aa6bf0992 (diff) |
Merge pull request #1124 from ferd/improve-intermittent-shell-issues
Fix bugs/race conditions in shell
Diffstat (limited to 'src')
-rw-r--r-- | src/rebar_prv_shell.erl | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/rebar_prv_shell.erl b/src/rebar_prv_shell.erl index 430d1e8..d67f940 100644 --- a/src/rebar_prv_shell.erl +++ b/src/rebar_prv_shell.erl @@ -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) |