diff options
author | Lukas Larsson <[email protected]> | 2016-04-18 17:38:45 +0200 |
---|---|---|
committer | Lukas Larsson <[email protected]> | 2016-04-18 17:41:26 +0200 |
commit | 1afc15d988ee9fc57eaf9728dc52d8df75b5b12d (patch) | |
tree | ce6caf408be06da4c4c1c6f68647b6bf885a86b3 /erts/emulator | |
parent | 6f137f7f326a03098d72806495a1365938f14314 (diff) | |
download | otp-1afc15d988ee9fc57eaf9728dc52d8df75b5b12d.tar.gz otp-1afc15d988ee9fc57eaf9728dc52d8df75b5b12d.tar.bz2 otp-1afc15d988ee9fc57eaf9728dc52d8df75b5b12d.zip |
erts: Fix lock order bug when only child is procs traced
Diffstat (limited to 'erts/emulator')
-rw-r--r-- | erts/emulator/beam/erl_process.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c index a520005c35..1a66044627 100644 --- a/erts/emulator/beam/erl_process.c +++ b/erts/emulator/beam/erl_process.c @@ -11183,10 +11183,12 @@ erl_create_process(Process* parent, /* Parent of process (default group leader). } if (IS_TRACED_FL(p, F_TRACE_PROCS)) { - if (locks & (ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE)) { + if ((locks & (ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE)) + == (ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE)) { + /* This happens when parent was not traced, but child is */ locks &= ~(ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE); - erts_smp_proc_unlock(p, locks & (ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE)); - erts_smp_proc_unlock(parent, locks & (ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE)); + erts_smp_proc_unlock(p, ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE); + erts_smp_proc_unlock(parent, ERTS_PROC_LOCK_STATUS|ERTS_PROC_LOCK_TRACE); } trace_proc_spawn(p, am_spawned, parent->common.id, mod, func, args); if (so->flags & SPO_LINK) |