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/include | |
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/include')
10 files changed, 45 insertions, 1 deletions
diff --git a/cpukit/score/include/rtems/score/scheduler.h b/cpukit/score/include/rtems/score/scheduler.h index 120fdfd239..c8a7f87541 100644 --- a/cpukit/score/include/rtems/score/scheduler.h +++ b/cpukit/score/include/rtems/score/scheduler.h @@ -145,6 +145,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 * ); @@ -535,6 +541,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 a46314c659..bfad633987 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 de06344aa5..5d9b4359c4 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 f8c29e215c..91fa178d20 100644 --- a/cpukit/score/include/rtems/score/schedulerimpl.h +++ b/cpukit/score/include/rtems/score/schedulerimpl.h @@ -508,6 +508,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 9501e3d026..f3e805a43b 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 763523aec3..317411ad7b 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 97370ac510..6ae933f3f7 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 3fa4b333f9..22393790bc 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 bbcdbdb03e..95176dc2c1 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 8390c2d3b9..2cc91835b2 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 \ |