diff options
author | Sverker Eriksson <[email protected]> | 2016-10-26 16:42:05 +0200 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2016-10-26 17:30:25 +0200 |
commit | 6408400fc1ca9609169f6a0450f1c4671aced91c (patch) | |
tree | f22a7379d38e3db9de31fe2c063801d89ff652c4 /erts/emulator/beam/beam_bif_load.c | |
parent | 23ecba248ade6e4f1a6ed58c6636598643916019 (diff) | |
download | otp-6408400fc1ca9609169f6a0450f1c4671aced91c.tar.gz otp-6408400fc1ca9609169f6a0450f1c4671aced91c.tar.bz2 otp-6408400fc1ca9609169f6a0450f1c4671aced91c.zip |
erts: Avoid delayed fun undef race
Avoid suspending fun caller not just if purge is already done
but also if purge of another module has started. Another purge
of the same module again cannot happen as making current to old
transition includes thread progress.
Diffstat (limited to 'erts/emulator/beam/beam_bif_load.c')
-rw-r--r-- | erts/emulator/beam/beam_bif_load.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/erts/emulator/beam/beam_bif_load.c b/erts/emulator/beam/beam_bif_load.c index 5969197168..8af7703f51 100644 --- a/erts/emulator/beam/beam_bif_load.c +++ b/erts/emulator/beam/beam_bif_load.c @@ -1623,10 +1623,10 @@ erts_purge_state_add_fun(ErlFunEntry *fe) } Export * -erts_suspend_process_on_pending_purge_lambda(Process *c_p) +erts_suspend_process_on_pending_purge_lambda(Process *c_p, ErlFunEntry* fe) { erts_smp_mtx_lock(&purge_state.mtx); - if (is_value(purge_state.module)) { + if (purge_state.module == fe->module) { /* * The process c_p is about to call a fun in the code * that we are trying to purge. Suspend it and call |