aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2013-01-28 14:36:59 +0100
committerSverker Eriksson <[email protected]>2013-01-28 14:36:59 +0100
commitb59b81bf13b2666496a5789125f5d53fb4d2b88a (patch)
tree9a36262eaac2f8046a94561888fd6883a85f3f53
parent58482ed3f2b2f90f8be35b85d5d16f3f40f80fa3 (diff)
parent9d61b560f2d8a08d6cfc95dd09c0d37c1d994153 (diff)
downloadotp-b59b81bf13b2666496a5789125f5d53fb4d2b88a.tar.gz
otp-b59b81bf13b2666496a5789125f5d53fb4d2b88a.tar.bz2
otp-b59b81bf13b2666496a5789125f5d53fb4d2b88a.zip
Merge branch 'sverk/code_write_permission-assert'
* sverk/code_write_permission-assert: erts: Fix ASSERT crash in erts_try_seize_code_write_permission
-rw-r--r--erts/emulator/beam/beam_bif_load.c8
-rw-r--r--erts/emulator/beam/code_ix.h5
-rw-r--r--erts/emulator/beam/erl_bif_trace.c2
3 files changed, 8 insertions, 7 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 */
diff --git a/erts/emulator/beam/code_ix.h b/erts/emulator/beam/code_ix.h
index e2bd0da112..3f4f9776a4 100644
--- a/erts/emulator/beam/code_ix.h
+++ b/erts/emulator/beam/code_ix.h
@@ -76,7 +76,7 @@ ErtsCodeIndex erts_active_code_ix(void);
/* Return staging code ix.
* Only used by a process performing code loading/upgrading/deleting/purging.
- * code_ix must be locked.
+ * Code write permission must be seized.
*/
ERTS_GLB_INLINE
ErtsCodeIndex erts_staging_code_ix(void);
@@ -84,9 +84,10 @@ ErtsCodeIndex erts_staging_code_ix(void);
/* Try seize exclusive code write permission. Needed for code staging.
* Main process lock (only) must be held.
* System thread progress must not be blocked.
+ * Caller must not already hold the code write permission.
* Caller is suspended and *must* yield if 0 is returned.
*/
-int erts_try_seize_code_write_permission(struct process*);
+int erts_try_seize_code_write_permission(struct process* c_p);
/* Release code write permission.
* Will resume any suspended waiters.
diff --git a/erts/emulator/beam/erl_bif_trace.c b/erts/emulator/beam/erl_bif_trace.c
index 99a4394666..69105b8f27 100644
--- a/erts/emulator/beam/erl_bif_trace.c
+++ b/erts/emulator/beam/erl_bif_trace.c
@@ -386,13 +386,13 @@ static void smp_bp_finisher(void* null)
#ifdef DEBUG
finish_bp.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);
- erts_release_code_write_permission();
}
}
#endif /* ERTS_SMP */