Fix potential TCB loss

Always clear "suspended" flag in atomThreadSwitch(), even if new
and old TCB are identical. Otherwise TCB could get lost during
next task scheduling.
This commit is contained in:
Tido Klaassen
2016-05-24 17:57:49 +02:00
parent b0afc266d1
commit a710eaed0a

View File

@@ -332,6 +332,13 @@ void atomSched (uint8_t timer_tick)
*/ */
static void atomThreadSwitch(ATOM_TCB *old_tcb, ATOM_TCB *new_tcb) static void atomThreadSwitch(ATOM_TCB *old_tcb, ATOM_TCB *new_tcb)
{ {
/**
* The context switch will shift execution to a different thread. The
* new thread is now ready to run so clear its suspend status in
* preparation for it waking up.
*/
new_tcb->suspended = FALSE;
/** /**
* Check if the new thread is actually the current one, in which * Check if the new thread is actually the current one, in which
* case we don't need to do any context switch. This can happen * case we don't need to do any context switch. This can happen
@@ -343,13 +350,6 @@ static void atomThreadSwitch(ATOM_TCB *old_tcb, ATOM_TCB *new_tcb)
/* Set the new currently-running thread pointer */ /* Set the new currently-running thread pointer */
curr_tcb = new_tcb; curr_tcb = new_tcb;
/**
* The context switch will shift execution to a different thread. The
* new thread is now ready to run so clear its suspend status in
* preparation for it waking up.
*/
new_tcb->suspended = FALSE;
/* Call the architecture-specific context switch */ /* Call the architecture-specific context switch */
archContextSwitch (old_tcb, new_tcb); archContextSwitch (old_tcb, new_tcb);
} }