Finally, fix unwind again -- the easiest chatcher for lazy state

resets is to check for running thread state. If that's the case,
partner is basically a don't care
This commit is contained in:
Jan Stoess 2009-07-21 21:17:54 +02:00
parent 3ebf15e8a4
commit 8b00da0a9f
1 changed files with 11 additions and 7 deletions

View File

@ -452,7 +452,8 @@ static void do_xcpu_unwind_partner (cpu_mb_entry_t * entry)
return;
}
if (! tcb->get_saved_partner ().is_nilthread ())
if (! tcb->get_saved_partner ().is_nilthread () &&
! tcb->get_saved_state ().is_running () )
{
// We have a nested IPC operation. Perform another unwind.
tcb->restore_state ();
@ -525,8 +526,9 @@ redo_unwind:
tag = tag.error_tag ();
}
if (! get_saved_partner ().is_nilthread ())
{
if (! get_saved_partner ().is_nilthread () &&
! get_saved_state ().is_running () )
{
// We're handling a nested IPC.
restore_state ();
goto redo_unwind;
@ -617,8 +619,9 @@ redo_unwind:
}
}
if (! get_saved_partner ().is_nilthread ())
{
if (! get_saved_partner ().is_nilthread () &&
! get_saved_state ().is_running () )
{
// We're handling a nested IPC.
restore_state ();
goto redo_unwind;
@ -696,8 +699,9 @@ redo_unwind:
}
}
if (! get_saved_partner ().is_nilthread ())
{
if (! get_saved_partner ().is_nilthread () &&
! get_saved_state ().is_running () )
{
// We're handling a nested IPC.
restore_state ();
goto redo_unwind;