diff options
author | Björn Gustavsson <bjorn@erlang.org> | 2017-06-07 16:43:35 +0200 |
---|---|---|
committer | Björn Gustavsson <bjorn@erlang.org> | 2017-06-07 16:43:35 +0200 |
commit | 76137cbf49487e07bfcd72d5789bdfde7ef50a92 (patch) | |
tree | 1b928cf1c5d88792bd402d81ef5ebcec89190f12 /erts/emulator | |
parent | 1ee59088c52ff18e3917d7f453a5947d0fe1cadd (diff) | |
parent | acd8571b35756c3fdc389807c34d80c9d44435e7 (diff) | |
download | otp-76137cbf49487e07bfcd72d5789bdfde7ef50a92.tar.gz otp-76137cbf49487e07bfcd72d5789bdfde7ef50a92.tar.bz2 otp-76137cbf49487e07bfcd72d5789bdfde7ef50a92.zip |
Merge branch 'bjorn/erts/fix-sys-task-cleanup'
* bjorn/erts/fix-sys-task-cleanup:
Make sure that asynchronous replies are not lost
Diffstat (limited to 'erts/emulator')
-rw-r--r-- | erts/emulator/beam/erl_process.c | 6 | ||||
-rw-r--r-- | erts/emulator/test/binary_SUITE.erl | 14 |
2 files changed, 13 insertions, 7 deletions
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c index d4385e3987..285fa05d63 100644 --- a/erts/emulator/beam/erl_process.c +++ b/erts/emulator/beam/erl_process.c @@ -13932,7 +13932,11 @@ erts_continue_exit_process(Process *p) erts_set_gc_state(p, 1); state = erts_smp_atomic32_read_acqb(&p->state); - if (state & ERTS_PSFLG_ACTIVE_SYS) { + if (state & ERTS_PSFLG_ACTIVE_SYS +#ifdef ERTS_DIRTY_SCHEDULERS + || p->dirty_sys_tasks +#endif + ) { if (cleanup_sys_tasks(p, state, CONTEXT_REDS) >= CONTEXT_REDS/2) goto yield; } diff --git a/erts/emulator/test/binary_SUITE.erl b/erts/emulator/test/binary_SUITE.erl index 355be7a36d..4d17276e5c 100644 --- a/erts/emulator/test/binary_SUITE.erl +++ b/erts/emulator/test/binary_SUITE.erl @@ -1358,17 +1358,19 @@ do_trapping(N, Bif, ArgFun) -> io:format("N=~p: Do ~p ~s gc.\n", [N, Bif, case N rem 2 of 0 -> "with"; 1 -> "without" end]), Pid = spawn(?MODULE,trapping_loop,[Bif, ArgFun, 1000, self()]), receive ok -> ok end, - receive after 100 -> ok end, Ref = make_ref(), case N rem 2 of - 0 -> erlang:garbage_collect(Pid, [{async,Ref}]), - receive after 100 -> ok end; + 0 -> + erlang:garbage_collect(Pid, [{async,Ref}]), + receive after 1 -> ok end; 1 -> void end, - exit(Pid,kill), + exit(Pid, kill), case N rem 2 of - 0 -> receive {garbage_collect, Ref, _} -> ok end; - 1 -> void + 0 -> + receive {garbage_collect, Ref, _} -> ok end; + 1 -> + void end, receive after 1 -> ok end, do_trapping(N-1, Bif, ArgFun). |