good.
On Wed, Aug 3, 2016 at 9:43 AM, Sebastian Huber <sebastian.hu...@embedded-brains.de> wrote: > Do not use a deadline value of zero to indicate a job cancellation. Use > a dedicated scheduler operation for this. > --- > cpukit/rtems/src/ratemoncancel.c | 2 +- > cpukit/score/include/rtems/score/scheduler.h | 17 ++++++++ > cpukit/score/include/rtems/score/schedulercbs.h | 1 + > cpukit/score/include/rtems/score/scheduleredf.h | 8 +++- > cpukit/score/include/rtems/score/schedulerimpl.h | 14 +++++++ > .../score/include/rtems/score/schedulerpriority.h | 1 + > .../rtems/score/schedulerpriorityaffinitysmp.h | 1 + > .../include/rtems/score/schedulerprioritysmp.h | 1 + > cpukit/score/include/rtems/score/schedulersimple.h | 1 + > .../score/include/rtems/score/schedulersimplesmp.h | 1 + > .../score/include/rtems/score/schedulerstrongapa.h | 1 + > cpukit/score/src/schedulerdefaultreleasejob.c | 9 +++++ > cpukit/score/src/scheduleredfreleasejob.c | 46 > ++++++++++++++++++---- > 13 files changed, 94 insertions(+), 9 deletions(-) > > diff --git a/cpukit/rtems/src/ratemoncancel.c > b/cpukit/rtems/src/ratemoncancel.c > index af6b1ec..41ba488 100644 > --- a/cpukit/rtems/src/ratemoncancel.c > +++ b/cpukit/rtems/src/ratemoncancel.c > @@ -38,7 +38,7 @@ void _Rate_monotonic_Cancel( > cpu_self = _Thread_Dispatch_disable_critical( lock_context ); > _Rate_monotonic_Release( owner, lock_context ); > > - _Scheduler_Release_job( owner, 0 ); > + _Scheduler_Cancel_job( owner ); > > _Thread_Dispatch_enable( cpu_self ); > } > diff --git a/cpukit/score/include/rtems/score/scheduler.h > b/cpukit/score/include/rtems/score/scheduler.h > index c20e68c..20615a2 100644 > --- a/cpukit/score/include/rtems/score/scheduler.h > +++ b/cpukit/score/include/rtems/score/scheduler.h > @@ -141,6 +141,12 @@ typedef struct { > uint64_t > ); > > + /** @see _Scheduler_Cancel_job() */ > + void ( *cancel_job ) ( > + const Scheduler_Control *, > + Thread_Control * > + ); > + > /** @see _Scheduler_Tick() */ > void ( *tick )( const Scheduler_Control *, Thread_Control * ); > > @@ -376,6 +382,17 @@ void _Scheduler_default_Release_job( > ); > > /** > + * @brief Does nothing. > + * > + * @param[in] scheduler Unused. > + * @param[in] the_thread Unused. > + */ > +void _Scheduler_default_Cancel_job( > + const Scheduler_Control *scheduler, > + Thread_Control *the_thread > +); > + > +/** > * @brief Performs tick operations depending on the CPU budget algorithm for > * each executing thread. > * > diff --git a/cpukit/score/include/rtems/score/schedulercbs.h > b/cpukit/score/include/rtems/score/schedulercbs.h > index a46314c..bfad633 100644 > --- a/cpukit/score/include/rtems/score/schedulercbs.h > +++ b/cpukit/score/include/rtems/score/schedulercbs.h > @@ -61,6 +61,7 @@ extern "C" { > _Scheduler_CBS_Node_initialize, /* node initialize entry point */ \ > _Scheduler_default_Node_destroy, /* node destroy entry point */ \ > _Scheduler_CBS_Release_job, /* new period of task */ \ > + _Scheduler_EDF_Cancel_job, /* cancel period of task */ \ > _Scheduler_default_Tick, /* tick entry point */ \ > _Scheduler_default_Start_idle /* start idle entry point */ \ > SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \ > diff --git a/cpukit/score/include/rtems/score/scheduleredf.h > b/cpukit/score/include/rtems/score/scheduleredf.h > index de06344..5d9b435 100644 > --- a/cpukit/score/include/rtems/score/scheduleredf.h > +++ b/cpukit/score/include/rtems/score/scheduleredf.h > @@ -61,6 +61,7 @@ extern "C" { > _Scheduler_EDF_Node_initialize, /* node initialize entry point */ \ > _Scheduler_default_Node_destroy, /* node destroy entry point */ \ > _Scheduler_EDF_Release_job, /* new period of task */ \ > + _Scheduler_EDF_Cancel_job, /* cancel period of task */ \ > _Scheduler_default_Tick, /* tick entry point */ \ > _Scheduler_default_Start_idle /* start idle entry point */ \ > SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \ > @@ -227,12 +228,17 @@ Scheduler_Void_or_thread _Scheduler_EDF_Yield( > * the job was cancelled or deleted, thus a running task > * has to be suspended. > */ > -void _Scheduler_EDF_Release_job ( > +void _Scheduler_EDF_Release_job( > const Scheduler_Control *scheduler, > Thread_Control *the_thread, > uint64_t deadline > ); > > +void _Scheduler_EDF_Cancel_job( > + const Scheduler_Control *scheduler, > + Thread_Control *the_thread > +); > + > #ifdef __cplusplus > } > #endif > diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h > b/cpukit/score/include/rtems/score/schedulerimpl.h > index dd7fa28..23b73f0 100644 > --- a/cpukit/score/include/rtems/score/schedulerimpl.h > +++ b/cpukit/score/include/rtems/score/schedulerimpl.h > @@ -499,6 +499,20 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Release_job( > } > > /** > + * @brief Cancels a job of a thread with respect to the scheduler. > + * > + * @param[in] the_thread The thread. > + */ > +RTEMS_INLINE_ROUTINE void _Scheduler_Cancel_job( > + Thread_Control *the_thread > +) > +{ > + const Scheduler_Control *scheduler = _Scheduler_Get( the_thread ); > + > + ( *scheduler->Operations.cancel_job )( scheduler, the_thread ); > +} > + > +/** > * @brief Scheduler method invoked at each clock tick. > * > * This method is invoked at each clock tick to allow the scheduler > diff --git a/cpukit/score/include/rtems/score/schedulerpriority.h > b/cpukit/score/include/rtems/score/schedulerpriority.h > index 9501e3d..f3e805a 100644 > --- a/cpukit/score/include/rtems/score/schedulerpriority.h > +++ b/cpukit/score/include/rtems/score/schedulerpriority.h > @@ -51,6 +51,7 @@ extern "C" { > _Scheduler_priority_Node_initialize, /* node initialize entry point */ \ > _Scheduler_default_Node_destroy, /* node destroy entry point */ \ > _Scheduler_default_Release_job, /* new period of task */ \ > + _Scheduler_default_Cancel_job, /* cancel period of task */ \ > _Scheduler_default_Tick, /* tick entry point */ \ > _Scheduler_default_Start_idle /* start idle entry point */ \ > SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \ > diff --git a/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h > b/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h > index 763523a..317411a 100644 > --- a/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h > +++ b/cpukit/score/include/rtems/score/schedulerpriorityaffinitysmp.h > @@ -61,6 +61,7 @@ extern "C" { > _Scheduler_priority_affinity_SMP_Node_initialize, \ > _Scheduler_default_Node_destroy, \ > _Scheduler_default_Release_job, \ > + _Scheduler_default_Cancel_job, \ > _Scheduler_default_Tick, \ > _Scheduler_SMP_Start_idle, \ > _Scheduler_priority_affinity_SMP_Get_affinity, \ > diff --git a/cpukit/score/include/rtems/score/schedulerprioritysmp.h > b/cpukit/score/include/rtems/score/schedulerprioritysmp.h > index 97370ac..6ae933f 100644 > --- a/cpukit/score/include/rtems/score/schedulerprioritysmp.h > +++ b/cpukit/score/include/rtems/score/schedulerprioritysmp.h > @@ -90,6 +90,7 @@ typedef struct { > _Scheduler_priority_SMP_Node_initialize, \ > _Scheduler_default_Node_destroy, \ > _Scheduler_default_Release_job, \ > + _Scheduler_default_Cancel_job, \ > _Scheduler_default_Tick, \ > _Scheduler_SMP_Start_idle \ > SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \ > diff --git a/cpukit/score/include/rtems/score/schedulersimple.h > b/cpukit/score/include/rtems/score/schedulersimple.h > index 3fa4b33..2239379 100644 > --- a/cpukit/score/include/rtems/score/schedulersimple.h > +++ b/cpukit/score/include/rtems/score/schedulersimple.h > @@ -51,6 +51,7 @@ extern "C" { > _Scheduler_default_Node_initialize, /* node initialize entry point */ \ > _Scheduler_default_Node_destroy, /* node destroy entry point */ \ > _Scheduler_default_Release_job, /* new period of task */ \ > + _Scheduler_default_Cancel_job, /* cancel period of task */ \ > _Scheduler_default_Tick, /* tick entry point */ \ > _Scheduler_default_Start_idle /* start idle entry point */ \ > SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \ > diff --git a/cpukit/score/include/rtems/score/schedulersimplesmp.h > b/cpukit/score/include/rtems/score/schedulersimplesmp.h > index bbcdbdb..95176dc 100644 > --- a/cpukit/score/include/rtems/score/schedulersimplesmp.h > +++ b/cpukit/score/include/rtems/score/schedulersimplesmp.h > @@ -73,6 +73,7 @@ typedef struct { > _Scheduler_simple_SMP_Node_initialize, \ > _Scheduler_default_Node_destroy, \ > _Scheduler_default_Release_job, \ > + _Scheduler_default_Cancel_job, \ > _Scheduler_default_Tick, \ > _Scheduler_SMP_Start_idle \ > SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \ > diff --git a/cpukit/score/include/rtems/score/schedulerstrongapa.h > b/cpukit/score/include/rtems/score/schedulerstrongapa.h > index 8390c2d..2cc9183 100644 > --- a/cpukit/score/include/rtems/score/schedulerstrongapa.h > +++ b/cpukit/score/include/rtems/score/schedulerstrongapa.h > @@ -90,6 +90,7 @@ typedef struct { > _Scheduler_strong_APA_Node_initialize, \ > _Scheduler_default_Node_destroy, \ > _Scheduler_default_Release_job, \ > + _Scheduler_default_Cancel_job, \ > _Scheduler_default_Tick, \ > _Scheduler_SMP_Start_idle \ > SCHEDULER_OPERATION_DEFAULT_GET_SET_AFFINITY \ > diff --git a/cpukit/score/src/schedulerdefaultreleasejob.c > b/cpukit/score/src/schedulerdefaultreleasejob.c > index db4ab0e..439f6b2 100644 > --- a/cpukit/score/src/schedulerdefaultreleasejob.c > +++ b/cpukit/score/src/schedulerdefaultreleasejob.c > @@ -31,3 +31,12 @@ void _Scheduler_default_Release_job( > (void) the_thread; > (void) deadline; > } > + > +void _Scheduler_default_Cancel_job( > + const Scheduler_Control *scheduler, > + Thread_Control *the_thread > +) > +{ > + (void) scheduler; > + (void) the_thread; > +} > diff --git a/cpukit/score/src/scheduleredfreleasejob.c > b/cpukit/score/src/scheduleredfreleasejob.c > index 76c08e0..f2ee75b 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 = _Thread_Get_priority( the_thread ); > 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 > ); > } > -- > 1.8.4.5 > > _______________________________________________ > devel mailing list > devel@rtems.org > http://lists.rtems.org/mailman/listinfo/devel _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel