File indexing completed on 2025-05-11 08:24:53
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 #ifdef HAVE_CONFIG_H
0052 #include "config.h"
0053 #endif
0054
0055 #include <rtems/score/statesimpl.h>
0056
0057 #include "tr-sem-seize-wait.h"
0058 #include "tr-tq-enqueue-fifo.h"
0059 #include "tr-tq-enqueue-priority.h"
0060
0061 #include <rtems/test.h>
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071 typedef struct {
0072 uint8_t Skip : 1;
0073 uint8_t Pre_Count_NA : 1;
0074 uint8_t Post_Status : 2;
0075 uint8_t Post_Count : 2;
0076 uint8_t Post_Timer : 2;
0077 } ScoreSemReqSeizeWait_Entry;
0078
0079
0080
0081
0082 typedef struct {
0083
0084
0085
0086
0087 TQSemContext *tq_ctx;
0088
0089 struct {
0090
0091
0092
0093 size_t pcs[ 1 ];
0094
0095
0096
0097
0098 bool in_action_loop;
0099
0100
0101
0102
0103 size_t index;
0104
0105
0106
0107
0108 ScoreSemReqSeizeWait_Entry entry;
0109
0110
0111
0112
0113
0114 bool skip;
0115 } Map;
0116 } ScoreSemReqSeizeWait_Context;
0117
0118 static ScoreSemReqSeizeWait_Context
0119 ScoreSemReqSeizeWait_Instance;
0120
0121 static const char * const ScoreSemReqSeizeWait_PreDesc_Count[] = {
0122 "Zero",
0123 "Positive",
0124 "NA"
0125 };
0126
0127 static const char * const * const ScoreSemReqSeizeWait_PreDesc[] = {
0128 ScoreSemReqSeizeWait_PreDesc_Count,
0129 NULL
0130 };
0131
0132 typedef ScoreSemReqSeizeWait_Context Context;
0133
0134 static Status_Control Status( const Context *ctx, Status_Control status )
0135 {
0136 return TQConvertStatus( &ctx->tq_ctx->base, status );
0137 }
0138
0139 static void GetProperties( TQContext *base, TQWorkerKind enqueued_worker )
0140 {
0141 TQSemContext *ctx;
0142 T_thread_timer_state timer_state;
0143
0144 ctx = (TQSemContext *) base;
0145 T_eq_u32(
0146 ctx->base.worker_tcb[ enqueued_worker ]->current_state,
0147 STATES_WAITING_FOR_SEMAPHORE
0148 );
0149
0150 timer_state = T_get_thread_timer_state(
0151 ctx->base.worker_id[ enqueued_worker ]
0152 );
0153
0154 if ( base->wait == TQ_WAIT_TIMED ) {
0155 T_eq_int( timer_state, T_THREAD_TIMER_SCHEDULED );
0156 } else {
0157 T_eq_int( timer_state, T_THREAD_TIMER_INACTIVE );
0158 }
0159
0160 T_eq_u32( TQSemGetCount( ctx ), 0 );
0161 }
0162
0163 static void ScoreSemReqSeizeWait_Pre_Count_Prepare(
0164 ScoreSemReqSeizeWait_Context *ctx,
0165 ScoreSemReqSeizeWait_Pre_Count state
0166 )
0167 {
0168 switch ( state ) {
0169 case ScoreSemReqSeizeWait_Pre_Count_Zero: {
0170
0171
0172
0173
0174 break;
0175 }
0176
0177 case ScoreSemReqSeizeWait_Pre_Count_Positive: {
0178
0179
0180
0181 TQSemSetCount( ctx->tq_ctx, 1 );
0182 break;
0183 }
0184
0185 case ScoreSemReqSeizeWait_Pre_Count_NA:
0186 break;
0187 }
0188 }
0189
0190 static void ScoreSemReqSeizeWait_Post_Status_Check(
0191 ScoreSemReqSeizeWait_Context *ctx,
0192 ScoreSemReqSeizeWait_Post_Status state
0193 )
0194 {
0195 Status_Control status;
0196
0197 switch ( state ) {
0198 case ScoreSemReqSeizeWait_Post_Status_Ok: {
0199
0200
0201
0202
0203 status = TQEnqueue( &ctx->tq_ctx->base, ctx->tq_ctx->base.wait );
0204 T_eq_int( status, Status( ctx, STATUS_SUCCESSFUL ) );
0205 break;
0206 }
0207
0208 case ScoreSemReqSeizeWait_Post_Status_Enqueued: {
0209
0210
0211
0212
0213
0214
0215
0216 switch ( ctx->tq_ctx->base.discipline ) {
0217 case TQ_FIFO:
0218 ScoreTqReqEnqueueFifo_Run( &ctx->tq_ctx->base );
0219 break;
0220 case TQ_PRIORITY:
0221 ScoreTqReqEnqueuePriority_Run( &ctx->tq_ctx->base );
0222 break;
0223 default:
0224 T_unreachable();
0225 break;
0226 }
0227 break;
0228 }
0229
0230 case ScoreSemReqSeizeWait_Post_Status_NA:
0231 break;
0232 }
0233 }
0234
0235 static void ScoreSemReqSeizeWait_Post_Count_Check(
0236 ScoreSemReqSeizeWait_Context *ctx,
0237 ScoreSemReqSeizeWait_Post_Count state
0238 )
0239 {
0240 switch ( state ) {
0241 case ScoreSemReqSeizeWait_Post_Count_Nop: {
0242
0243
0244
0245
0246 break;
0247 }
0248
0249 case ScoreSemReqSeizeWait_Post_Count_MinusOne: {
0250
0251
0252
0253 T_eq_u32( TQSemGetCount( ctx->tq_ctx ), 0 );
0254 break;
0255 }
0256
0257 case ScoreSemReqSeizeWait_Post_Count_NA:
0258 break;
0259 }
0260 }
0261
0262 static void ScoreSemReqSeizeWait_Post_Timer_Check(
0263 ScoreSemReqSeizeWait_Context *ctx,
0264 ScoreSemReqSeizeWait_Post_Timer state
0265 )
0266 {
0267 switch ( state ) {
0268 case ScoreSemReqSeizeWait_Post_Timer_Optional: {
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278 break;
0279 }
0280
0281 case ScoreSemReqSeizeWait_Post_Timer_No: {
0282
0283
0284
0285 T_eq_int(
0286 T_get_thread_timer_state( RTEMS_SELF ),
0287 T_THREAD_TIMER_INACTIVE
0288 );
0289 break;
0290 }
0291
0292 case ScoreSemReqSeizeWait_Post_Timer_NA:
0293 break;
0294 }
0295 }
0296
0297 static void ScoreSemReqSeizeWait_Prepare( ScoreSemReqSeizeWait_Context *ctx )
0298 {
0299 ctx->tq_ctx->base.enqueue_prepare = TQEnqueuePrepareDefault;
0300 ctx->tq_ctx->base.enqueue_done = TQEnqueueDoneDefault;
0301 ctx->tq_ctx->base.get_properties = GetProperties;
0302 }
0303
0304 static void ScoreSemReqSeizeWait_Action( ScoreSemReqSeizeWait_Context *ctx )
0305 {
0306
0307 }
0308
0309 static const ScoreSemReqSeizeWait_Entry
0310 ScoreSemReqSeizeWait_Entries[] = {
0311 { 0, 0, ScoreSemReqSeizeWait_Post_Status_Enqueued,
0312 ScoreSemReqSeizeWait_Post_Count_Nop,
0313 ScoreSemReqSeizeWait_Post_Timer_Optional },
0314 { 0, 0, ScoreSemReqSeizeWait_Post_Status_Ok,
0315 ScoreSemReqSeizeWait_Post_Count_MinusOne,
0316 ScoreSemReqSeizeWait_Post_Timer_No }
0317 };
0318
0319 static const uint8_t
0320 ScoreSemReqSeizeWait_Map[] = {
0321 0, 1
0322 };
0323
0324 static size_t ScoreSemReqSeizeWait_Scope( void *arg, char *buf, size_t n )
0325 {
0326 ScoreSemReqSeizeWait_Context *ctx;
0327
0328 ctx = arg;
0329
0330 if ( ctx->Map.in_action_loop ) {
0331 return T_get_scope( ScoreSemReqSeizeWait_PreDesc, buf, n, ctx->Map.pcs );
0332 }
0333
0334 return 0;
0335 }
0336
0337 static T_fixture ScoreSemReqSeizeWait_Fixture = {
0338 .setup = NULL,
0339 .stop = NULL,
0340 .teardown = NULL,
0341 .scope = ScoreSemReqSeizeWait_Scope,
0342 .initial_context = &ScoreSemReqSeizeWait_Instance
0343 };
0344
0345 static inline ScoreSemReqSeizeWait_Entry ScoreSemReqSeizeWait_PopEntry(
0346 ScoreSemReqSeizeWait_Context *ctx
0347 )
0348 {
0349 size_t index;
0350
0351 index = ctx->Map.index;
0352 ctx->Map.index = index + 1;
0353 return ScoreSemReqSeizeWait_Entries[
0354 ScoreSemReqSeizeWait_Map[ index ]
0355 ];
0356 }
0357
0358 static void ScoreSemReqSeizeWait_TestVariant(
0359 ScoreSemReqSeizeWait_Context *ctx
0360 )
0361 {
0362 ScoreSemReqSeizeWait_Pre_Count_Prepare( ctx, ctx->Map.pcs[ 0 ] );
0363 ScoreSemReqSeizeWait_Action( ctx );
0364 ScoreSemReqSeizeWait_Post_Status_Check( ctx, ctx->Map.entry.Post_Status );
0365 ScoreSemReqSeizeWait_Post_Count_Check( ctx, ctx->Map.entry.Post_Count );
0366 ScoreSemReqSeizeWait_Post_Timer_Check( ctx, ctx->Map.entry.Post_Timer );
0367 }
0368
0369 static T_fixture_node ScoreSemReqSeizeWait_Node;
0370
0371 static T_remark ScoreSemReqSeizeWait_Remark = {
0372 .next = NULL,
0373 .remark = "ScoreSemReqSeizeWait"
0374 };
0375
0376 void ScoreSemReqSeizeWait_Run( TQSemContext *tq_ctx )
0377 {
0378 ScoreSemReqSeizeWait_Context *ctx;
0379
0380 ctx = &ScoreSemReqSeizeWait_Instance;
0381 ctx->tq_ctx = tq_ctx;
0382
0383 ctx = T_push_fixture(
0384 &ScoreSemReqSeizeWait_Node,
0385 &ScoreSemReqSeizeWait_Fixture
0386 );
0387 ctx->Map.in_action_loop = true;
0388 ctx->Map.index = 0;
0389
0390 for (
0391 ctx->Map.pcs[ 0 ] = ScoreSemReqSeizeWait_Pre_Count_Zero;
0392 ctx->Map.pcs[ 0 ] < ScoreSemReqSeizeWait_Pre_Count_NA;
0393 ++ctx->Map.pcs[ 0 ]
0394 ) {
0395 ctx->Map.entry = ScoreSemReqSeizeWait_PopEntry( ctx );
0396 ScoreSemReqSeizeWait_Prepare( ctx );
0397 ScoreSemReqSeizeWait_TestVariant( ctx );
0398 }
0399
0400 T_add_remark( &ScoreSemReqSeizeWait_Remark );
0401 T_pop_fixture();
0402 }
0403
0404