aboutsummaryrefslogtreecommitdiffstats
path: root/erts
diff options
context:
space:
mode:
authorRickard Green <[email protected]>2018-08-21 12:09:04 +0200
committerRickard Green <[email protected]>2018-08-21 12:09:04 +0200
commit374bb679dafbd0739153ab1f5ed474c628788604 (patch)
tree55e12b6e9fc2b333e9dd0dfb6793e0b2a4a30ac1 /erts
parentf2fec6ae41ba9300404614e96b3833613ee1db0d (diff)
parent1d1a604d66806fb622d03a7c82f0316a5b15ba4b (diff)
downloadotp-374bb679dafbd0739153ab1f5ed474c628788604.tar.gz
otp-374bb679dafbd0739153ab1f5ed474c628788604.tar.bz2
otp-374bb679dafbd0739153ab1f5ed474c628788604.zip
Merge branch 'rickard/fix-suspend-monitor-down/OTP-15237/ERL-704' into maint
* rickard/fix-suspend-monitor-down/OTP-15237/ERL-704: Fix incoming suspend monitor down
Diffstat (limited to 'erts')
-rw-r--r--erts/emulator/beam/erl_proc_sig_queue.c2
-rw-r--r--erts/emulator/test/trace_SUITE.erl19
2 files changed, 18 insertions, 3 deletions
diff --git a/erts/emulator/beam/erl_proc_sig_queue.c b/erts/emulator/beam/erl_proc_sig_queue.c
index f90501cbf7..f343e984f7 100644
--- a/erts/emulator/beam/erl_proc_sig_queue.c
+++ b/erts/emulator/beam/erl_proc_sig_queue.c
@@ -3126,8 +3126,8 @@ erts_proc_sig_handle_incoming(Process *c_p, erts_aint32_t *statep,
erts_monitor_tree_delete(&ERTS_P_MONITORS(c_p),
&mdp->origin);
omon = &mdp->origin;
+ remove_nm_sig(c_p, sig, next_nm_sig);
}
- remove_nm_sig(c_p, sig, next_nm_sig);
break;
default:
ERTS_INTERNAL_ERROR("invalid monitor type");
diff --git a/erts/emulator/test/trace_SUITE.erl b/erts/emulator/test/trace_SUITE.erl
index 979b3185a5..c2d5cd7023 100644
--- a/erts/emulator/test/trace_SUITE.erl
+++ b/erts/emulator/test/trace_SUITE.erl
@@ -39,7 +39,7 @@
system_monitor_large_heap_1/1, system_monitor_large_heap_2/1,
system_monitor_long_schedule/1,
bad_flag/1, trace_delivered/1, trap_exit_self_receive/1,
- trace_info_badarg/1]).
+ trace_info_badarg/1, erl_704/1]).
-include_lib("common_test/include/ct.hrl").
@@ -63,7 +63,7 @@ all() ->
system_monitor_long_gc_2, system_monitor_large_heap_1,
system_monitor_long_schedule,
system_monitor_large_heap_2, bad_flag, trace_delivered,
- trap_exit_self_receive, trace_info_badarg].
+ trap_exit_self_receive, trace_info_badarg, erl_704].
init_per_testcase(_Case, Config) ->
[{receiver,spawn(fun receiver/0)}|Config].
@@ -1739,6 +1739,21 @@ trace_info_badarg(Config) when is_list(Config) ->
catch erlang:trace_info({a,b,c},d),
ok.
+%% An incoming suspend monitor down wasn't handled
+%% correct when the local monitor half had been
+%% removed with an emulator crash as result.
+erl_704(Config) ->
+ erl_704_test(100).
+
+erl_704_test(0) ->
+ ok;
+erl_704_test(N) ->
+ P = spawn(fun () -> receive infinity -> ok end end),
+ erlang:suspend_process(P),
+ exit(P, kill),
+ (catch erlang:resume_process(P)),
+ erl_704_test(N-1).
+
drop_trace_until_down(Proc, Mon) ->
drop_trace_until_down(Proc, Mon, false, 0, 0).