diff options
author | Rickard Green <[email protected]> | 2011-04-07 11:54:37 +0200 |
---|---|---|
committer | Rickard Green <[email protected]> | 2011-04-11 17:29:39 +0200 |
commit | b7ecdcd1ae9e11b8f75e11b82d94da32837932bc (patch) | |
tree | 74ef2fc7fb53a0549c03298b9053fee1c0a5ac1e /erts/emulator/beam/beam_emu.c | |
parent | e63eb63e2e8b8298826f2df7192e982a4e272749 (diff) | |
download | otp-b7ecdcd1ae9e11b8f75e11b82d94da32837932bc.tar.gz otp-b7ecdcd1ae9e11b8f75e11b82d94da32837932bc.tar.bz2 otp-b7ecdcd1ae9e11b8f75e11b82d94da32837932bc.zip |
Fix thread unsafe access
Fix thread unsafe access to process status field introduced in OTP-9125.
Diffstat (limited to 'erts/emulator/beam/beam_emu.c')
-rw-r--r-- | erts/emulator/beam/beam_emu.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c index df9d067727..47bff4a427 100644 --- a/erts/emulator/beam/beam_emu.c +++ b/erts/emulator/beam/beam_emu.c @@ -3419,7 +3419,8 @@ void process_main(void) r(0) = c_p->def_arg_reg[0]; x(1) = c_p->def_arg_reg[1]; x(2) = c_p->def_arg_reg[2]; - if (c_p->status == P_WAITING) { + if (c_p->flags & F_HIBERNATE_SCHED) { + c_p->flags &= ~F_HIBERNATE_SCHED; goto do_schedule; } Dispatch(); @@ -5224,6 +5225,7 @@ void process_main(void) OpCase(i_hibernate): { SWAPOUT; if (erts_hibernate(c_p, r(0), x(1), x(2), reg)) { + c_p->flags &= ~F_HIBERNATE_SCHED; goto do_schedule; } else { I = handle_error(c_p, I, reg, hibernate_3); @@ -6286,6 +6288,7 @@ erts_hibernate(Process* c_p, Eterm module, Eterm function, Eterm args, Eterm* re } erts_smp_proc_unlock(c_p, ERTS_PROC_LOCK_MSGQ|ERTS_PROC_LOCK_STATUS); c_p->current = bif_export[BIF_hibernate_3]->code; + c_p->flags |= F_HIBERNATE_SCHED; /* Needed also when woken! */ return 1; } |