diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-05-15 09:41:20 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-05-15 12:18:49 +0200 |
commit | b4bdbcfe2738c8ca007801f5a281bdda3a947aca (patch) | |
tree | 2d790830ae62b513d0d1cdeb92524aeb40ab9664 /cpukit/score/src/threadchangepriority.c | |
parent | score: Add and use _Scheduler_SMP_Start_idle() (diff) | |
download | rtems-b4bdbcfe2738c8ca007801f5a281bdda3a947aca.tar.bz2 |
score: Make _Thread_queue_Requeue() static
This function is only used by _Thread_Change_priority(). Make it static
to avoid the function call overhead in the performance critical function
_Thread_Change_priority().
Diffstat (limited to '')
-rw-r--r-- | cpukit/score/src/threadchangepriority.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/cpukit/score/src/threadchangepriority.c b/cpukit/score/src/threadchangepriority.c index 4480b536d0..8059ab1678 100644 --- a/cpukit/score/src/threadchangepriority.c +++ b/cpukit/score/src/threadchangepriority.c @@ -23,6 +23,53 @@ #include <rtems/score/schedulerimpl.h> #include <rtems/score/threadqimpl.h> +/** + * @brief Invoked when a thread changes priority and is blocked. + * + * This routine is invoked when a thread changes priority and is + * blocked on a thread queue. If the queue is priority ordered, + * the_thread is removed from the_thread_queue and reinserted using + * its new priority. This method has no impact on the state of the_thread + * or of any timeouts associated with this blocking. + * + * @param[in] the_thread_queue pointer to a threadq header + * @param[in] the_thread pointer to a thread control block + */ +static void _Thread_queue_Requeue( + Thread_queue_Control *the_thread_queue, + Thread_Control *the_thread +) +{ + /* + * Just in case the thread really wasn't blocked on a thread queue + * when we get here. + */ + if ( !the_thread_queue ) + return; + + /* + * If queueing by FIFO, there is nothing to do. This only applies to + * priority blocking discipline. + */ + if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) { + Thread_queue_Control *tq = the_thread_queue; + ISR_Level level; + ISR_Level level_ignored; + + _ISR_Disable( level ); + if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { + _Thread_queue_Enter_critical_section( tq ); + _Thread_queue_Extract_priority_helper( + the_thread, + the_thread->Wait.return_code, + true + ); + (void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored ); + } + _ISR_Enable( level ); + } +} + void _Thread_Change_priority( Thread_Control *the_thread, Priority_Control new_priority, |