diff options
author | Björn Gustavsson <[email protected]> | 2017-05-31 12:55:40 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2017-05-31 13:04:19 +0200 |
commit | acd8571b35756c3fdc389807c34d80c9d44435e7 (patch) | |
tree | 1b60bbe5a064c3690b74f25d6a99317e5b76eb5f /erts/emulator/beam | |
parent | b182febe36aa63eb8290f24ba4b7932673a9a9bc (diff) | |
download | otp-acd8571b35756c3fdc389807c34d80c9d44435e7.tar.gz otp-acd8571b35756c3fdc389807c34d80c9d44435e7.tar.bz2 otp-acd8571b35756c3fdc389807c34d80c9d44435e7.zip |
Make sure that asynchronous replies are not lost
(First attempt to fix in 23f132d9ab776a.)
If an synchronous GC was requested by calling:
erlang:garbage_collect(Pid, [{async,Ref}])
the reply message could in certain circumstances be
lost.
The problem is that cleanup_sys_tasks() is never called
if there are dirty tasks, but no other active system tasks.
Also shorten the long waiting times in the test case
binary_SUITE:trapping/1 to make it much more likely that
the GC have not already finished when the process is killed.
Diffstat (limited to 'erts/emulator/beam')
-rw-r--r-- | erts/emulator/beam/erl_process.c | 6 |
1 files changed, 5 insertions, 1 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; } |