diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-12-07 12:00:42 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-12-08 17:25:15 +0100 |
commit | 6330e0350256140c621bbfeaaf92bb578858e052 (patch) | |
tree | 975d3d01ffd27ca8c62609f8b1c199adce061095 | |
parent | 1acb9a86b1033c1097ea5f02a57a67d7894819cb (diff) |
testsuites/validation/tc-sched-yield.c
-rw-r--r-- | testsuites/validation/tc-sched-yield.c | 217 |
1 files changed, 161 insertions, 56 deletions
diff --git a/testsuites/validation/tc-sched-yield.c b/testsuites/validation/tc-sched-yield.c index 5421f734a0..8aa953fd46 100644 --- a/testsuites/validation/tc-sched-yield.c +++ b/testsuites/validation/tc-sched-yield.c @@ -82,16 +82,23 @@ typedef enum { } ScoreSchedReqYield_Pre_UsedScheduler; typedef enum { + ScoreSchedReqYield_Pre_HomeSchedulerState_Blocked, + ScoreSchedReqYield_Pre_HomeSchedulerState_Scheduled, + ScoreSchedReqYield_Pre_HomeSchedulerState_Ready, + ScoreSchedReqYield_Pre_HomeSchedulerState_NA +} ScoreSchedReqYield_Pre_HomeSchedulerState; + +typedef enum { ScoreSchedReqYield_Pre_Sticky_Yes, ScoreSchedReqYield_Pre_Sticky_No, ScoreSchedReqYield_Pre_Sticky_NA } ScoreSchedReqYield_Pre_Sticky; typedef enum { - ScoreSchedReqYield_Pre_OtherReady_Yes, - ScoreSchedReqYield_Pre_OtherReady_No, - ScoreSchedReqYield_Pre_OtherReady_NA -} ScoreSchedReqYield_Pre_OtherReady; + ScoreSchedReqYield_Pre_Other_Yes, + ScoreSchedReqYield_Pre_Other_No, + ScoreSchedReqYield_Pre_Other_NA +} ScoreSchedReqYield_Pre_Other; typedef enum { ScoreSchedReqYield_Post_HomeSchedulerState_Blocked, @@ -111,8 +118,9 @@ typedef struct { uint16_t Skip : 1; uint16_t Pre_EligibleScheduler_NA : 1; uint16_t Pre_UsedScheduler_NA : 1; + uint16_t Pre_HomeSchedulerState_NA : 1; uint16_t Pre_Sticky_NA : 1; - uint16_t Pre_OtherReady_NA : 1; + uint16_t Pre_Other_NA : 1; uint16_t Post_HomeSchedulerState : 3; uint16_t Post_AskForHelp : 2; } ScoreSchedReqYield_Entry; @@ -149,13 +157,19 @@ typedef struct { bool use_helping; /** + * @brief If this member is true, then the runner shall be ready in its home + * scheduler. + */ + bool ready; + + /** * @brief If this member is true, then the runner shall be sticky. */ bool sticky; /** * @brief If this member is true, then another ready task in the home - * scheduler of the runner shall exist. + * scheduler of the runner shall be ready with an equal priority. */ bool other_ready; @@ -175,7 +189,7 @@ typedef struct { /** * @brief This member defines the pre-condition states for the next action. */ - size_t pcs[ 4 ]; + size_t pcs[ 5 ]; /** * @brief If this member is true, then the test action loop is executed. @@ -215,13 +229,20 @@ static const char * const ScoreSchedReqYield_PreDesc_UsedScheduler[] = { "NA" }; +static const char * const ScoreSchedReqYield_PreDesc_HomeSchedulerState[] = { + "Blocked", + "Scheduled", + "Ready", + "NA" +}; + static const char * const ScoreSchedReqYield_PreDesc_Sticky[] = { "Yes", "No", "NA" }; -static const char * const ScoreSchedReqYield_PreDesc_OtherReady[] = { +static const char * const ScoreSchedReqYield_PreDesc_Other[] = { "Yes", "No", "NA" @@ -230,8 +251,9 @@ static const char * const ScoreSchedReqYield_PreDesc_OtherReady[] = { static const char * const * const ScoreSchedReqYield_PreDesc[] = { ScoreSchedReqYield_PreDesc_EligibleScheduler, ScoreSchedReqYield_PreDesc_UsedScheduler, + ScoreSchedReqYield_PreDesc_HomeSchedulerState, ScoreSchedReqYield_PreDesc_Sticky, - ScoreSchedReqYield_PreDesc_OtherReady, + ScoreSchedReqYield_PreDesc_Other, NULL }; @@ -312,6 +334,41 @@ static void ScoreSchedReqYield_Pre_UsedScheduler_Prepare( } } +static void ScoreSchedReqYield_Pre_HomeSchedulerState_Prepare( + ScoreSchedReqYield_Context *ctx, + ScoreSchedReqYield_Pre_HomeSchedulerState state +) +{ + switch ( state ) { + case ScoreSchedReqYield_Pre_HomeSchedulerState_Blocked: { + /* + * The thread shall be blocked in its home scheduler. + */ + ctx->ready = false; + break; + } + + case ScoreSchedReqYield_Pre_HomeSchedulerState_Scheduled: { + /* + * The thread shall be scheduled in its home scheduler. + */ + ctx->ready = false; + break; + } + + case ScoreSchedReqYield_Pre_HomeSchedulerState_Ready: { + /* + * The thread shall be ready in its home scheduler. + */ + ctx->ready = true; + break; + } + + case ScoreSchedReqYield_Pre_HomeSchedulerState_NA: + break; + } +} + static void ScoreSchedReqYield_Pre_Sticky_Prepare( ScoreSchedReqYield_Context *ctx, ScoreSchedReqYield_Pre_Sticky state @@ -339,32 +396,31 @@ static void ScoreSchedReqYield_Pre_Sticky_Prepare( } } -static void ScoreSchedReqYield_Pre_OtherReady_Prepare( - ScoreSchedReqYield_Context *ctx, - ScoreSchedReqYield_Pre_OtherReady state +static void ScoreSchedReqYield_Pre_Other_Prepare( + ScoreSchedReqYield_Context *ctx, + ScoreSchedReqYield_Pre_Other state ) { switch ( state ) { - case ScoreSchedReqYield_Pre_OtherReady_Yes: { + case ScoreSchedReqYield_Pre_Other_Yes: { /* - * While at least one other thread is ready in the home scheduler of the - * thread, while the priority of the other thread with respect to the - * scheduler is equal to the priority of the thread. + * While at least one ready thread with a priority equal to the priority + * of the thread exists in the home scheduler of the thread. */ ctx->other_ready = true; break; } - case ScoreSchedReqYield_Pre_OtherReady_No: { + case ScoreSchedReqYield_Pre_Other_No: { /* - * While no other non-idle thread is ready in the home scheduler of the - * thread. + * While no ready thread with a priority equal to the priority of the + * thread exists in the home scheduler of the thread. */ ctx->other_ready = false; break; } - case ScoreSchedReqYield_Pre_OtherReady_NA: + case ScoreSchedReqYield_Pre_Other_NA: break; } } @@ -517,6 +573,7 @@ static void ScoreSchedReqYield_Teardown_Wrap( void *arg ) static void ScoreSchedReqYield_Action( ScoreSchedReqYield_Context *ctx ) { const Per_CPU_Control *cpu; + bool other_busy; if ( ctx->has_helping ) { TQMutexObtain( &ctx->tq_ctx, TQ_MUTEX_A ); @@ -531,13 +588,21 @@ static void ScoreSchedReqYield_Action( ScoreSchedReqYield_Context *ctx ) MoveToHelping( ctx ); } + TQResetCounter( &ctx->tq_ctx ); + + if ( ctx->use_helping && ctx->ready ) { + ctx->tq_ctx.busy_wait[ COUNTER ] = true; + TQSend( &ctx->tq_ctx, COUNTER, TQ_EVENT_COUNT | TQ_EVENT_BUSY_WAIT ); + other_busy = true; + } else { + other_busy = false; + } + if ( ctx->sticky ) { ObtainMutex( ctx->sticky_mutex ); } - TQResetCounter( &ctx->tq_ctx ); - - if ( ctx->other_ready ) { + if ( ctx->other_ready && !other_busy ) { TQSend( &ctx->tq_ctx, COUNTER, TQ_EVENT_COUNT ); } @@ -549,6 +614,8 @@ static void ScoreSchedReqYield_Action( ScoreSchedReqYield_Context *ctx ) TQSchedulerRecordStop( &ctx->tq_ctx ); #if defined(RTEMS_SMP) + ctx->tq_ctx.busy_wait[ COUNTER ] = false; + while ( cpu->heir == ctx->tq_ctx.worker_tcb[ COUNTER ] ) { RTEMS_COMPILER_MEMORY_BARRIER(); } @@ -574,72 +641,103 @@ static void ScoreSchedReqYield_Action( ScoreSchedReqYield_Context *ctx ) static const ScoreSchedReqYield_Entry ScoreSchedReqYield_Entries[] = { #if !defined(RTEMS_SMP) - { 1, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, ScoreSchedReqYield_Post_AskForHelp_NA }, #else - { 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Ready, - ScoreSchedReqYield_Post_AskForHelp_No }, + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + ScoreSchedReqYield_Post_AskForHelp_NA }, #endif + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + ScoreSchedReqYield_Post_AskForHelp_NA }, + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + ScoreSchedReqYield_Post_AskForHelp_NA }, #if !defined(RTEMS_SMP) - { 1, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, ScoreSchedReqYield_Post_AskForHelp_NA }, #else - { 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Scheduled, + { 0, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Ready, ScoreSchedReqYield_Post_AskForHelp_No }, #endif #if !defined(RTEMS_SMP) - { 1, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, ScoreSchedReqYield_Post_AskForHelp_NA }, #else - { 1, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, ScoreSchedReqYield_Post_AskForHelp_NA }, #endif - { 1, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, +#if !defined(RTEMS_SMP) + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, ScoreSchedReqYield_Post_AskForHelp_NA }, +#else + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + ScoreSchedReqYield_Post_AskForHelp_NA }, +#endif #if !defined(RTEMS_SMP) - { 1, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, ScoreSchedReqYield_Post_AskForHelp_NA }, #else - { 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Blocked, + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + ScoreSchedReqYield_Post_AskForHelp_NA }, +#endif +#if !defined(RTEMS_SMP) + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + ScoreSchedReqYield_Post_AskForHelp_NA }, +#else + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + ScoreSchedReqYield_Post_AskForHelp_NA }, +#endif +#if !defined(RTEMS_SMP) + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + ScoreSchedReqYield_Post_AskForHelp_NA }, +#else + { 0, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Scheduled, + ScoreSchedReqYield_Post_AskForHelp_No }, +#endif +#if !defined(RTEMS_SMP) + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + ScoreSchedReqYield_Post_AskForHelp_NA }, +#else + { 0, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Blocked, ScoreSchedReqYield_Post_AskForHelp_No }, #endif - { 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Ready, + { 0, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Ready, ScoreSchedReqYield_Post_AskForHelp_No }, - { 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Scheduled, + { 0, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Scheduled, ScoreSchedReqYield_Post_AskForHelp_No }, #if !defined(RTEMS_SMP) - { 1, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, ScoreSchedReqYield_Post_AskForHelp_NA }, #else - { 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Ready, + { 0, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Ready, ScoreSchedReqYield_Post_AskForHelp_Yes }, #endif #if !defined(RTEMS_SMP) - { 1, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, ScoreSchedReqYield_Post_AskForHelp_NA }, #else - { 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Ready, + { 0, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Ready, ScoreSchedReqYield_Post_AskForHelp_Yes }, #endif #if !defined(RTEMS_SMP) - { 1, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, ScoreSchedReqYield_Post_AskForHelp_NA }, #else - { 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Scheduled, + { 0, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Scheduled, ScoreSchedReqYield_Post_AskForHelp_No }, #endif #if !defined(RTEMS_SMP) - { 1, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, + { 1, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_NA, ScoreSchedReqYield_Post_AskForHelp_NA } #else - { 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Idle, + { 0, 0, 0, 0, 0, 0, ScoreSchedReqYield_Post_HomeSchedulerState_Idle, ScoreSchedReqYield_Post_AskForHelp_No } #endif }; static const uint8_t ScoreSchedReqYield_Map[] = { - 0, 1, 5, 6, 2, 2, 3, 3, 7, 1, 8, 9, 0, 10, 4, 4 + 0, 0, 2, 2, 3, 8, 10, 11, 0, 0, 2, 2, 4, 4, 1, 1, 5, 5, 1, 1, 5, 5, 1, 1, 0, + 0, 6, 6, 12, 8, 13, 14, 0, 0, 6, 6, 4, 4, 9, 9, 3, 15, 7, 7, 3, 3, 7, 7 }; static size_t ScoreSchedReqYield_Scope( void *arg, char *buf, size_t n ) @@ -680,8 +778,9 @@ static void ScoreSchedReqYield_TestVariant( ScoreSchedReqYield_Context *ctx ) { ScoreSchedReqYield_Pre_EligibleScheduler_Prepare( ctx, ctx->Map.pcs[ 0 ] ); ScoreSchedReqYield_Pre_UsedScheduler_Prepare( ctx, ctx->Map.pcs[ 1 ] ); - ScoreSchedReqYield_Pre_Sticky_Prepare( ctx, ctx->Map.pcs[ 2 ] ); - ScoreSchedReqYield_Pre_OtherReady_Prepare( ctx, ctx->Map.pcs[ 3 ] ); + ScoreSchedReqYield_Pre_HomeSchedulerState_Prepare( ctx, ctx->Map.pcs[ 2 ] ); + ScoreSchedReqYield_Pre_Sticky_Prepare( ctx, ctx->Map.pcs[ 3 ] ); + ScoreSchedReqYield_Pre_Other_Prepare( ctx, ctx->Map.pcs[ 4 ] ); ScoreSchedReqYield_Action( ctx ); ScoreSchedReqYield_Post_HomeSchedulerState_Check( ctx, @@ -715,22 +814,28 @@ T_TEST_CASE_FIXTURE( ScoreSchedReqYield, &ScoreSchedReqYield_Fixture ) ++ctx->Map.pcs[ 1 ] ) { for ( - ctx->Map.pcs[ 2 ] = ScoreSchedReqYield_Pre_Sticky_Yes; - ctx->Map.pcs[ 2 ] < ScoreSchedReqYield_Pre_Sticky_NA; + ctx->Map.pcs[ 2 ] = ScoreSchedReqYield_Pre_HomeSchedulerState_Blocked; + ctx->Map.pcs[ 2 ] < ScoreSchedReqYield_Pre_HomeSchedulerState_NA; ++ctx->Map.pcs[ 2 ] ) { for ( - ctx->Map.pcs[ 3 ] = ScoreSchedReqYield_Pre_OtherReady_Yes; - ctx->Map.pcs[ 3 ] < ScoreSchedReqYield_Pre_OtherReady_NA; + ctx->Map.pcs[ 3 ] = ScoreSchedReqYield_Pre_Sticky_Yes; + ctx->Map.pcs[ 3 ] < ScoreSchedReqYield_Pre_Sticky_NA; ++ctx->Map.pcs[ 3 ] ) { - ctx->Map.entry = ScoreSchedReqYield_PopEntry( ctx ); - - if ( ctx->Map.entry.Skip ) { - continue; + for ( + ctx->Map.pcs[ 4 ] = ScoreSchedReqYield_Pre_Other_Yes; + ctx->Map.pcs[ 4 ] < ScoreSchedReqYield_Pre_Other_NA; + ++ctx->Map.pcs[ 4 ] + ) { + ctx->Map.entry = ScoreSchedReqYield_PopEntry( ctx ); + + if ( ctx->Map.entry.Skip ) { + continue; + } + + ScoreSchedReqYield_TestVariant( ctx ); } - - ScoreSchedReqYield_TestVariant( ctx ); } } } |