summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-12-07 12:00:42 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-12-08 17:25:15 +0100
commit6330e0350256140c621bbfeaaf92bb578858e052 (patch)
tree975d3d01ffd27ca8c62609f8b1c199adce061095
parent1acb9a86b1033c1097ea5f02a57a67d7894819cb (diff)
testsuites/validation/tc-sched-yield.c
-rw-r--r--testsuites/validation/tc-sched-yield.c217
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 );
}
}
}