aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/beam_bif_load.c
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2013-01-25 15:18:40 +0100
committerSverker Eriksson <[email protected]>2013-01-28 14:36:25 +0100
commit9d61b560f2d8a08d6cfc95dd09c0d37c1d994153 (patch)
tree685f564244597bed31fd64692719a009f466fa01 /erts/emulator/beam/beam_bif_load.c
parentbe062ca7528b3267a6ef08653b001913fc12ae8e (diff)
downloadotp-9d61b560f2d8a08d6cfc95dd09c0d37c1d994153.tar.gz
otp-9d61b560f2d8a08d6cfc95dd09c0d37c1d994153.tar.bz2
otp-9d61b560f2d8a08d6cfc95dd09c0d37c1d994153.zip
erts: Fix ASSERT crash in erts_try_seize_code_write_permission
ASSERT(code_writing_process != c_p); The assert was actually harmless and could be removed as one solution. But I think it's better to keep it as a way to catch bugs that would otherwise lead to horrible deadlocks if a thread "forgets" to call erts_release_code_write_permission(). As a result erts_release_code_write_permission() must be called BEFORE resuming the suspended process.
Diffstat (limited to 'erts/emulator/beam/beam_bif_load.c')
-rw-r--r--erts/emulator/beam/beam_bif_load.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/erts/emulator/beam/beam_bif_load.c b/erts/emulator/beam/beam_bif_load.c
index e0a4f86d2d..73264214ce 100644
--- a/erts/emulator/beam/beam_bif_load.c
+++ b/erts/emulator/beam/beam_bif_load.c
@@ -389,16 +389,16 @@ static void smp_code_ix_commiter(void* null)
Process* p = commiter_state.stager;
erts_commit_staging_code_ix();
+#ifdef DEBUG
+ commiter_state.stager = NULL;
+#endif
+ erts_release_code_write_permission();
erts_smp_proc_lock(p, ERTS_PROC_LOCK_STATUS);
if (!ERTS_PROC_IS_EXITING(p)) {
erts_resume(p, ERTS_PROC_LOCK_STATUS);
}
erts_smp_proc_unlock(p, ERTS_PROC_LOCK_STATUS);
erts_smp_proc_dec_refc(p);
-#ifdef DEBUG
- commiter_state.stager = NULL;
-#endif
- erts_release_code_write_permission();
}
#endif /* ERTS_SMP */