diff options
Diffstat (limited to '')
-rw-r--r-- | cpukit/score/src/schedulerpriorityunblock.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/cpukit/score/src/schedulerpriorityunblock.c b/cpukit/score/src/schedulerpriorityunblock.c index c0ca1924d2..8c0f490c8c 100644 --- a/cpukit/score/src/schedulerpriorityunblock.c +++ b/cpukit/score/src/schedulerpriorityunblock.c @@ -23,5 +23,26 @@ void _Scheduler_priority_Unblock ( Thread_Control *the_thread ) { - _Scheduler_priority_Unblock_body(the_thread); + _Scheduler_priority_Ready_queue_enqueue(the_thread); + + /* TODO: flash critical section? */ + + /* + * If the thread that was unblocked is more important than the heir, + * then we have a new heir. This may or may not result in a + * context switch. + * + * Normal case: + * If the current thread is preemptible, then we need to do + * a context switch. + * Pseudo-ISR case: + * Even if the thread isn't preemptible, if the new heir is + * a pseudo-ISR system task, we need to do a context switch. + */ + if ( the_thread->current_priority < _Thread_Heir->current_priority ) { + _Thread_Heir = the_thread; + if ( _Thread_Executing->is_preemptible || + the_thread->current_priority == 0 ) + _Thread_Dispatch_necessary = true; + } } |