diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-06-08 22:22:46 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-06-22 14:44:56 +0200 |
commit | 9bfad8cd519f17cbb26a672868169fcd304d5bd5 (patch) | |
tree | 3a07add3fb0cdf47fe4d5c9432ad931429c05d65 /cpukit/score/src/threadchangepriority.c | |
parent | score: Move _RBTree_Find() (diff) | |
download | rtems-9bfad8cd519f17cbb26a672868169fcd304d5bd5.tar.bz2 |
score: Add thread priority to scheduler nodes
The thread priority is manifest in two independent areas. One area is
the user visible thread priority along with a potential thread queue.
The other is the scheduler. Currently, a thread priority update via
_Thread_Change_priority() first updates the user visble thread priority
and the thread queue, then the scheduler is notified if necessary. The
priority is passed to the scheduler via a local variable. A generation
counter ensures that the scheduler discards out-of-date priorities.
This use of a local variable ties the update in these two areas close
together. For later enhancements and the OMIP locking protocol
implementation we need more flexibility. Add a thread priority
information block to Scheduler_Node and synchronize priority value
updates via a sequence lock on SMP configurations.
Update #2556.
Diffstat (limited to '')
-rw-r--r-- | cpukit/score/src/threadchangepriority.c | 21 |
1 files changed, 5 insertions, 16 deletions
diff --git a/cpukit/score/src/threadchangepriority.c b/cpukit/score/src/threadchangepriority.c index 152646f52f..7b22371326 100644 --- a/cpukit/score/src/threadchangepriority.c +++ b/cpukit/score/src/threadchangepriority.c @@ -50,11 +50,12 @@ void _Thread_Change_priority( * we are not REALLY changing priority. */ if ( ( *filter )( the_thread, &new_priority, arg ) ) { - uint32_t my_generation; + Scheduler_Node *own_node; + + own_node = _Scheduler_Thread_get_own_node( the_thread ); + _Scheduler_Node_set_priority( own_node, new_priority, prepend_it ); - my_generation = the_thread->priority_generation + 1; the_thread->current_priority = new_priority; - the_thread->priority_generation = my_generation; ( *the_thread->Wait.operations->priority_change )( the_thread, @@ -65,19 +66,7 @@ void _Thread_Change_priority( _Thread_Lock_release( lock, &lock_context ); _Thread_State_acquire( the_thread, &lock_context ); - - if ( the_thread->priority_generation == my_generation ) { - if ( _States_Is_ready( the_thread->current_state ) ) { - _Scheduler_Change_priority( - the_thread, - new_priority, - prepend_it - ); - } else { - _Scheduler_Update_priority( the_thread, new_priority ); - } - } - + _Scheduler_Update_priority( the_thread ); _Thread_State_release( the_thread, &lock_context ); } else { _Thread_Lock_release( lock, &lock_context ); |