aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/beam_debug.c
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2012-02-22 19:25:59 +0100
committerSverker Eriksson <[email protected]>2012-02-23 12:19:42 +0100
commit6d7073e33a8f326b8a37eaf5539aa322a06a732c (patch)
tree7f4f87f1649772b17899fbdc63bbea37ebccdd62 /erts/emulator/beam/beam_debug.c
parent17c62a8d1158e2c13be403e62d81140c705a8444 (diff)
downloadotp-6d7073e33a8f326b8a37eaf5539aa322a06a732c.tar.gz
otp-6d7073e33a8f326b8a37eaf5539aa322a06a732c.tar.bz2
otp-6d7073e33a8f326b8a37eaf5539aa322a06a732c.zip
erts: Seize code_ix lock when updating trace settings
We want to avoid the race when trace settings are done in the time gap while a code stager process is waiting for thread process before commiting and releasing code_ix lock.
Diffstat (limited to 'erts/emulator/beam/beam_debug.c')
-rw-r--r--erts/emulator/beam/beam_debug.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/erts/emulator/beam/beam_debug.c b/erts/emulator/beam/beam_debug.c
index d9e9d0e348..d288a37911 100644
--- a/erts/emulator/beam/beam_debug.c
+++ b/erts/emulator/beam/beam_debug.c
@@ -114,6 +114,10 @@ erts_debug_breakpoint_2(BIF_ALIST_2)
mfa[2] = signed_val(mfa[2]);
}
+ if (!erts_try_lock_code_ix(BIF_P)) {
+ ERTS_BIF_YIELD2(bif_export[BIF_erts_debug_breakpoint_2],
+ BIF_P, BIF_ARG_1, BIF_ARG_2);
+ }
erts_smp_proc_unlock(p, ERTS_PROC_LOCK_MAIN);
erts_smp_thr_progress_block();
@@ -125,7 +129,7 @@ erts_debug_breakpoint_2(BIF_ALIST_2)
erts_smp_thr_progress_unblock();
erts_smp_proc_lock(p, ERTS_PROC_LOCK_MAIN);
-
+ erts_unlock_code_ix();
return res;
error: