aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/beam_bif_load.c
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2016-10-26 16:42:05 +0200
committerSverker Eriksson <[email protected]>2016-10-26 17:30:25 +0200
commit6408400fc1ca9609169f6a0450f1c4671aced91c (patch)
treef22a7379d38e3db9de31fe2c063801d89ff652c4 /erts/emulator/beam/beam_bif_load.c
parent23ecba248ade6e4f1a6ed58c6636598643916019 (diff)
downloadotp-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.c4
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