diff options
author | Rickard Green <[email protected]> | 2019-03-21 16:28:15 +0100 |
---|---|---|
committer | Rickard Green <[email protected]> | 2019-03-21 16:28:15 +0100 |
commit | 2e599cf4c3176d50240a6b1f72e34213c4f8de5d (patch) | |
tree | ecc295ea2e89c81f6cd16d1147e90907a52af215 /erts/emulator/test | |
parent | 99d91508edc97d66ad26dd7b6eaf1fc0888882a9 (diff) | |
parent | 984ccc38e160963bfd1a70f408365cba45245cad (diff) | |
download | otp-2e599cf4c3176d50240a6b1f72e34213c4f8de5d.tar.gz otp-2e599cf4c3176d50240a6b1f72e34213c4f8de5d.tar.bz2 otp-2e599cf4c3176d50240a6b1f72e34213c4f8de5d.zip |
Merge branch 'maint'
* maint:
Fix reception of resume signal on process executing dirty
Diffstat (limited to 'erts/emulator/test')
-rw-r--r-- | erts/emulator/test/dirty_bif_SUITE.erl | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/erts/emulator/test/dirty_bif_SUITE.erl b/erts/emulator/test/dirty_bif_SUITE.erl index 46eb0cba58..4f5ad0295a 100644 --- a/erts/emulator/test/dirty_bif_SUITE.erl +++ b/erts/emulator/test/dirty_bif_SUITE.erl @@ -38,7 +38,8 @@ dirty_process_info/1, dirty_process_register/1, dirty_process_trace/1, - code_purge/1]). + code_purge/1, + otp_15688/1]). suite() -> [{ct_hooks,[ts_install_cth]}]. @@ -64,7 +65,8 @@ all() -> dirty_process_info, dirty_process_register, dirty_process_trace, - code_purge]. + code_purge, + otp_15688]. init_per_suite(Config) -> case erlang:system_info(dirty_cpu_schedulers) of @@ -498,10 +500,58 @@ code_purge(Config) when is_list(Config) -> true = Time =< 1000, ok. +otp_15688(Config) when is_list(Config) -> + ImBack = make_ref(), + {See, SeeMon} = spawn_monitor(fun () -> + erts_debug:dirty_io(wait, 2000), + exit(ImBack) + end), + wait_until(fun () -> + [{current_function, {erts_debug, dirty_io, 2}}, + {status, running}] + == process_info(See, + [current_function, status]) + end), + {Ser1, Ser1Mon} = spawn_monitor(fun () -> + erlang:suspend_process(See, + [asynchronous]) + end), + erlang:suspend_process(See, [asynchronous]), + receive {'DOWN', Ser1Mon, process, Ser1, normal} -> ok end, + + %% Verify that we sent the suspend request while it was executing dirty... + [{current_function, {erts_debug, dirty_io, 2}}, + {status, running}] = process_info(See, [current_function, status]), + + wait_until(fun () -> + {status, suspended} == process_info(See, status) + end), + erlang:resume_process(See), + + receive + {'DOWN', SeeMon, process, See, Reason} -> + ImBack = Reason + after 4000 -> + %% Resume bug seems to have hit us... + PI = process_info(See), + exit(See, kill), + ct:fail({suspendee_stuck, PI}) + end. + + %% %% Internal... %% +wait_until(Fun) -> + case Fun() of + true -> + ok; + _ -> + receive after 100 -> ok end, + wait_until(Fun) + end. + access_dirty_process(Config, Start, Test, Finish) -> {ok, Node} = start_node(Config, ""), [ok] = mcall(Node, |