aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/beam/beam_emu.c
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2011-04-11 18:14:39 +0200
committerErlang/OTP <[email protected]>2011-04-11 18:14:39 +0200
commite21f274af4a3d7af172ae5939c83b868e446113e (patch)
treec39ade0d0cbc131e9bb04d15633f463cb6f8294f /erts/emulator/beam/beam_emu.c
parent105334ce0689a5c0f33dc0e653bd9c193d4a5d92 (diff)
parentb7ecdcd1ae9e11b8f75e11b82d94da32837932bc (diff)
downloadotp-e21f274af4a3d7af172ae5939c83b868e446113e.tar.gz
otp-e21f274af4a3d7af172ae5939c83b868e446113e.tar.bz2
otp-e21f274af4a3d7af172ae5939c83b868e446113e.zip
Merge branch 'rickard/process-status/OTP-9197' into maint-r14
* rickard/process-status/OTP-9197: Fix thread unsafe access Fix lost wakeup when process garbage collected by other Only set status P_WAITING when needed Add testcase for process_info() badarg bug
Diffstat (limited to 'erts/emulator/beam/beam_emu.c')
-rw-r--r--erts/emulator/beam/beam_emu.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c
index 7b2aac0908..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);
@@ -6276,15 +6278,17 @@ erts_hibernate(Process* c_p, Eterm module, Eterm function, Eterm args, Eterm* re
PROCESS_MAIN_CHK_LOCKS(c_p);
erts_smp_proc_lock(c_p, ERTS_PROC_LOCK_MSGQ|ERTS_PROC_LOCK_STATUS);
ASSERT(!ERTS_PROC_IS_EXITING(c_p));
- c_p->status = P_WAITING;
#ifdef ERTS_SMP
ERTS_SMP_MSGQ_MV_INQ2PRIVQ(c_p);
if (c_p->msg.len > 0)
erts_add_to_runq(c_p);
+ else
#endif
+ c_p->status = P_WAITING;
}
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;
}