diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-06-09 21:30:40 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-06-22 14:37:11 +0200 |
commit | 99fc1d1d1b44e70a0bed4c94a514bd3f3b5df64f (patch) | |
tree | 3d290aed9fb42872d1ec6457025eb66a7303dec5 /cpukit/score/src/scheduleredfchangepriority.c | |
parent | score: Modify release job scheduler operation (diff) | |
download | rtems-99fc1d1d1b44e70a0bed4c94a514bd3f3b5df64f.tar.bz2 |
score: Rework EDF scheduler
Use inline red-black tree insert. Do not use shifting priorities since
this is not supported by the thread queues. Due to the 32-bit
Priority_Control this currently limits the uptime to 49days with a 1ms
clock tick.
Update #2173.
Diffstat (limited to 'cpukit/score/src/scheduleredfchangepriority.c')
-rw-r--r-- | cpukit/score/src/scheduleredfchangepriority.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/cpukit/score/src/scheduleredfchangepriority.c b/cpukit/score/src/scheduleredfchangepriority.c index 6efbf87ad3..a0f5ec7061 100644 --- a/cpukit/score/src/scheduleredfchangepriority.c +++ b/cpukit/score/src/scheduleredfchangepriority.c @@ -43,17 +43,25 @@ Scheduler_Void_or_thread _Scheduler_EDF_Change_priority( bool prepend_it ) { - Scheduler_EDF_Context *context = - _Scheduler_EDF_Get_context( scheduler ); - Scheduler_EDF_Node *node = _Scheduler_EDF_Thread_get_node( the_thread ); - - _RBTree_Extract( &context->Ready, &node->Node ); - _RBTree_Insert( - &context->Ready, - &node->Node, - _Scheduler_EDF_Compare, - false - ); + Scheduler_EDF_Context *context; + Scheduler_EDF_Node *node; + + context = _Scheduler_EDF_Get_context( scheduler ); + node = _Scheduler_EDF_Thread_get_node( the_thread ); + + if ( ( new_priority & SCHEDULER_EDF_PRIO_MSB ) != 0 ) { + node->background_priority = new_priority; + } + + node->current_priority = new_priority; + + _Scheduler_EDF_Extract( context, node ); + + if ( prepend_it ) { + _Scheduler_EDF_Enqueue_first( context, node, new_priority ); + } else { + _Scheduler_EDF_Enqueue( context, node, new_priority ); + } _Scheduler_EDF_Schedule_body( scheduler, the_thread, false ); |