From a710eaed0a02577adad408d20a1246908cb0a9bf Mon Sep 17 00:00:00 2001 From: Tido Klaassen Date: Tue, 24 May 2016 17:57:49 +0200 Subject: [PATCH] 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. --- kernel/atomkernel.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/kernel/atomkernel.c b/kernel/atomkernel.c index 06ab2cc..e20b966 100755 --- a/kernel/atomkernel.c +++ b/kernel/atomkernel.c @@ -332,6 +332,13 @@ void atomSched (uint8_t timer_tick) */ 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 * 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 */ 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 */ archContextSwitch (old_tcb, new_tcb); }