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.h>
0056
0057 #include "tx-support.h"
0058
0059 #include <rtems/test.h>
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069 typedef enum {
0070 RtemsTimerReqServerFireWhen_Pre_Server_Init,
0071 RtemsTimerReqServerFireWhen_Pre_Server_NotInit,
0072 RtemsTimerReqServerFireWhen_Pre_Server_NA
0073 } RtemsTimerReqServerFireWhen_Pre_Server;
0074
0075 typedef enum {
0076 RtemsTimerReqServerFireWhen_Pre_RtClock_Set,
0077 RtemsTimerReqServerFireWhen_Pre_RtClock_Unset,
0078 RtemsTimerReqServerFireWhen_Pre_RtClock_NA
0079 } RtemsTimerReqServerFireWhen_Pre_RtClock;
0080
0081 typedef enum {
0082 RtemsTimerReqServerFireWhen_Pre_Routine_Valid,
0083 RtemsTimerReqServerFireWhen_Pre_Routine_Null,
0084 RtemsTimerReqServerFireWhen_Pre_Routine_NA
0085 } RtemsTimerReqServerFireWhen_Pre_Routine;
0086
0087 typedef enum {
0088 RtemsTimerReqServerFireWhen_Pre_WallTime_Valid,
0089 RtemsTimerReqServerFireWhen_Pre_WallTime_Invalid,
0090 RtemsTimerReqServerFireWhen_Pre_WallTime_Past,
0091 RtemsTimerReqServerFireWhen_Pre_WallTime_Null,
0092 RtemsTimerReqServerFireWhen_Pre_WallTime_NA
0093 } RtemsTimerReqServerFireWhen_Pre_WallTime;
0094
0095 typedef enum {
0096 RtemsTimerReqServerFireWhen_Pre_Id_Valid,
0097 RtemsTimerReqServerFireWhen_Pre_Id_Invalid,
0098 RtemsTimerReqServerFireWhen_Pre_Id_NA
0099 } RtemsTimerReqServerFireWhen_Pre_Id;
0100
0101 typedef enum {
0102 RtemsTimerReqServerFireWhen_Pre_Context_None,
0103 RtemsTimerReqServerFireWhen_Pre_Context_Interrupt,
0104 RtemsTimerReqServerFireWhen_Pre_Context_Server,
0105 RtemsTimerReqServerFireWhen_Pre_Context_NA
0106 } RtemsTimerReqServerFireWhen_Pre_Context;
0107
0108 typedef enum {
0109 RtemsTimerReqServerFireWhen_Pre_Clock_None,
0110 RtemsTimerReqServerFireWhen_Pre_Clock_Ticks,
0111 RtemsTimerReqServerFireWhen_Pre_Clock_Realtime,
0112 RtemsTimerReqServerFireWhen_Pre_Clock_NA
0113 } RtemsTimerReqServerFireWhen_Pre_Clock;
0114
0115 typedef enum {
0116 RtemsTimerReqServerFireWhen_Pre_State_Inactive,
0117 RtemsTimerReqServerFireWhen_Pre_State_Scheduled,
0118 RtemsTimerReqServerFireWhen_Pre_State_Pending,
0119 RtemsTimerReqServerFireWhen_Pre_State_NA
0120 } RtemsTimerReqServerFireWhen_Pre_State;
0121
0122 typedef enum {
0123 RtemsTimerReqServerFireWhen_Post_Status_Ok,
0124 RtemsTimerReqServerFireWhen_Post_Status_NotDef,
0125 RtemsTimerReqServerFireWhen_Post_Status_InvId,
0126 RtemsTimerReqServerFireWhen_Post_Status_InvAddr,
0127 RtemsTimerReqServerFireWhen_Post_Status_InvClock,
0128 RtemsTimerReqServerFireWhen_Post_Status_IncStat,
0129 RtemsTimerReqServerFireWhen_Post_Status_NA
0130 } RtemsTimerReqServerFireWhen_Post_Status;
0131
0132 typedef enum {
0133 RtemsTimerReqServerFireWhen_Post_Context_None,
0134 RtemsTimerReqServerFireWhen_Post_Context_Interrupt,
0135 RtemsTimerReqServerFireWhen_Post_Context_Server,
0136 RtemsTimerReqServerFireWhen_Post_Context_Nop,
0137 RtemsTimerReqServerFireWhen_Post_Context_NA
0138 } RtemsTimerReqServerFireWhen_Post_Context;
0139
0140 typedef enum {
0141 RtemsTimerReqServerFireWhen_Post_Clock_None,
0142 RtemsTimerReqServerFireWhen_Post_Clock_Ticks,
0143 RtemsTimerReqServerFireWhen_Post_Clock_Realtime,
0144 RtemsTimerReqServerFireWhen_Post_Clock_Nop,
0145 RtemsTimerReqServerFireWhen_Post_Clock_NA
0146 } RtemsTimerReqServerFireWhen_Post_Clock;
0147
0148 typedef enum {
0149 RtemsTimerReqServerFireWhen_Post_State_Scheduled,
0150 RtemsTimerReqServerFireWhen_Post_State_Nop,
0151 RtemsTimerReqServerFireWhen_Post_State_NA
0152 } RtemsTimerReqServerFireWhen_Post_State;
0153
0154 typedef enum {
0155 RtemsTimerReqServerFireWhen_Post_WallTime_Param,
0156 RtemsTimerReqServerFireWhen_Post_WallTime_Nop,
0157 RtemsTimerReqServerFireWhen_Post_WallTime_NA
0158 } RtemsTimerReqServerFireWhen_Post_WallTime;
0159
0160 typedef enum {
0161 RtemsTimerReqServerFireWhen_Post_Routine_Param,
0162 RtemsTimerReqServerFireWhen_Post_Routine_Nop,
0163 RtemsTimerReqServerFireWhen_Post_Routine_NA
0164 } RtemsTimerReqServerFireWhen_Post_Routine;
0165
0166 typedef enum {
0167 RtemsTimerReqServerFireWhen_Post_UserData_Param,
0168 RtemsTimerReqServerFireWhen_Post_UserData_Nop,
0169 RtemsTimerReqServerFireWhen_Post_UserData_NA
0170 } RtemsTimerReqServerFireWhen_Post_UserData;
0171
0172 typedef struct {
0173 uint32_t Skip : 1;
0174 uint32_t Pre_Server_NA : 1;
0175 uint32_t Pre_RtClock_NA : 1;
0176 uint32_t Pre_Routine_NA : 1;
0177 uint32_t Pre_WallTime_NA : 1;
0178 uint32_t Pre_Id_NA : 1;
0179 uint32_t Pre_Context_NA : 1;
0180 uint32_t Pre_Clock_NA : 1;
0181 uint32_t Pre_State_NA : 1;
0182 uint32_t Post_Status : 3;
0183 uint32_t Post_Context : 3;
0184 uint32_t Post_Clock : 3;
0185 uint32_t Post_State : 2;
0186 uint32_t Post_WallTime : 2;
0187 uint32_t Post_Routine : 2;
0188 uint32_t Post_UserData : 2;
0189 } RtemsTimerReqServerFireWhen_Entry;
0190
0191 typedef enum {
0192 PRE_NONE = 0,
0193 PRE_INTERRUPT = 1,
0194 PRE_SERVER = 2
0195 } PreConditionContext;
0196
0197 typedef enum {
0198 SCHEDULE_NONE = 0,
0199 SCHEDULE_SOON = 1,
0200 SCHEDULE_MAX = 5
0201 } Scheduling_Ticks;
0202
0203
0204
0205
0206 typedef struct {
0207
0208
0209
0210 rtems_id timer_id;
0211
0212
0213
0214
0215 rtems_id id_param;
0216
0217
0218
0219
0220 const rtems_time_of_day *wall_time_param;
0221
0222
0223
0224
0225 rtems_timer_service_routine_entry routine_param;
0226
0227
0228
0229
0230 rtems_status_code status;
0231
0232
0233
0234
0235
0236 int invocations;
0237
0238
0239
0240
0241
0242
0243 rtems_time_of_day tod_till_fire;
0244
0245
0246
0247
0248
0249 void *routine_user_data;
0250
0251
0252
0253
0254
0255
0256 PreConditionContext pre_cond_contex;
0257
0258
0259
0260
0261
0262
0263 const rtems_time_of_day *pre_cond_tod;
0264
0265
0266
0267
0268
0269 Timer_Classes pre_class;
0270
0271
0272
0273
0274
0275 Timer_States pre_state;
0276
0277
0278
0279
0280
0281 Timer_States post_state;
0282
0283
0284
0285
0286
0287 Timer_Scheduling_Data pre_scheduling_data;
0288
0289
0290
0291
0292
0293 Timer_Scheduling_Data post_scheduling_data;
0294
0295 struct {
0296
0297
0298
0299 size_t pcs[ 8 ];
0300
0301
0302
0303
0304 bool in_action_loop;
0305
0306
0307
0308
0309 size_t index;
0310
0311
0312
0313
0314 RtemsTimerReqServerFireWhen_Entry entry;
0315
0316
0317
0318
0319
0320 bool skip;
0321 } Map;
0322 } RtemsTimerReqServerFireWhen_Context;
0323
0324 static RtemsTimerReqServerFireWhen_Context
0325 RtemsTimerReqServerFireWhen_Instance;
0326
0327 static const char * const RtemsTimerReqServerFireWhen_PreDesc_Server[] = {
0328 "Init",
0329 "NotInit",
0330 "NA"
0331 };
0332
0333 static const char * const RtemsTimerReqServerFireWhen_PreDesc_RtClock[] = {
0334 "Set",
0335 "Unset",
0336 "NA"
0337 };
0338
0339 static const char * const RtemsTimerReqServerFireWhen_PreDesc_Routine[] = {
0340 "Valid",
0341 "Null",
0342 "NA"
0343 };
0344
0345 static const char * const RtemsTimerReqServerFireWhen_PreDesc_WallTime[] = {
0346 "Valid",
0347 "Invalid",
0348 "Past",
0349 "Null",
0350 "NA"
0351 };
0352
0353 static const char * const RtemsTimerReqServerFireWhen_PreDesc_Id[] = {
0354 "Valid",
0355 "Invalid",
0356 "NA"
0357 };
0358
0359 static const char * const RtemsTimerReqServerFireWhen_PreDesc_Context[] = {
0360 "None",
0361 "Interrupt",
0362 "Server",
0363 "NA"
0364 };
0365
0366 static const char * const RtemsTimerReqServerFireWhen_PreDesc_Clock[] = {
0367 "None",
0368 "Ticks",
0369 "Realtime",
0370 "NA"
0371 };
0372
0373 static const char * const RtemsTimerReqServerFireWhen_PreDesc_State[] = {
0374 "Inactive",
0375 "Scheduled",
0376 "Pending",
0377 "NA"
0378 };
0379
0380 static const char * const * const RtemsTimerReqServerFireWhen_PreDesc[] = {
0381 RtemsTimerReqServerFireWhen_PreDesc_Server,
0382 RtemsTimerReqServerFireWhen_PreDesc_RtClock,
0383 RtemsTimerReqServerFireWhen_PreDesc_Routine,
0384 RtemsTimerReqServerFireWhen_PreDesc_WallTime,
0385 RtemsTimerReqServerFireWhen_PreDesc_Id,
0386 RtemsTimerReqServerFireWhen_PreDesc_Context,
0387 RtemsTimerReqServerFireWhen_PreDesc_Clock,
0388 RtemsTimerReqServerFireWhen_PreDesc_State,
0389 NULL
0390 };
0391
0392 static const rtems_time_of_day tod_now = { 2000, 1, 1, 0, 0, 0, 0 };
0393 static const rtems_time_of_day tod_schedule = { 2000, 1, 1, 5, 0, 0, 0 };
0394 static const rtems_time_of_day tod_invalid = { 1985, 1, 1, 0, 0, 0, 0 };
0395 static const rtems_time_of_day tod_past = { 1999, 12, 31, 23, 59, 59, 1 };
0396
0397 static void TriggerTimer(
0398 const RtemsTimerReqServerFireWhen_Context *ctx,
0399 rtems_time_of_day *tod_fire
0400 )
0401 {
0402 rtems_time_of_day tod = tod_now;
0403 int invocations_old = ctx->invocations;
0404 int i;
0405
0406
0407 for ( i = 1; i <= SCHEDULE_MAX; ++i ) {
0408 ClockTick();
0409 }
0410
0411 for ( i = 1; i < 24; ++i ) {
0412 tod.hour = i;
0413 T_rsc_success( rtems_clock_set( &tod ) );
0414 if ( tod_fire != NULL && ctx->invocations > invocations_old ) {
0415 *tod_fire = tod;
0416 break;
0417 }
0418 }
0419 }
0420
0421 static void TimerServiceRoutine(
0422 rtems_id timer_id,
0423 void *user_data
0424 )
0425 {
0426 RtemsTimerReqServerFireWhen_Context *ctx = user_data;
0427 ++( ctx->invocations );
0428 ctx->routine_user_data = user_data;
0429 }
0430
0431 static void RtemsTimerReqServerFireWhen_Pre_Server_Prepare(
0432 RtemsTimerReqServerFireWhen_Context *ctx,
0433 RtemsTimerReqServerFireWhen_Pre_Server state
0434 )
0435 {
0436 switch ( state ) {
0437 case RtemsTimerReqServerFireWhen_Pre_Server_Init: {
0438
0439
0440
0441
0442 rtems_status_code status;
0443 status = rtems_timer_initiate_server(
0444 RTEMS_TIMER_SERVER_DEFAULT_PRIORITY,
0445 RTEMS_MINIMUM_STACK_SIZE,
0446 RTEMS_DEFAULT_ATTRIBUTES
0447 );
0448 T_rsc_success( status );
0449 break;
0450 }
0451
0452 case RtemsTimerReqServerFireWhen_Pre_Server_NotInit: {
0453
0454
0455
0456
0457 DeleteTimerServer();
0458 break;
0459 }
0460
0461 case RtemsTimerReqServerFireWhen_Pre_Server_NA:
0462 break;
0463 }
0464 }
0465
0466 static void RtemsTimerReqServerFireWhen_Pre_RtClock_Prepare(
0467 RtemsTimerReqServerFireWhen_Context *ctx,
0468 RtemsTimerReqServerFireWhen_Pre_RtClock state
0469 )
0470 {
0471 switch ( state ) {
0472 case RtemsTimerReqServerFireWhen_Pre_RtClock_Set: {
0473
0474
0475
0476 ctx->pre_cond_tod = &tod_now;
0477 break;
0478 }
0479
0480 case RtemsTimerReqServerFireWhen_Pre_RtClock_Unset: {
0481
0482
0483
0484 ctx->pre_cond_tod = NULL;
0485 break;
0486 }
0487
0488 case RtemsTimerReqServerFireWhen_Pre_RtClock_NA:
0489 break;
0490 }
0491 }
0492
0493 static void RtemsTimerReqServerFireWhen_Pre_Routine_Prepare(
0494 RtemsTimerReqServerFireWhen_Context *ctx,
0495 RtemsTimerReqServerFireWhen_Pre_Routine state
0496 )
0497 {
0498 switch ( state ) {
0499 case RtemsTimerReqServerFireWhen_Pre_Routine_Valid: {
0500
0501
0502
0503
0504 ctx->routine_param = TimerServiceRoutine;
0505 break;
0506 }
0507
0508 case RtemsTimerReqServerFireWhen_Pre_Routine_Null: {
0509
0510
0511
0512 ctx->routine_param = NULL;
0513 break;
0514 }
0515
0516 case RtemsTimerReqServerFireWhen_Pre_Routine_NA:
0517 break;
0518 }
0519 }
0520
0521 static void RtemsTimerReqServerFireWhen_Pre_WallTime_Prepare(
0522 RtemsTimerReqServerFireWhen_Context *ctx,
0523 RtemsTimerReqServerFireWhen_Pre_WallTime state
0524 )
0525 {
0526 switch ( state ) {
0527 case RtemsTimerReqServerFireWhen_Pre_WallTime_Valid: {
0528
0529
0530
0531
0532
0533 ctx->wall_time_param = &tod_schedule;
0534 break;
0535 }
0536
0537 case RtemsTimerReqServerFireWhen_Pre_WallTime_Invalid: {
0538
0539
0540
0541 ctx->wall_time_param = &tod_invalid;
0542 break;
0543 }
0544
0545 case RtemsTimerReqServerFireWhen_Pre_WallTime_Past: {
0546
0547
0548
0549
0550
0551 ctx->wall_time_param = &tod_past;
0552 break;
0553 }
0554
0555 case RtemsTimerReqServerFireWhen_Pre_WallTime_Null: {
0556
0557
0558
0559 ctx->wall_time_param = NULL;
0560 break;
0561 }
0562
0563 case RtemsTimerReqServerFireWhen_Pre_WallTime_NA:
0564 break;
0565 }
0566 }
0567
0568 static void RtemsTimerReqServerFireWhen_Pre_Id_Prepare(
0569 RtemsTimerReqServerFireWhen_Context *ctx,
0570 RtemsTimerReqServerFireWhen_Pre_Id state
0571 )
0572 {
0573 switch ( state ) {
0574 case RtemsTimerReqServerFireWhen_Pre_Id_Valid: {
0575
0576
0577
0578 ctx->id_param = ctx->timer_id;
0579 break;
0580 }
0581
0582 case RtemsTimerReqServerFireWhen_Pre_Id_Invalid: {
0583
0584
0585
0586 ctx->id_param = RTEMS_ID_NONE;
0587 break;
0588 }
0589
0590 case RtemsTimerReqServerFireWhen_Pre_Id_NA:
0591 break;
0592 }
0593 }
0594
0595 static void RtemsTimerReqServerFireWhen_Pre_Context_Prepare(
0596 RtemsTimerReqServerFireWhen_Context *ctx,
0597 RtemsTimerReqServerFireWhen_Pre_Context state
0598 )
0599 {
0600 switch ( state ) {
0601 case RtemsTimerReqServerFireWhen_Pre_Context_None: {
0602
0603
0604
0605
0606 ctx->pre_cond_contex = PRE_NONE;
0607 break;
0608 }
0609
0610 case RtemsTimerReqServerFireWhen_Pre_Context_Interrupt: {
0611
0612
0613
0614 ctx->pre_cond_contex = PRE_INTERRUPT;
0615 break;
0616 }
0617
0618 case RtemsTimerReqServerFireWhen_Pre_Context_Server: {
0619
0620
0621
0622 ctx->pre_cond_contex = PRE_SERVER;
0623 break;
0624 }
0625
0626 case RtemsTimerReqServerFireWhen_Pre_Context_NA:
0627 break;
0628 }
0629 }
0630
0631 static void RtemsTimerReqServerFireWhen_Pre_Clock_Prepare(
0632 RtemsTimerReqServerFireWhen_Context *ctx,
0633 RtemsTimerReqServerFireWhen_Pre_Clock state
0634 )
0635 {
0636 switch ( state ) {
0637 case RtemsTimerReqServerFireWhen_Pre_Clock_None: {
0638
0639
0640
0641 T_eq_int( ctx->pre_cond_contex, PRE_NONE );
0642 break;
0643 }
0644
0645 case RtemsTimerReqServerFireWhen_Pre_Clock_Ticks: {
0646
0647
0648
0649
0650 rtems_status_code status;
0651
0652 if ( ctx->pre_cond_contex == PRE_INTERRUPT ) {
0653 status = rtems_timer_fire_after(
0654 ctx->timer_id,
0655 SCHEDULE_SOON,
0656 TimerServiceRoutine,
0657 ctx
0658 );
0659 } else {
0660 status = rtems_timer_server_fire_after(
0661 ctx->timer_id,
0662 SCHEDULE_SOON,
0663 TimerServiceRoutine,
0664 ctx
0665 );
0666 }
0667 T_rsc_success( status );
0668 break;
0669 }
0670
0671 case RtemsTimerReqServerFireWhen_Pre_Clock_Realtime: {
0672
0673
0674
0675
0676 rtems_status_code status;
0677 T_rsc_success( rtems_clock_set( &tod_now ) );
0678
0679 if ( ctx->pre_cond_contex == PRE_INTERRUPT ) {
0680 status = rtems_timer_fire_when(
0681 ctx->timer_id,
0682 &tod_schedule,
0683 TimerServiceRoutine,
0684 ctx
0685 );
0686 } else {
0687 status = rtems_timer_server_fire_when(
0688 ctx->timer_id,
0689 &tod_schedule,
0690 TimerServiceRoutine,
0691 ctx
0692 );
0693 }
0694 T_rsc_success( status );
0695 break;
0696 }
0697
0698 case RtemsTimerReqServerFireWhen_Pre_Clock_NA:
0699 break;
0700 }
0701 }
0702
0703 static void RtemsTimerReqServerFireWhen_Pre_State_Prepare(
0704 RtemsTimerReqServerFireWhen_Context *ctx,
0705 RtemsTimerReqServerFireWhen_Pre_State state
0706 )
0707 {
0708 switch ( state ) {
0709 case RtemsTimerReqServerFireWhen_Pre_State_Inactive: {
0710
0711
0712
0713 TriggerTimer( ctx, NULL );
0714 T_eq_int(
0715 ctx->invocations,
0716 ( ctx->pre_cond_contex == PRE_NONE ) ? 0 : 1
0717 );
0718 ctx->invocations = 0;
0719 ctx->pre_state = TIMER_INACTIVE;
0720 break;
0721 }
0722
0723 case RtemsTimerReqServerFireWhen_Pre_State_Scheduled: {
0724
0725
0726
0727
0728 ctx->pre_state = TIMER_SCHEDULED;
0729 break;
0730 }
0731
0732 case RtemsTimerReqServerFireWhen_Pre_State_Pending: {
0733
0734
0735
0736 T_rsc_success( rtems_task_suspend( GetTimerServerTaskId() ) );
0737 TriggerTimer( ctx, NULL );
0738 T_eq_int( ctx->invocations, 0 );
0739 ctx->pre_state = TIMER_PENDING;
0740 break;
0741 }
0742
0743 case RtemsTimerReqServerFireWhen_Pre_State_NA:
0744 break;
0745 }
0746 }
0747
0748 static void RtemsTimerReqServerFireWhen_Post_Status_Check(
0749 RtemsTimerReqServerFireWhen_Context *ctx,
0750 RtemsTimerReqServerFireWhen_Post_Status state
0751 )
0752 {
0753 switch ( state ) {
0754 case RtemsTimerReqServerFireWhen_Post_Status_Ok: {
0755
0756
0757
0758
0759 T_rsc_success( ctx->status );
0760 break;
0761 }
0762
0763 case RtemsTimerReqServerFireWhen_Post_Status_NotDef: {
0764
0765
0766
0767
0768 T_rsc( ctx->status, RTEMS_NOT_DEFINED );
0769 break;
0770 }
0771
0772 case RtemsTimerReqServerFireWhen_Post_Status_InvId: {
0773
0774
0775
0776
0777 T_rsc( ctx->status, RTEMS_INVALID_ID );
0778 break;
0779 }
0780
0781 case RtemsTimerReqServerFireWhen_Post_Status_InvAddr: {
0782
0783
0784
0785
0786 T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
0787 break;
0788 }
0789
0790 case RtemsTimerReqServerFireWhen_Post_Status_InvClock: {
0791
0792
0793
0794
0795 T_rsc( ctx->status, RTEMS_INVALID_CLOCK );
0796 break;
0797 }
0798
0799 case RtemsTimerReqServerFireWhen_Post_Status_IncStat: {
0800
0801
0802
0803
0804 T_rsc( ctx->status, RTEMS_INCORRECT_STATE );
0805 break;
0806 }
0807
0808 case RtemsTimerReqServerFireWhen_Post_Status_NA:
0809 break;
0810 }
0811 }
0812
0813 static void RtemsTimerReqServerFireWhen_Post_Context_Check(
0814 RtemsTimerReqServerFireWhen_Context *ctx,
0815 RtemsTimerReqServerFireWhen_Post_Context state
0816 )
0817 {
0818 Timer_Classes class;
0819 class = GetTimerClass( ctx->timer_id );
0820
0821 switch ( state ) {
0822 case RtemsTimerReqServerFireWhen_Post_Context_None: {
0823
0824
0825
0826 T_eq_int( class, TIMER_DORMANT );
0827 break;
0828 }
0829
0830 case RtemsTimerReqServerFireWhen_Post_Context_Interrupt: {
0831
0832
0833
0834 T_eq_int( class & TIMER_CLASS_BIT_ON_TASK, 0 );
0835 break;
0836 }
0837
0838 case RtemsTimerReqServerFireWhen_Post_Context_Server: {
0839
0840
0841
0842 T_eq_int( class & TIMER_CLASS_BIT_ON_TASK, TIMER_CLASS_BIT_ON_TASK );
0843 break;
0844 }
0845
0846 case RtemsTimerReqServerFireWhen_Post_Context_Nop: {
0847
0848
0849
0850
0851
0852 T_eq_int( class, ctx->pre_class );
0853 break;
0854 }
0855
0856 case RtemsTimerReqServerFireWhen_Post_Context_NA:
0857 break;
0858 }
0859 }
0860
0861 static void RtemsTimerReqServerFireWhen_Post_Clock_Check(
0862 RtemsTimerReqServerFireWhen_Context *ctx,
0863 RtemsTimerReqServerFireWhen_Post_Clock state
0864 )
0865 {
0866 Timer_Classes class;
0867 class = GetTimerClass( ctx->timer_id );
0868
0869 switch ( state ) {
0870 case RtemsTimerReqServerFireWhen_Post_Clock_None: {
0871
0872
0873
0874 T_eq_int( class, TIMER_DORMANT );
0875 break;
0876 }
0877
0878 case RtemsTimerReqServerFireWhen_Post_Clock_Ticks: {
0879
0880
0881
0882 T_eq_int( class & TIMER_CLASS_BIT_TIME_OF_DAY, 0 );
0883 break;
0884 }
0885
0886 case RtemsTimerReqServerFireWhen_Post_Clock_Realtime: {
0887
0888
0889
0890 T_eq_int(
0891 class & TIMER_CLASS_BIT_TIME_OF_DAY,
0892 TIMER_CLASS_BIT_TIME_OF_DAY
0893 );
0894 break;
0895 }
0896
0897 case RtemsTimerReqServerFireWhen_Post_Clock_Nop: {
0898
0899
0900
0901
0902
0903 T_eq_int( class, ctx->pre_class );
0904 break;
0905 }
0906
0907 case RtemsTimerReqServerFireWhen_Post_Clock_NA:
0908 break;
0909 }
0910 }
0911
0912 static void RtemsTimerReqServerFireWhen_Post_State_Check(
0913 RtemsTimerReqServerFireWhen_Context *ctx,
0914 RtemsTimerReqServerFireWhen_Post_State state
0915 )
0916 {
0917 switch ( state ) {
0918 case RtemsTimerReqServerFireWhen_Post_State_Scheduled: {
0919
0920
0921
0922 TriggerTimer( ctx, &ctx->tod_till_fire );
0923 T_eq_int( ctx->invocations, 1 );
0924 break;
0925 }
0926
0927 case RtemsTimerReqServerFireWhen_Post_State_Nop: {
0928
0929
0930
0931
0932
0933 T_eq_int( ctx->post_state, ctx->pre_state );
0934 break;
0935 }
0936
0937 case RtemsTimerReqServerFireWhen_Post_State_NA:
0938 break;
0939 }
0940 }
0941
0942 static void RtemsTimerReqServerFireWhen_Post_WallTime_Check(
0943 RtemsTimerReqServerFireWhen_Context *ctx,
0944 RtemsTimerReqServerFireWhen_Post_WallTime state
0945 )
0946 {
0947 switch ( state ) {
0948 case RtemsTimerReqServerFireWhen_Post_WallTime_Param: {
0949
0950
0951
0952
0953
0954
0955 T_eq_mem(
0956 &ctx->tod_till_fire,
0957 ctx->wall_time_param,
0958 sizeof( ctx->tod_till_fire )
0959 );
0960 break;
0961 }
0962
0963 case RtemsTimerReqServerFireWhen_Post_WallTime_Nop: {
0964
0965
0966
0967
0968
0969
0970
0971
0972 T_eq_u32(
0973 ctx->post_scheduling_data.interval,
0974 ctx->pre_scheduling_data.interval
0975 );
0976 break;
0977 }
0978
0979 case RtemsTimerReqServerFireWhen_Post_WallTime_NA:
0980 break;
0981 }
0982 }
0983
0984 static void RtemsTimerReqServerFireWhen_Post_Routine_Check(
0985 RtemsTimerReqServerFireWhen_Context *ctx,
0986 RtemsTimerReqServerFireWhen_Post_Routine state
0987 )
0988 {
0989 switch ( state ) {
0990 case RtemsTimerReqServerFireWhen_Post_Routine_Param: {
0991
0992
0993
0994
0995
0996 T_eq_int( ctx->invocations, 1 );
0997 break;
0998 }
0999
1000 case RtemsTimerReqServerFireWhen_Post_Routine_Nop: {
1001
1002
1003
1004
1005
1006 T_eq_ptr(
1007 ctx->post_scheduling_data.routine,
1008 ctx->pre_scheduling_data.routine
1009 );
1010 break;
1011 }
1012
1013 case RtemsTimerReqServerFireWhen_Post_Routine_NA:
1014 break;
1015 }
1016 }
1017
1018 static void RtemsTimerReqServerFireWhen_Post_UserData_Check(
1019 RtemsTimerReqServerFireWhen_Context *ctx,
1020 RtemsTimerReqServerFireWhen_Post_UserData state
1021 )
1022 {
1023 switch ( state ) {
1024 case RtemsTimerReqServerFireWhen_Post_UserData_Param: {
1025
1026
1027
1028
1029
1030 T_eq_ptr( ctx->routine_user_data, ctx );
1031 break;
1032 }
1033
1034 case RtemsTimerReqServerFireWhen_Post_UserData_Nop: {
1035
1036
1037
1038
1039
1040 T_eq_ptr(
1041 ctx->post_scheduling_data.user_data,
1042 ctx->pre_scheduling_data.user_data
1043 );
1044 break;
1045 }
1046
1047 case RtemsTimerReqServerFireWhen_Post_UserData_NA:
1048 break;
1049 }
1050 }
1051
1052
1053
1054
1055 static void RtemsTimerReqServerFireWhen_Teardown(
1056 RtemsTimerReqServerFireWhen_Context *ctx
1057 )
1058 {
1059 UnsetClock();
1060 }
1061
1062 static void RtemsTimerReqServerFireWhen_Teardown_Wrap( void *arg )
1063 {
1064 RtemsTimerReqServerFireWhen_Context *ctx;
1065
1066 ctx = arg;
1067 ctx->Map.in_action_loop = false;
1068 RtemsTimerReqServerFireWhen_Teardown( ctx );
1069 }
1070
1071 static void RtemsTimerReqServerFireWhen_Prepare(
1072 RtemsTimerReqServerFireWhen_Context *ctx
1073 )
1074 {
1075 rtems_status_code status;
1076 status = rtems_timer_create(
1077 rtems_build_name( 'T', 'I', 'M', 'E' ),
1078 &ctx->timer_id
1079 );
1080 T_rsc_success( status );
1081
1082 ctx->invocations = 0;
1083 ctx->routine_user_data = NULL;
1084 }
1085
1086 static void RtemsTimerReqServerFireWhen_Action(
1087 RtemsTimerReqServerFireWhen_Context *ctx
1088 )
1089 {
1090 GetTimerSchedulingData( ctx->timer_id, &ctx->pre_scheduling_data );
1091 ctx->pre_class = GetTimerClass( ctx->timer_id );
1092 if ( ctx->pre_cond_tod == NULL ) {
1093 UnsetClock();
1094 } else {
1095 T_rsc_success( rtems_clock_set( ctx->pre_cond_tod ) );
1096 }
1097 ctx->status = rtems_timer_server_fire_when(
1098 ctx->id_param,
1099 ctx->wall_time_param,
1100 ctx->routine_param,
1101 ctx
1102 );
1103 ctx->post_state = GetTimerState( ctx->timer_id );
1104 GetTimerSchedulingData( ctx->timer_id, &ctx->post_scheduling_data );
1105
1106 rtems_task_resume( GetTimerServerTaskId() );
1107 }
1108
1109 static void RtemsTimerReqServerFireWhen_Cleanup(
1110 RtemsTimerReqServerFireWhen_Context *ctx
1111 )
1112 {
1113 T_rsc_success( rtems_timer_delete( ctx->timer_id ) );
1114 DeleteTimerServer();
1115 }
1116
1117 static const RtemsTimerReqServerFireWhen_Entry
1118 RtemsTimerReqServerFireWhen_Entries[] = {
1119 { 1, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_NA,
1120 RtemsTimerReqServerFireWhen_Post_Context_NA,
1121 RtemsTimerReqServerFireWhen_Post_Clock_NA,
1122 RtemsTimerReqServerFireWhen_Post_State_NA,
1123 RtemsTimerReqServerFireWhen_Post_WallTime_NA,
1124 RtemsTimerReqServerFireWhen_Post_Routine_NA,
1125 RtemsTimerReqServerFireWhen_Post_UserData_NA },
1126 { 1, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_NA,
1127 RtemsTimerReqServerFireWhen_Post_Context_NA,
1128 RtemsTimerReqServerFireWhen_Post_Clock_NA,
1129 RtemsTimerReqServerFireWhen_Post_State_NA,
1130 RtemsTimerReqServerFireWhen_Post_WallTime_NA,
1131 RtemsTimerReqServerFireWhen_Post_Routine_NA,
1132 RtemsTimerReqServerFireWhen_Post_UserData_NA },
1133 { 1, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_NA,
1134 RtemsTimerReqServerFireWhen_Post_Context_NA,
1135 RtemsTimerReqServerFireWhen_Post_Clock_NA,
1136 RtemsTimerReqServerFireWhen_Post_State_NA,
1137 RtemsTimerReqServerFireWhen_Post_WallTime_NA,
1138 RtemsTimerReqServerFireWhen_Post_Routine_NA,
1139 RtemsTimerReqServerFireWhen_Post_UserData_NA },
1140 { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_IncStat,
1141 RtemsTimerReqServerFireWhen_Post_Context_Nop,
1142 RtemsTimerReqServerFireWhen_Post_Clock_Nop,
1143 RtemsTimerReqServerFireWhen_Post_State_Nop,
1144 RtemsTimerReqServerFireWhen_Post_WallTime_Nop,
1145 RtemsTimerReqServerFireWhen_Post_Routine_Nop,
1146 RtemsTimerReqServerFireWhen_Post_UserData_Nop },
1147 { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_InvAddr,
1148 RtemsTimerReqServerFireWhen_Post_Context_Nop,
1149 RtemsTimerReqServerFireWhen_Post_Clock_Nop,
1150 RtemsTimerReqServerFireWhen_Post_State_Nop,
1151 RtemsTimerReqServerFireWhen_Post_WallTime_Nop,
1152 RtemsTimerReqServerFireWhen_Post_Routine_Nop,
1153 RtemsTimerReqServerFireWhen_Post_UserData_Nop },
1154 { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_NotDef,
1155 RtemsTimerReqServerFireWhen_Post_Context_Nop,
1156 RtemsTimerReqServerFireWhen_Post_Clock_Nop,
1157 RtemsTimerReqServerFireWhen_Post_State_Nop,
1158 RtemsTimerReqServerFireWhen_Post_WallTime_Nop,
1159 RtemsTimerReqServerFireWhen_Post_Routine_Nop,
1160 RtemsTimerReqServerFireWhen_Post_UserData_Nop },
1161 { 0, 0, 0, 0, 0, 0, 0, 0, 0,
1162 RtemsTimerReqServerFireWhen_Post_Status_InvClock,
1163 RtemsTimerReqServerFireWhen_Post_Context_Nop,
1164 RtemsTimerReqServerFireWhen_Post_Clock_Nop,
1165 RtemsTimerReqServerFireWhen_Post_State_Nop,
1166 RtemsTimerReqServerFireWhen_Post_WallTime_Nop,
1167 RtemsTimerReqServerFireWhen_Post_Routine_Nop,
1168 RtemsTimerReqServerFireWhen_Post_UserData_Nop },
1169 { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_Ok,
1170 RtemsTimerReqServerFireWhen_Post_Context_Server,
1171 RtemsTimerReqServerFireWhen_Post_Clock_Realtime,
1172 RtemsTimerReqServerFireWhen_Post_State_Scheduled,
1173 RtemsTimerReqServerFireWhen_Post_WallTime_Param,
1174 RtemsTimerReqServerFireWhen_Post_Routine_Param,
1175 RtemsTimerReqServerFireWhen_Post_UserData_Param },
1176 { 0, 0, 0, 0, 0, 0, 0, 0, 0, RtemsTimerReqServerFireWhen_Post_Status_InvId,
1177 RtemsTimerReqServerFireWhen_Post_Context_Nop,
1178 RtemsTimerReqServerFireWhen_Post_Clock_Nop,
1179 RtemsTimerReqServerFireWhen_Post_State_Nop,
1180 RtemsTimerReqServerFireWhen_Post_WallTime_Nop,
1181 RtemsTimerReqServerFireWhen_Post_Routine_Nop,
1182 RtemsTimerReqServerFireWhen_Post_UserData_Nop }
1183 };
1184
1185 static const uint8_t
1186 RtemsTimerReqServerFireWhen_Map[] = {
1187 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7,
1188 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 8, 8, 8, 8,
1189 8, 8, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 6, 6, 0, 0, 0, 0, 6, 6, 6,
1190 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 6, 6, 0, 0, 0, 0, 6, 6,
1191 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 6, 6, 0, 0, 0, 0, 6,
1192 6, 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 6, 6, 0, 0, 0, 0,
1193 6, 6, 6, 6, 6, 6, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 4, 0, 0, 0,
1194 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 4, 0, 0,
1195 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 4, 0,
1196 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 4,
1197 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4,
1198 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0,
1199 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4,
1200 0, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
1201 4, 0, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1202 4, 4, 0, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1203 0, 4, 4, 0, 4, 4, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1204 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0,
1205 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0, 0, 0, 0, 0, 0,
1206 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0, 0, 0, 0, 0,
1207 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0, 0, 0, 0,
1208 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0, 0, 0,
1209 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0, 0,
1210 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0, 0,
1211 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5, 0,
1212 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2, 5,
1213 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2, 2,
1214 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2, 2,
1215 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5, 2,
1216 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5, 5,
1217 2, 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5, 5,
1218 5, 2, 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0, 5,
1219 5, 5, 2, 2, 2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 2, 2, 2, 0, 0, 0,
1220 5, 5, 5, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0,
1221 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0,
1222 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0,
1223 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3,
1224 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3,
1225 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0,
1226 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3,
1227 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
1228 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1229 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1230 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1231 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0,
1232 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0,
1233 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0,
1234 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0,
1235 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0,
1236 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0,
1237 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0,
1238 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0,
1239 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3,
1240 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1,
1241 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1,
1242 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1,
1243 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1, 1,
1244 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1, 1,
1245 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0, 1,
1246 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0, 0,
1247 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0, 0,
1248 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2, 0,
1249 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2, 2,
1250 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2, 2,
1251 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 2,
1252 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0,
1253 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1
1254 };
1255
1256 static size_t RtemsTimerReqServerFireWhen_Scope(
1257 void *arg,
1258 char *buf,
1259 size_t n
1260 )
1261 {
1262 RtemsTimerReqServerFireWhen_Context *ctx;
1263
1264 ctx = arg;
1265
1266 if ( ctx->Map.in_action_loop ) {
1267 return T_get_scope(
1268 RtemsTimerReqServerFireWhen_PreDesc,
1269 buf,
1270 n,
1271 ctx->Map.pcs
1272 );
1273 }
1274
1275 return 0;
1276 }
1277
1278 static T_fixture RtemsTimerReqServerFireWhen_Fixture = {
1279 .setup = NULL,
1280 .stop = NULL,
1281 .teardown = RtemsTimerReqServerFireWhen_Teardown_Wrap,
1282 .scope = RtemsTimerReqServerFireWhen_Scope,
1283 .initial_context = &RtemsTimerReqServerFireWhen_Instance
1284 };
1285
1286 static inline RtemsTimerReqServerFireWhen_Entry
1287 RtemsTimerReqServerFireWhen_PopEntry(
1288 RtemsTimerReqServerFireWhen_Context *ctx
1289 )
1290 {
1291 size_t index;
1292
1293 index = ctx->Map.index;
1294 ctx->Map.index = index + 1;
1295 return RtemsTimerReqServerFireWhen_Entries[
1296 RtemsTimerReqServerFireWhen_Map[ index ]
1297 ];
1298 }
1299
1300 static void RtemsTimerReqServerFireWhen_TestVariant(
1301 RtemsTimerReqServerFireWhen_Context *ctx
1302 )
1303 {
1304 RtemsTimerReqServerFireWhen_Pre_Server_Prepare( ctx, ctx->Map.pcs[ 0 ] );
1305 RtemsTimerReqServerFireWhen_Pre_RtClock_Prepare( ctx, ctx->Map.pcs[ 1 ] );
1306 RtemsTimerReqServerFireWhen_Pre_Routine_Prepare( ctx, ctx->Map.pcs[ 2 ] );
1307 RtemsTimerReqServerFireWhen_Pre_WallTime_Prepare( ctx, ctx->Map.pcs[ 3 ] );
1308 RtemsTimerReqServerFireWhen_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 4 ] );
1309 RtemsTimerReqServerFireWhen_Pre_Context_Prepare( ctx, ctx->Map.pcs[ 5 ] );
1310 RtemsTimerReqServerFireWhen_Pre_Clock_Prepare( ctx, ctx->Map.pcs[ 6 ] );
1311 RtemsTimerReqServerFireWhen_Pre_State_Prepare( ctx, ctx->Map.pcs[ 7 ] );
1312 RtemsTimerReqServerFireWhen_Action( ctx );
1313 RtemsTimerReqServerFireWhen_Post_Status_Check(
1314 ctx,
1315 ctx->Map.entry.Post_Status
1316 );
1317 RtemsTimerReqServerFireWhen_Post_Context_Check(
1318 ctx,
1319 ctx->Map.entry.Post_Context
1320 );
1321 RtemsTimerReqServerFireWhen_Post_Clock_Check(
1322 ctx,
1323 ctx->Map.entry.Post_Clock
1324 );
1325 RtemsTimerReqServerFireWhen_Post_State_Check(
1326 ctx,
1327 ctx->Map.entry.Post_State
1328 );
1329 RtemsTimerReqServerFireWhen_Post_WallTime_Check(
1330 ctx,
1331 ctx->Map.entry.Post_WallTime
1332 );
1333 RtemsTimerReqServerFireWhen_Post_Routine_Check(
1334 ctx,
1335 ctx->Map.entry.Post_Routine
1336 );
1337 RtemsTimerReqServerFireWhen_Post_UserData_Check(
1338 ctx,
1339 ctx->Map.entry.Post_UserData
1340 );
1341 }
1342
1343
1344
1345
1346 T_TEST_CASE_FIXTURE(
1347 RtemsTimerReqServerFireWhen,
1348 &RtemsTimerReqServerFireWhen_Fixture
1349 )
1350 {
1351 RtemsTimerReqServerFireWhen_Context *ctx;
1352
1353 ctx = T_fixture_context();
1354 ctx->Map.in_action_loop = true;
1355 ctx->Map.index = 0;
1356
1357 for (
1358 ctx->Map.pcs[ 0 ] = RtemsTimerReqServerFireWhen_Pre_Server_Init;
1359 ctx->Map.pcs[ 0 ] < RtemsTimerReqServerFireWhen_Pre_Server_NA;
1360 ++ctx->Map.pcs[ 0 ]
1361 ) {
1362 for (
1363 ctx->Map.pcs[ 1 ] = RtemsTimerReqServerFireWhen_Pre_RtClock_Set;
1364 ctx->Map.pcs[ 1 ] < RtemsTimerReqServerFireWhen_Pre_RtClock_NA;
1365 ++ctx->Map.pcs[ 1 ]
1366 ) {
1367 for (
1368 ctx->Map.pcs[ 2 ] = RtemsTimerReqServerFireWhen_Pre_Routine_Valid;
1369 ctx->Map.pcs[ 2 ] < RtemsTimerReqServerFireWhen_Pre_Routine_NA;
1370 ++ctx->Map.pcs[ 2 ]
1371 ) {
1372 for (
1373 ctx->Map.pcs[ 3 ] = RtemsTimerReqServerFireWhen_Pre_WallTime_Valid;
1374 ctx->Map.pcs[ 3 ] < RtemsTimerReqServerFireWhen_Pre_WallTime_NA;
1375 ++ctx->Map.pcs[ 3 ]
1376 ) {
1377 for (
1378 ctx->Map.pcs[ 4 ] = RtemsTimerReqServerFireWhen_Pre_Id_Valid;
1379 ctx->Map.pcs[ 4 ] < RtemsTimerReqServerFireWhen_Pre_Id_NA;
1380 ++ctx->Map.pcs[ 4 ]
1381 ) {
1382 for (
1383 ctx->Map.pcs[ 5 ] = RtemsTimerReqServerFireWhen_Pre_Context_None;
1384 ctx->Map.pcs[ 5 ] < RtemsTimerReqServerFireWhen_Pre_Context_NA;
1385 ++ctx->Map.pcs[ 5 ]
1386 ) {
1387 for (
1388 ctx->Map.pcs[ 6 ] = RtemsTimerReqServerFireWhen_Pre_Clock_None;
1389 ctx->Map.pcs[ 6 ] < RtemsTimerReqServerFireWhen_Pre_Clock_NA;
1390 ++ctx->Map.pcs[ 6 ]
1391 ) {
1392 for (
1393 ctx->Map.pcs[ 7 ] = RtemsTimerReqServerFireWhen_Pre_State_Inactive;
1394 ctx->Map.pcs[ 7 ] < RtemsTimerReqServerFireWhen_Pre_State_NA;
1395 ++ctx->Map.pcs[ 7 ]
1396 ) {
1397 ctx->Map.entry = RtemsTimerReqServerFireWhen_PopEntry( ctx );
1398
1399 if ( ctx->Map.entry.Skip ) {
1400 continue;
1401 }
1402
1403 RtemsTimerReqServerFireWhen_Prepare( ctx );
1404 RtemsTimerReqServerFireWhen_TestVariant( ctx );
1405 RtemsTimerReqServerFireWhen_Cleanup( ctx );
1406 }
1407 }
1408 }
1409 }
1410 }
1411 }
1412 }
1413 }
1414 }
1415
1416