diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-08-03 15:41:31 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-08-04 07:44:47 +0200 |
commit | 21bdca49eea9213cc31a497072d01192eed8675e (patch) | |
tree | fcfc8e0c3e4f7c38b7c7f06bc6d0076deb10edaf /cpukit/score/src/scheduleredfreleasejob.c | |
parent | score: Fix and simplify thread wait locks (diff) | |
download | rtems-21bdca49eea9213cc31a497072d01192eed8675e.tar.bz2 |
score: Indroduce cancel job scheduler operation
Do not use a deadline value of zero to indicate a job cancellation. Use
a dedicated scheduler operation for this.
Diffstat (limited to 'cpukit/score/src/scheduleredfreleasejob.c')
-rw-r--r-- | cpukit/score/src/scheduleredfreleasejob.c | 46 |
1 files changed, 39 insertions, 7 deletions
diff --git a/cpukit/score/src/scheduleredfreleasejob.c b/cpukit/score/src/scheduleredfreleasejob.c index b35fb9d80e..26b303acc0 100644 --- a/cpukit/score/src/scheduleredfreleasejob.c +++ b/cpukit/score/src/scheduleredfreleasejob.c @@ -20,7 +20,7 @@ #include <rtems/score/scheduleredfimpl.h> -static bool _Scheduler_EDF_Priority_filter( +static bool _Scheduler_EDF_Release_job_filter( Thread_Control *the_thread, Priority_Control *new_priority_p, void *arg @@ -35,10 +35,6 @@ static bool _Scheduler_EDF_Priority_filter( current_priority = the_thread->current_priority; new_priority = *new_priority_p; - if ( new_priority == 0 ) { - new_priority = node->background_priority; - } - node->current_priority = new_priority; the_thread->real_priority = new_priority; @@ -54,9 +50,45 @@ void _Scheduler_EDF_Release_job( { _Thread_Change_priority( the_thread, - (Priority_Control) deadline, + deadline, + NULL, + _Scheduler_EDF_Release_job_filter, + true + ); +} + +static bool _Scheduler_EDF_Cancel_job_filter( + Thread_Control *the_thread, + Priority_Control *new_priority_p, + void *arg +) +{ + Scheduler_EDF_Node *node; + Priority_Control current_priority; + Priority_Control new_priority; + + node = _Scheduler_EDF_Thread_get_node( the_thread ); + + current_priority = _Thread_Get_priority( the_thread ); + new_priority = node->background_priority; + + node->current_priority = new_priority; + the_thread->real_priority = new_priority; + + return _Thread_Priority_less_than( current_priority, new_priority ) + || !_Thread_Owns_resources( the_thread ); +} + +void _Scheduler_EDF_Cancel_job( + const Scheduler_Control *scheduler, + Thread_Control *the_thread +) +{ + _Thread_Change_priority( + the_thread, + 0, NULL, - _Scheduler_EDF_Priority_filter, + _Scheduler_EDF_Cancel_job_filter, true ); } |