Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:51

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup RtemsMessageReqBroadcast
0007  */
0008 
0009 /*
0010  * Copyright (C) 2021 embedded brains GmbH & Co. KG
0011  *
0012  * Redistribution and use in source and binary forms, with or without
0013  * modification, are permitted provided that the following conditions
0014  * are met:
0015  * 1. Redistributions of source code must retain the above copyright
0016  *    notice, this list of conditions and the following disclaimer.
0017  * 2. Redistributions in binary form must reproduce the above copyright
0018  *    notice, this list of conditions and the following disclaimer in the
0019  *    documentation and/or other materials provided with the distribution.
0020  *
0021  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0022  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0023  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0024  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0025  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0026  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0027  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0028  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0029  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0030  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0031  * POSSIBILITY OF SUCH DAMAGE.
0032  */
0033 
0034 /*
0035  * This file is part of the RTEMS quality process and was automatically
0036  * generated.  If you find something that needs to be fixed or
0037  * worded better please post a report or patch to an RTEMS mailing list
0038  * or raise a bug report:
0039  *
0040  * https://www.rtems.org/bugs.html
0041  *
0042  * For information on updating and regenerating please refer to the How-To
0043  * section in the Software Requirements Engineering chapter of the
0044  * RTEMS Software Engineering manual.  The manual is provided as a part of
0045  * a release.  For development sources please refer to the online
0046  * documentation at:
0047  *
0048  * https://docs.rtems.org
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  * @defgroup RtemsMessageReqBroadcast spec:/rtems/message/req/broadcast
0063  *
0064  * @ingroup TestsuitesValidationNoClock0
0065  *
0066  * @{
0067  */
0068 
0069 typedef enum {
0070   RtemsMessageReqBroadcast_Pre_SendBuffer_Valid,
0071   RtemsMessageReqBroadcast_Pre_SendBuffer_Null,
0072   RtemsMessageReqBroadcast_Pre_SendBuffer_NA
0073 } RtemsMessageReqBroadcast_Pre_SendBuffer;
0074 
0075 typedef enum {
0076   RtemsMessageReqBroadcast_Pre_Count_Valid,
0077   RtemsMessageReqBroadcast_Pre_Count_Null,
0078   RtemsMessageReqBroadcast_Pre_Count_NA
0079 } RtemsMessageReqBroadcast_Pre_Count;
0080 
0081 typedef enum {
0082   RtemsMessageReqBroadcast_Pre_Id_Valid,
0083   RtemsMessageReqBroadcast_Pre_Id_Invalid,
0084   RtemsMessageReqBroadcast_Pre_Id_NA
0085 } RtemsMessageReqBroadcast_Pre_Id;
0086 
0087 typedef enum {
0088   RtemsMessageReqBroadcast_Pre_MsgSize_Zero,
0089   RtemsMessageReqBroadcast_Pre_MsgSize_SomeSize,
0090   RtemsMessageReqBroadcast_Pre_MsgSize_MaxSize,
0091   RtemsMessageReqBroadcast_Pre_MsgSize_TooLarge,
0092   RtemsMessageReqBroadcast_Pre_MsgSize_NA
0093 } RtemsMessageReqBroadcast_Pre_MsgSize;
0094 
0095 typedef enum {
0096   RtemsMessageReqBroadcast_Pre_MsgQueue_Empty,
0097   RtemsMessageReqBroadcast_Pre_MsgQueue_Several,
0098   RtemsMessageReqBroadcast_Pre_MsgQueue_NA
0099 } RtemsMessageReqBroadcast_Pre_MsgQueue;
0100 
0101 typedef enum {
0102   RtemsMessageReqBroadcast_Pre_Receivers_Waiting,
0103   RtemsMessageReqBroadcast_Pre_Receivers_None,
0104   RtemsMessageReqBroadcast_Pre_Receivers_NA
0105 } RtemsMessageReqBroadcast_Pre_Receivers;
0106 
0107 typedef enum {
0108   RtemsMessageReqBroadcast_Pre_Storage_Nop,
0109   RtemsMessageReqBroadcast_Pre_Storage_NA
0110 } RtemsMessageReqBroadcast_Pre_Storage;
0111 
0112 typedef enum {
0113   RtemsMessageReqBroadcast_Post_Status_Ok,
0114   RtemsMessageReqBroadcast_Post_Status_InvId,
0115   RtemsMessageReqBroadcast_Post_Status_InvAddr,
0116   RtemsMessageReqBroadcast_Post_Status_InvSize,
0117   RtemsMessageReqBroadcast_Post_Status_NA
0118 } RtemsMessageReqBroadcast_Post_Status;
0119 
0120 typedef enum {
0121   RtemsMessageReqBroadcast_Post_Count_Zero,
0122   RtemsMessageReqBroadcast_Post_Count_Set,
0123   RtemsMessageReqBroadcast_Post_Count_Nop,
0124   RtemsMessageReqBroadcast_Post_Count_NA
0125 } RtemsMessageReqBroadcast_Post_Count;
0126 
0127 typedef enum {
0128   RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
0129   RtemsMessageReqBroadcast_Post_MsgQueue_NA
0130 } RtemsMessageReqBroadcast_Post_MsgQueue;
0131 
0132 typedef enum {
0133   RtemsMessageReqBroadcast_Post_Receivers_Unblocked,
0134   RtemsMessageReqBroadcast_Post_Receivers_Nop,
0135   RtemsMessageReqBroadcast_Post_Receivers_NA
0136 } RtemsMessageReqBroadcast_Post_Receivers;
0137 
0138 typedef enum {
0139   RtemsMessageReqBroadcast_Post_RecSize_Message,
0140   RtemsMessageReqBroadcast_Post_RecSize_Nop,
0141   RtemsMessageReqBroadcast_Post_RecSize_NA
0142 } RtemsMessageReqBroadcast_Post_RecSize;
0143 
0144 typedef enum {
0145   RtemsMessageReqBroadcast_Post_RecBuffer_Message,
0146   RtemsMessageReqBroadcast_Post_RecBuffer_Nop,
0147   RtemsMessageReqBroadcast_Post_RecBuffer_NA
0148 } RtemsMessageReqBroadcast_Post_RecBuffer;
0149 
0150 typedef struct {
0151   uint32_t Skip : 1;
0152   uint32_t Pre_SendBuffer_NA : 1;
0153   uint32_t Pre_Count_NA : 1;
0154   uint32_t Pre_Id_NA : 1;
0155   uint32_t Pre_MsgSize_NA : 1;
0156   uint32_t Pre_MsgQueue_NA : 1;
0157   uint32_t Pre_Receivers_NA : 1;
0158   uint32_t Pre_Storage_NA : 1;
0159   uint32_t Post_Status : 3;
0160   uint32_t Post_Count : 2;
0161   uint32_t Post_MsgQueue : 1;
0162   uint32_t Post_Receivers : 2;
0163   uint32_t Post_RecSize : 2;
0164   uint32_t Post_RecBuffer : 2;
0165 } RtemsMessageReqBroadcast_Entry;
0166 
0167 #define MAXIMUM_PENDING_MESSAGES 3
0168 #define MAXIMUM_MESSAGE_SIZE     5
0169 #define NUMBER_OF_WORKERS        3
0170 
0171 /**
0172  * @brief Test context for spec:/rtems/message/req/broadcast test case.
0173  */
0174 typedef struct {
0175   /**
0176    * @brief This member contains a valid ID of a message queue.
0177    */
0178   rtems_id message_queue_id;
0179 
0180   /**
0181    * @brief This member is used as storage area for the message queue.
0182    */
0183   RTEMS_MESSAGE_QUEUE_BUFFER( MAXIMUM_MESSAGE_SIZE )
0184     storage_area[ MAXIMUM_PENDING_MESSAGES ];
0185 
0186   /**
0187    * @brief This member contains a buffer to receive messages from the queue.
0188    */
0189   uint8_t receive_buffer[ NUMBER_OF_WORKERS ][ MAXIMUM_MESSAGE_SIZE ];
0190 
0191   /**
0192    * @brief This member contains several buffers to receive a messages size.
0193    */
0194   size_t receive_size[ NUMBER_OF_WORKERS ];
0195 
0196   /**
0197    * @brief This member contains the returned status codes of the receivers.
0198    */
0199   rtems_status_code receive_status[ NUMBER_OF_WORKERS ];
0200 
0201   /**
0202    * @brief This member specifies the ``id`` parameter of the action.
0203    */
0204   rtems_id id_param;
0205 
0206   /**
0207    * @brief This member specifies the ``buffer`` parameter of the action.
0208    */
0209   const void *buffer_param;
0210 
0211   /**
0212    * @brief This member specifies the ``size`` parameter of the action.
0213    */
0214   size_t size_param;
0215 
0216   /**
0217    * @brief This member specifies the ``count`` parameter of the action.
0218    */
0219   uint32_t *count_param;
0220 
0221   /**
0222    * @brief This member contains the returned status code of the action.
0223    */
0224   rtems_status_code status;
0225 
0226   /**
0227    * @brief This member contains the value returned in parameter ``count`` of
0228    *   the action.
0229    */
0230   uint32_t count;
0231 
0232   /**
0233    * @brief This member contains the task identifiers of the worker tasks.
0234    */
0235   rtems_id worker_id[ NUMBER_OF_WORKERS ];
0236 
0237   /**
0238    * @brief This member contains a pointer to a function which is executed to
0239    *   check that the action has not changed the content of the message queue.
0240    */
0241   void (*check_msgq_unchanged)( void *ctx_in );
0242 
0243   struct {
0244     /**
0245      * @brief This member defines the pre-condition states for the next action.
0246      */
0247     size_t pcs[ 7 ];
0248 
0249     /**
0250      * @brief If this member is true, then the test action loop is executed.
0251      */
0252     bool in_action_loop;
0253 
0254     /**
0255      * @brief This member contains the next transition map index.
0256      */
0257     size_t index;
0258 
0259     /**
0260      * @brief This member contains the current transition map entry.
0261      */
0262     RtemsMessageReqBroadcast_Entry entry;
0263 
0264     /**
0265      * @brief If this member is true, then the current transition variant
0266      *   should be skipped.
0267      */
0268     bool skip;
0269   } Map;
0270 } RtemsMessageReqBroadcast_Context;
0271 
0272 static RtemsMessageReqBroadcast_Context
0273   RtemsMessageReqBroadcast_Instance;
0274 
0275 static const char * const RtemsMessageReqBroadcast_PreDesc_SendBuffer[] = {
0276   "Valid",
0277   "Null",
0278   "NA"
0279 };
0280 
0281 static const char * const RtemsMessageReqBroadcast_PreDesc_Count[] = {
0282   "Valid",
0283   "Null",
0284   "NA"
0285 };
0286 
0287 static const char * const RtemsMessageReqBroadcast_PreDesc_Id[] = {
0288   "Valid",
0289   "Invalid",
0290   "NA"
0291 };
0292 
0293 static const char * const RtemsMessageReqBroadcast_PreDesc_MsgSize[] = {
0294   "Zero",
0295   "SomeSize",
0296   "MaxSize",
0297   "TooLarge",
0298   "NA"
0299 };
0300 
0301 static const char * const RtemsMessageReqBroadcast_PreDesc_MsgQueue[] = {
0302   "Empty",
0303   "Several",
0304   "NA"
0305 };
0306 
0307 static const char * const RtemsMessageReqBroadcast_PreDesc_Receivers[] = {
0308   "Waiting",
0309   "None",
0310   "NA"
0311 };
0312 
0313 static const char * const RtemsMessageReqBroadcast_PreDesc_Storage[] = {
0314   "Nop",
0315   "NA"
0316 };
0317 
0318 static const char * const * const RtemsMessageReqBroadcast_PreDesc[] = {
0319   RtemsMessageReqBroadcast_PreDesc_SendBuffer,
0320   RtemsMessageReqBroadcast_PreDesc_Count,
0321   RtemsMessageReqBroadcast_PreDesc_Id,
0322   RtemsMessageReqBroadcast_PreDesc_MsgSize,
0323   RtemsMessageReqBroadcast_PreDesc_MsgQueue,
0324   RtemsMessageReqBroadcast_PreDesc_Receivers,
0325   RtemsMessageReqBroadcast_PreDesc_Storage,
0326   NULL
0327 };
0328 
0329 typedef RtemsMessageReqBroadcast_Context Context;
0330 static const rtems_interval TIMEOUT_TICKS = 1;
0331 static const rtems_event_set EVENT_RECEIVE = RTEMS_EVENT_17;
0332 static const uint8_t message[ MAXIMUM_MESSAGE_SIZE ] =
0333   { 13, 42, 99, 222, 101 };
0334 static const uint8_t queued_message[] = { 200, 201, 202 };
0335 
0336 static void Receive( Context *ctx, size_t worker_index )
0337 {
0338   ctx->receive_status[worker_index] = rtems_message_queue_receive(
0339     ctx->message_queue_id,
0340     ctx->receive_buffer[worker_index],
0341     &ctx->receive_size[worker_index],
0342     RTEMS_WAIT,
0343     TIMEOUT_TICKS
0344   );
0345 }
0346 
0347 static void WorkerTask( rtems_task_argument argument )
0348 {
0349   static size_t worker_number = 0;
0350   size_t worker_index = worker_number++;
0351   Context *ctx = (Context *) argument;
0352 
0353   while ( true ) {
0354     ReceiveAnyEvents();
0355     Receive( ctx, worker_index );
0356   }
0357 }
0358 
0359 static void CheckForNoMessage(
0360   Context *ctx,
0361   rtems_status_code status,
0362   uint8_t *message_buffer,
0363   size_t message_size
0364 )
0365 {
0366   (void) ctx;
0367   (void) message_buffer;
0368   (void) message_size;
0369   T_rsc( status, RTEMS_UNSATISFIED  );
0370 }
0371 
0372 static void CheckForMessage(
0373   Context *ctx,
0374   rtems_status_code status,
0375   uint8_t *message_buffer,
0376   size_t message_size
0377 )
0378 {
0379   T_rsc_success( status );
0380   T_eq_u32( message_size, ctx->size_param );
0381   T_eq_mem( message_buffer, message, ctx->size_param );
0382 }
0383 
0384 static void CheckForQueuedMessage(
0385   Context *ctx,
0386   rtems_status_code status,
0387   uint8_t *message_buffer,
0388   size_t message_size
0389 )
0390 {
0391   (void) ctx;
0392   T_rsc_success( status );
0393   T_eq_u32( message_size, sizeof( queued_message ) );
0394   T_eq_mem( message_buffer, queued_message, sizeof( queued_message ) );
0395 }
0396 
0397 static void PopMessage(
0398   Context *ctx,
0399   void (*check_fn)(
0400     Context *ctx,
0401     rtems_status_code status,
0402     uint8_t *message_buffer,
0403     size_t message_size
0404   )
0405 )
0406 {
0407   rtems_status_code status;
0408   uint8_t message_buffer[ MAXIMUM_MESSAGE_SIZE ];
0409   size_t message_size;
0410 
0411   status = rtems_message_queue_receive(
0412     ctx->message_queue_id,
0413     &message_buffer,
0414     &message_size,
0415     RTEMS_LOCAL | RTEMS_NO_WAIT,
0416     RTEMS_NO_TIMEOUT
0417   );
0418 
0419  check_fn( ctx, status, message_buffer, message_size );
0420 }
0421 
0422 static void CheckForNoMessageInQueue( void *ctx_in )
0423 {
0424   Context *ctx = ctx_in;
0425   PopMessage( ctx, CheckForNoMessage );
0426 }
0427 
0428 static void CheckForSeveralMessagesInQueue( void *ctx_in )
0429 {
0430   Context *ctx = ctx_in;
0431   PopMessage( ctx, CheckForQueuedMessage );
0432   PopMessage( ctx, CheckForQueuedMessage );
0433   PopMessage( ctx, CheckForNoMessage );
0434 }
0435 
0436 static void SendMsg( Context *ctx )
0437 {
0438   rtems_status_code status;
0439 
0440   status = rtems_message_queue_send(
0441     ctx->message_queue_id,
0442     queued_message,
0443     sizeof( queued_message )
0444   );
0445   T_rsc_success( status );
0446 }
0447 
0448 static void RtemsMessageReqBroadcast_Pre_SendBuffer_Prepare(
0449   RtemsMessageReqBroadcast_Context       *ctx,
0450   RtemsMessageReqBroadcast_Pre_SendBuffer state
0451 )
0452 {
0453   switch ( state ) {
0454     case RtemsMessageReqBroadcast_Pre_SendBuffer_Valid: {
0455       /*
0456        * While the ``buffer`` parameter references a memory area where the
0457        * message to be sent is stored.
0458        */
0459       ctx->buffer_param = &message;
0460       break;
0461     }
0462 
0463     case RtemsMessageReqBroadcast_Pre_SendBuffer_Null: {
0464       /*
0465        * While the ``buffer`` parameter is NULL.
0466        */
0467       ctx->buffer_param = NULL;
0468       break;
0469     }
0470 
0471     case RtemsMessageReqBroadcast_Pre_SendBuffer_NA:
0472       break;
0473   }
0474 }
0475 
0476 static void RtemsMessageReqBroadcast_Pre_Count_Prepare(
0477   RtemsMessageReqBroadcast_Context  *ctx,
0478   RtemsMessageReqBroadcast_Pre_Count state
0479 )
0480 {
0481   switch ( state ) {
0482     case RtemsMessageReqBroadcast_Pre_Count_Valid: {
0483       /*
0484        * While the ``count`` parameter references an ``uint32_t`` object.
0485        */
0486       ctx->count_param = &ctx->count;
0487       break;
0488     }
0489 
0490     case RtemsMessageReqBroadcast_Pre_Count_Null: {
0491       /*
0492        * While the ``count`` parameter is NULL.
0493        */
0494       ctx->count_param = NULL;
0495       break;
0496     }
0497 
0498     case RtemsMessageReqBroadcast_Pre_Count_NA:
0499       break;
0500   }
0501 }
0502 
0503 static void RtemsMessageReqBroadcast_Pre_Id_Prepare(
0504   RtemsMessageReqBroadcast_Context *ctx,
0505   RtemsMessageReqBroadcast_Pre_Id   state
0506 )
0507 {
0508   switch ( state ) {
0509     case RtemsMessageReqBroadcast_Pre_Id_Valid: {
0510       /*
0511        * While the ``id`` parameter is valid.
0512        */
0513       ctx->id_param = ctx->message_queue_id;
0514       break;
0515     }
0516 
0517     case RtemsMessageReqBroadcast_Pre_Id_Invalid: {
0518       /*
0519        * While the ``id`` parameter is invalid.
0520        */
0521       ctx->id_param = RTEMS_ID_NONE;
0522       break;
0523     }
0524 
0525     case RtemsMessageReqBroadcast_Pre_Id_NA:
0526       break;
0527   }
0528 }
0529 
0530 static void RtemsMessageReqBroadcast_Pre_MsgSize_Prepare(
0531   RtemsMessageReqBroadcast_Context    *ctx,
0532   RtemsMessageReqBroadcast_Pre_MsgSize state
0533 )
0534 {
0535   switch ( state ) {
0536     case RtemsMessageReqBroadcast_Pre_MsgSize_Zero: {
0537       /*
0538        * While the ``size`` parameter is 0.
0539        */
0540       ctx->size_param = 0;
0541       break;
0542     }
0543 
0544     case RtemsMessageReqBroadcast_Pre_MsgSize_SomeSize: {
0545       /*
0546        * While the ``size`` parameter has a value between 0 and the maximum
0547        * message size.
0548        */
0549       ctx->size_param = MAXIMUM_MESSAGE_SIZE / 2 + 1;
0550       break;
0551     }
0552 
0553     case RtemsMessageReqBroadcast_Pre_MsgSize_MaxSize: {
0554       /*
0555        * While the ``size`` parameter has a value of the maximum message size.
0556        */
0557       ctx->size_param = MAXIMUM_MESSAGE_SIZE;
0558       break;
0559     }
0560 
0561     case RtemsMessageReqBroadcast_Pre_MsgSize_TooLarge: {
0562       /*
0563        * While the ``size`` parameter has a value greater than the maximum
0564        * message size.
0565        */
0566       ctx->size_param = MAXIMUM_MESSAGE_SIZE + 1;
0567       break;
0568     }
0569 
0570     case RtemsMessageReqBroadcast_Pre_MsgSize_NA:
0571       break;
0572   }
0573 }
0574 
0575 static void RtemsMessageReqBroadcast_Pre_MsgQueue_Prepare(
0576   RtemsMessageReqBroadcast_Context     *ctx,
0577   RtemsMessageReqBroadcast_Pre_MsgQueue state
0578 )
0579 {
0580   switch ( state ) {
0581     case RtemsMessageReqBroadcast_Pre_MsgQueue_Empty: {
0582       /*
0583        * While there is no message in the message queue.
0584        */
0585       /* Message queue is already empty. */
0586       ctx->check_msgq_unchanged = CheckForNoMessageInQueue;
0587       break;
0588     }
0589 
0590     case RtemsMessageReqBroadcast_Pre_MsgQueue_Several: {
0591       /*
0592        * While there are messages in the message queue.
0593        */
0594       SendMsg( ctx );
0595       SendMsg( ctx );
0596       ctx->check_msgq_unchanged = CheckForSeveralMessagesInQueue;
0597       break;
0598     }
0599 
0600     case RtemsMessageReqBroadcast_Pre_MsgQueue_NA:
0601       break;
0602   }
0603 }
0604 
0605 static void RtemsMessageReqBroadcast_Pre_Receivers_Prepare(
0606   RtemsMessageReqBroadcast_Context      *ctx,
0607   RtemsMessageReqBroadcast_Pre_Receivers state
0608 )
0609 {
0610   switch ( state ) {
0611     case RtemsMessageReqBroadcast_Pre_Receivers_Waiting: {
0612       /*
0613        * While one or more receivers are waiting to receive a message.
0614        */
0615       size_t i;
0616       for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0617         SendEvents( ctx->worker_id[i], EVENT_RECEIVE );
0618       }
0619       break;
0620     }
0621 
0622     case RtemsMessageReqBroadcast_Pre_Receivers_None: {
0623       /*
0624        * While no receiver is waiting to receive a message.
0625        */
0626       /* There is already no receiver waiting. */
0627       break;
0628     }
0629 
0630     case RtemsMessageReqBroadcast_Pre_Receivers_NA:
0631       break;
0632   }
0633 }
0634 
0635 static void RtemsMessageReqBroadcast_Pre_Storage_Prepare(
0636   RtemsMessageReqBroadcast_Context    *ctx,
0637   RtemsMessageReqBroadcast_Pre_Storage state
0638 )
0639 {
0640   switch ( state ) {
0641     case RtemsMessageReqBroadcast_Pre_Storage_Nop: {
0642       /*
0643        * While the memory area to which a pointer is provided as member
0644        * storage_area of type rtems_message_queue_config when the message queue
0645        * is constructed by rtems_message_queue_construct() is altered only by
0646        * the RTEMS operating system.
0647        */
0648       /* Only a requirement text. */
0649       break;
0650     }
0651 
0652     case RtemsMessageReqBroadcast_Pre_Storage_NA:
0653       break;
0654   }
0655 }
0656 
0657 static void RtemsMessageReqBroadcast_Post_Status_Check(
0658   RtemsMessageReqBroadcast_Context    *ctx,
0659   RtemsMessageReqBroadcast_Post_Status state
0660 )
0661 {
0662   switch ( state ) {
0663     case RtemsMessageReqBroadcast_Post_Status_Ok: {
0664       /*
0665        * The return status of rtems_message_queue_broadcast() shall be
0666        * RTEMS_SUCCESSFUL
0667        */
0668       T_rsc_success( ctx->status );
0669       break;
0670     }
0671 
0672     case RtemsMessageReqBroadcast_Post_Status_InvId: {
0673       /*
0674        * The return status of rtems_message_queue_broadcast() shall be
0675        * RTEMS_INVALID_ID.
0676        */
0677       T_rsc( ctx->status, RTEMS_INVALID_ID );
0678       break;
0679     }
0680 
0681     case RtemsMessageReqBroadcast_Post_Status_InvAddr: {
0682       /*
0683        * The return status of rtems_message_queue_broadcast() shall be
0684        * RTEMS_INVALID_ADDRESS.
0685        */
0686       T_rsc( ctx->status, RTEMS_INVALID_ADDRESS );
0687       break;
0688     }
0689 
0690     case RtemsMessageReqBroadcast_Post_Status_InvSize: {
0691       /*
0692        * The return status of rtems_message_queue_broadcast() shall be
0693        * RTEMS_INVALID_SIZE.
0694        */
0695       T_rsc( ctx->status, RTEMS_INVALID_SIZE );
0696       break;
0697     }
0698 
0699     case RtemsMessageReqBroadcast_Post_Status_NA:
0700       break;
0701   }
0702 }
0703 
0704 static void RtemsMessageReqBroadcast_Post_Count_Check(
0705   RtemsMessageReqBroadcast_Context   *ctx,
0706   RtemsMessageReqBroadcast_Post_Count state
0707 )
0708 {
0709   switch ( state ) {
0710     case RtemsMessageReqBroadcast_Post_Count_Zero: {
0711       /*
0712        * The value of the object referenced by the ``count`` parameter shall be
0713        * set to 0 after the return of the rtems_message_queue_broadcast() call.
0714        */
0715       T_eq_u32( ctx->count, 0 );
0716       break;
0717     }
0718 
0719     case RtemsMessageReqBroadcast_Post_Count_Set: {
0720       /*
0721        * The value of the object referenced by the ``count`` parameter shall be
0722        * set to the number of tasks unblocked (see unblock) by the call to
0723        * directive rtems_message_queue_broadcast() after the return of the
0724        * rtems_message_queue_broadcast() call.
0725        */
0726       T_eq_u32( ctx->count, NUMBER_OF_WORKERS );
0727       break;
0728     }
0729 
0730     case RtemsMessageReqBroadcast_Post_Count_Nop: {
0731       /*
0732        * The value of the object referenced by the ``count`` parameter in past
0733        * call to rtems_message_queue_broadcast() shall not be accessed by the
0734        * rtems_message_queue_broadcast() call (see also Nop).
0735        */
0736       T_eq_u32( ctx->count, UINT8_MAX );
0737       break;
0738     }
0739 
0740     case RtemsMessageReqBroadcast_Post_Count_NA:
0741       break;
0742   }
0743 }
0744 
0745 static void RtemsMessageReqBroadcast_Post_MsgQueue_Check(
0746   RtemsMessageReqBroadcast_Context      *ctx,
0747   RtemsMessageReqBroadcast_Post_MsgQueue state
0748 )
0749 {
0750   switch ( state ) {
0751     case RtemsMessageReqBroadcast_Post_MsgQueue_Nop: {
0752       /*
0753        * Objects referenced by the ``id`` parameter in the past call to
0754        * rtems_message_queue_broadcast() shall not be accessed by that call
0755        * (see also Nop).
0756        */
0757       ctx->check_msgq_unchanged( ctx );
0758       break;
0759     }
0760 
0761     case RtemsMessageReqBroadcast_Post_MsgQueue_NA:
0762       break;
0763   }
0764 }
0765 
0766 static void RtemsMessageReqBroadcast_Post_Receivers_Check(
0767   RtemsMessageReqBroadcast_Context       *ctx,
0768   RtemsMessageReqBroadcast_Post_Receivers state
0769 )
0770 {
0771   size_t i;
0772 
0773   switch ( state ) {
0774     case RtemsMessageReqBroadcast_Post_Receivers_Unblocked: {
0775       /*
0776        * The call to the rtems_message_queue_broadcast() directive shall
0777        * unblock all receivers waiting for a message at the message queue.
0778        *
0779        * Note: Currently, rtems_message_queue_broadcast() unblocks receivers in
0780        * a none-atomic way. Meaning, it will not only unblock those receivers
0781        * it finds waiting at the queue when rtems_message_queue_broadcast() is
0782        * invoked but also any new receivers which start waiting for messages
0783        * after rtems_message_queue_broadcast() is invoked and before it
0784        * returns. This may lead to infinite unblocking loops.
0785        */
0786       for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0787         T_rsc_success( ctx->receive_status[i] );
0788       }
0789       break;
0790     }
0791 
0792     case RtemsMessageReqBroadcast_Post_Receivers_Nop: {
0793       /*
0794        * The receivers waiting for a message at the message queue shall not be
0795        * affected by the call to the rtems_message_queue_broadcast() directive.
0796        */
0797       for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0798         T_rsc( ctx->receive_status[i], RTEMS_TIMEOUT );
0799       }
0800       break;
0801     }
0802 
0803     case RtemsMessageReqBroadcast_Post_Receivers_NA:
0804       break;
0805   }
0806 }
0807 
0808 static void RtemsMessageReqBroadcast_Post_RecSize_Check(
0809   RtemsMessageReqBroadcast_Context     *ctx,
0810   RtemsMessageReqBroadcast_Post_RecSize state
0811 )
0812 {
0813   size_t i;
0814 
0815   switch ( state ) {
0816     case RtemsMessageReqBroadcast_Post_RecSize_Message: {
0817       /*
0818        * The values of the objects referenced by the ``size`` parameter in all
0819        * calls to rtems_message_queue_receive() which are unblocked (see
0820        * unblock) by the rtems_message_queue_broadcast() call shall be set to
0821        * the same value as provided by parameter ``size`` of the
0822        * rtems_message_queue_broadcast() call after the return of the
0823        * rtems_message_queue_broadcast() call.
0824        */
0825       for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0826         CheckForMessage(
0827           ctx,
0828           ctx->receive_status[i],
0829           ctx->receive_buffer[i],
0830           ctx->receive_size[i]
0831         );
0832       }
0833       break;
0834     }
0835 
0836     case RtemsMessageReqBroadcast_Post_RecSize_Nop: {
0837       /*
0838        * Objects referenced by the ``size`` parameter in past calls to
0839        * rtems_message_queue_receive() shall not be accessed by the
0840        * rtems_message_queue_broadcast() call (see also Nop).
0841        */
0842       for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0843         T_eq_sz( ctx->receive_size[i], SIZE_MAX );
0844       }
0845       break;
0846     }
0847 
0848     case RtemsMessageReqBroadcast_Post_RecSize_NA:
0849       break;
0850   }
0851 }
0852 
0853 static void RtemsMessageReqBroadcast_Post_RecBuffer_Check(
0854   RtemsMessageReqBroadcast_Context       *ctx,
0855   RtemsMessageReqBroadcast_Post_RecBuffer state
0856 )
0857 {
0858   size_t w, i;
0859 
0860   switch ( state ) {
0861     case RtemsMessageReqBroadcast_Post_RecBuffer_Message: {
0862       /*
0863        * Bytes 0 till ``size`` - 1 of the object referenced by the ``buffer``
0864        * parameter in all calls to rtems_message_queue_receive() which are
0865        * unblocked (see unblock) by the rtems_message_queue_broadcast() call
0866        * shall be set to the same values as bytes 0 till ``size`` - 1 of the
0867        * object referenced by parameter ``buffer`` of the
0868        * rtems_message_queue_broadcast() call after the return of the
0869        * rtems_message_queue_receive() call.
0870        */
0871       for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0872         CheckForMessage(
0873           ctx,
0874           ctx->receive_status[i],
0875           ctx->receive_buffer[i],
0876           ctx->receive_size[i]
0877         );
0878       }
0879       break;
0880     }
0881 
0882     case RtemsMessageReqBroadcast_Post_RecBuffer_Nop: {
0883       /*
0884        * Objects referenced by the ``buffer`` parameter in past calls to
0885        * rtems_message_queue_receive() shall not be accessed by the
0886        * rtems_message_queue_broadcast() call (see also Nop).
0887        */
0888       for ( w = 0; w < NUMBER_OF_WORKERS; ++w ) {
0889         for ( i = 0; i < MAXIMUM_MESSAGE_SIZE; ++i ) {
0890           T_eq_u8( ctx->receive_buffer[w][i], UINT8_MAX );
0891         }
0892       }
0893       break;
0894     }
0895 
0896     case RtemsMessageReqBroadcast_Post_RecBuffer_NA:
0897       break;
0898   }
0899 }
0900 
0901 static void RtemsMessageReqBroadcast_Setup(
0902   RtemsMessageReqBroadcast_Context *ctx
0903 )
0904 {
0905   size_t i;
0906   SetSelfPriority( PRIO_NORMAL );
0907 
0908   for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0909     ctx->worker_id[i] = CreateTask( "WORK", PRIO_HIGH );
0910     StartTask( ctx->worker_id[i], WorkerTask, ctx );
0911   }
0912 }
0913 
0914 static void RtemsMessageReqBroadcast_Setup_Wrap( void *arg )
0915 {
0916   RtemsMessageReqBroadcast_Context *ctx;
0917 
0918   ctx = arg;
0919   ctx->Map.in_action_loop = false;
0920   RtemsMessageReqBroadcast_Setup( ctx );
0921 }
0922 
0923 static void RtemsMessageReqBroadcast_Teardown(
0924   RtemsMessageReqBroadcast_Context *ctx
0925 )
0926 {
0927   size_t i;
0928 
0929   for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0930     DeleteTask( ctx->worker_id[i] );
0931   }
0932   RestoreRunnerPriority();
0933 }
0934 
0935 static void RtemsMessageReqBroadcast_Teardown_Wrap( void *arg )
0936 {
0937   RtemsMessageReqBroadcast_Context *ctx;
0938 
0939   ctx = arg;
0940   ctx->Map.in_action_loop = false;
0941   RtemsMessageReqBroadcast_Teardown( ctx );
0942 }
0943 
0944 static void RtemsMessageReqBroadcast_Prepare(
0945   RtemsMessageReqBroadcast_Context *ctx
0946 )
0947 {
0948   rtems_status_code status;
0949   size_t i;
0950 
0951   rtems_message_queue_config config = {
0952     .name                     = rtems_build_name( 'M', 'S', 'G', 'Q' ),
0953     .maximum_pending_messages = MAXIMUM_PENDING_MESSAGES,
0954     .maximum_message_size     = MAXIMUM_MESSAGE_SIZE,
0955     .storage_area             = ctx->storage_area,
0956     .storage_size             = sizeof( ctx->storage_area ),
0957     .storage_free             = NULL,
0958     .attributes               = RTEMS_DEFAULT_ATTRIBUTES
0959   };
0960 
0961   status = rtems_message_queue_construct(
0962     &config,
0963     &ctx->message_queue_id
0964   );
0965   T_rsc_success( status );
0966 
0967   ctx->count = UINT8_MAX;
0968   for ( i = 0; i < NUMBER_OF_WORKERS; ++i ) {
0969       ctx->receive_size[i] = SIZE_MAX;
0970       memset( ctx->receive_buffer[i], UINT8_MAX, MAXIMUM_MESSAGE_SIZE );
0971   }
0972 }
0973 
0974 static void RtemsMessageReqBroadcast_Action(
0975   RtemsMessageReqBroadcast_Context *ctx
0976 )
0977 {
0978   ctx->status = rtems_message_queue_broadcast(
0979     ctx->id_param,
0980     ctx->buffer_param,
0981     ctx->size_param,
0982     ctx->count_param
0983   );
0984 
0985   FinalClockTick();
0986 }
0987 
0988 static void RtemsMessageReqBroadcast_Cleanup(
0989   RtemsMessageReqBroadcast_Context *ctx
0990 )
0991 {
0992   T_rsc_success( rtems_message_queue_delete( ctx->message_queue_id ) );
0993 }
0994 
0995 static const RtemsMessageReqBroadcast_Entry
0996 RtemsMessageReqBroadcast_Entries[] = {
0997   { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_InvAddr,
0998     RtemsMessageReqBroadcast_Post_Count_Nop,
0999     RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1000     RtemsMessageReqBroadcast_Post_Receivers_NA,
1001     RtemsMessageReqBroadcast_Post_RecSize_NA,
1002     RtemsMessageReqBroadcast_Post_RecBuffer_NA },
1003   { 1, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_NA,
1004     RtemsMessageReqBroadcast_Post_Count_NA,
1005     RtemsMessageReqBroadcast_Post_MsgQueue_NA,
1006     RtemsMessageReqBroadcast_Post_Receivers_NA,
1007     RtemsMessageReqBroadcast_Post_RecSize_NA,
1008     RtemsMessageReqBroadcast_Post_RecBuffer_NA },
1009   { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_InvAddr,
1010     RtemsMessageReqBroadcast_Post_Count_Nop,
1011     RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1012     RtemsMessageReqBroadcast_Post_Receivers_Nop,
1013     RtemsMessageReqBroadcast_Post_RecSize_Nop,
1014     RtemsMessageReqBroadcast_Post_RecBuffer_Nop },
1015   { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_InvId,
1016     RtemsMessageReqBroadcast_Post_Count_Nop,
1017     RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1018     RtemsMessageReqBroadcast_Post_Receivers_NA,
1019     RtemsMessageReqBroadcast_Post_RecSize_NA,
1020     RtemsMessageReqBroadcast_Post_RecBuffer_NA },
1021   { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_Ok,
1022     RtemsMessageReqBroadcast_Post_Count_Zero,
1023     RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1024     RtemsMessageReqBroadcast_Post_Receivers_NA,
1025     RtemsMessageReqBroadcast_Post_RecSize_NA,
1026     RtemsMessageReqBroadcast_Post_RecBuffer_NA },
1027   { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_InvId,
1028     RtemsMessageReqBroadcast_Post_Count_Nop,
1029     RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1030     RtemsMessageReqBroadcast_Post_Receivers_Nop,
1031     RtemsMessageReqBroadcast_Post_RecSize_Nop,
1032     RtemsMessageReqBroadcast_Post_RecBuffer_Nop },
1033   { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_Ok,
1034     RtemsMessageReqBroadcast_Post_Count_Set,
1035     RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1036     RtemsMessageReqBroadcast_Post_Receivers_Unblocked,
1037     RtemsMessageReqBroadcast_Post_RecSize_Message,
1038     RtemsMessageReqBroadcast_Post_RecBuffer_Message },
1039   { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_InvSize,
1040     RtemsMessageReqBroadcast_Post_Count_Nop,
1041     RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1042     RtemsMessageReqBroadcast_Post_Receivers_NA,
1043     RtemsMessageReqBroadcast_Post_RecSize_NA,
1044     RtemsMessageReqBroadcast_Post_RecBuffer_NA },
1045   { 0, 0, 0, 0, 0, 0, 0, 0, RtemsMessageReqBroadcast_Post_Status_InvSize,
1046     RtemsMessageReqBroadcast_Post_Count_Nop,
1047     RtemsMessageReqBroadcast_Post_MsgQueue_Nop,
1048     RtemsMessageReqBroadcast_Post_Receivers_Nop,
1049     RtemsMessageReqBroadcast_Post_RecSize_Nop,
1050     RtemsMessageReqBroadcast_Post_RecBuffer_Nop }
1051 };
1052 
1053 static const uint8_t
1054 RtemsMessageReqBroadcast_Map[] = {
1055   6, 4, 1, 4, 6, 4, 1, 4, 6, 4, 1, 4, 8, 7, 1, 7, 5, 3, 1, 3, 5, 3, 1, 3, 5, 3,
1056   1, 3, 5, 3, 1, 3, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0,
1057   2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0,
1058   1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0,
1059   2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0, 2, 0, 1, 0
1060 };
1061 
1062 static size_t RtemsMessageReqBroadcast_Scope( void *arg, char *buf, size_t n )
1063 {
1064   RtemsMessageReqBroadcast_Context *ctx;
1065 
1066   ctx = arg;
1067 
1068   if ( ctx->Map.in_action_loop ) {
1069     return T_get_scope(
1070       RtemsMessageReqBroadcast_PreDesc,
1071       buf,
1072       n,
1073       ctx->Map.pcs
1074     );
1075   }
1076 
1077   return 0;
1078 }
1079 
1080 static T_fixture RtemsMessageReqBroadcast_Fixture = {
1081   .setup = RtemsMessageReqBroadcast_Setup_Wrap,
1082   .stop = NULL,
1083   .teardown = RtemsMessageReqBroadcast_Teardown_Wrap,
1084   .scope = RtemsMessageReqBroadcast_Scope,
1085   .initial_context = &RtemsMessageReqBroadcast_Instance
1086 };
1087 
1088 static inline RtemsMessageReqBroadcast_Entry RtemsMessageReqBroadcast_PopEntry(
1089   RtemsMessageReqBroadcast_Context *ctx
1090 )
1091 {
1092   size_t index;
1093 
1094   index = ctx->Map.index;
1095   ctx->Map.index = index + 1;
1096   return RtemsMessageReqBroadcast_Entries[
1097     RtemsMessageReqBroadcast_Map[ index ]
1098   ];
1099 }
1100 
1101 static void RtemsMessageReqBroadcast_TestVariant(
1102   RtemsMessageReqBroadcast_Context *ctx
1103 )
1104 {
1105   RtemsMessageReqBroadcast_Pre_SendBuffer_Prepare( ctx, ctx->Map.pcs[ 0 ] );
1106   RtemsMessageReqBroadcast_Pre_Count_Prepare( ctx, ctx->Map.pcs[ 1 ] );
1107   RtemsMessageReqBroadcast_Pre_Id_Prepare( ctx, ctx->Map.pcs[ 2 ] );
1108   RtemsMessageReqBroadcast_Pre_MsgSize_Prepare( ctx, ctx->Map.pcs[ 3 ] );
1109   RtemsMessageReqBroadcast_Pre_MsgQueue_Prepare( ctx, ctx->Map.pcs[ 4 ] );
1110   RtemsMessageReqBroadcast_Pre_Receivers_Prepare( ctx, ctx->Map.pcs[ 5 ] );
1111   RtemsMessageReqBroadcast_Pre_Storage_Prepare( ctx, ctx->Map.pcs[ 6 ] );
1112   RtemsMessageReqBroadcast_Action( ctx );
1113   RtemsMessageReqBroadcast_Post_Status_Check(
1114     ctx,
1115     ctx->Map.entry.Post_Status
1116   );
1117   RtemsMessageReqBroadcast_Post_Count_Check( ctx, ctx->Map.entry.Post_Count );
1118   RtemsMessageReqBroadcast_Post_MsgQueue_Check(
1119     ctx,
1120     ctx->Map.entry.Post_MsgQueue
1121   );
1122   RtemsMessageReqBroadcast_Post_Receivers_Check(
1123     ctx,
1124     ctx->Map.entry.Post_Receivers
1125   );
1126   RtemsMessageReqBroadcast_Post_RecSize_Check(
1127     ctx,
1128     ctx->Map.entry.Post_RecSize
1129   );
1130   RtemsMessageReqBroadcast_Post_RecBuffer_Check(
1131     ctx,
1132     ctx->Map.entry.Post_RecBuffer
1133   );
1134 }
1135 
1136 /**
1137  * @fn void T_case_body_RtemsMessageReqBroadcast( void )
1138  */
1139 T_TEST_CASE_FIXTURE(
1140   RtemsMessageReqBroadcast,
1141   &RtemsMessageReqBroadcast_Fixture
1142 )
1143 {
1144   RtemsMessageReqBroadcast_Context *ctx;
1145 
1146   ctx = T_fixture_context();
1147   ctx->Map.in_action_loop = true;
1148   ctx->Map.index = 0;
1149 
1150   for (
1151     ctx->Map.pcs[ 0 ] = RtemsMessageReqBroadcast_Pre_SendBuffer_Valid;
1152     ctx->Map.pcs[ 0 ] < RtemsMessageReqBroadcast_Pre_SendBuffer_NA;
1153     ++ctx->Map.pcs[ 0 ]
1154   ) {
1155     for (
1156       ctx->Map.pcs[ 1 ] = RtemsMessageReqBroadcast_Pre_Count_Valid;
1157       ctx->Map.pcs[ 1 ] < RtemsMessageReqBroadcast_Pre_Count_NA;
1158       ++ctx->Map.pcs[ 1 ]
1159     ) {
1160       for (
1161         ctx->Map.pcs[ 2 ] = RtemsMessageReqBroadcast_Pre_Id_Valid;
1162         ctx->Map.pcs[ 2 ] < RtemsMessageReqBroadcast_Pre_Id_NA;
1163         ++ctx->Map.pcs[ 2 ]
1164       ) {
1165         for (
1166           ctx->Map.pcs[ 3 ] = RtemsMessageReqBroadcast_Pre_MsgSize_Zero;
1167           ctx->Map.pcs[ 3 ] < RtemsMessageReqBroadcast_Pre_MsgSize_NA;
1168           ++ctx->Map.pcs[ 3 ]
1169         ) {
1170           for (
1171             ctx->Map.pcs[ 4 ] = RtemsMessageReqBroadcast_Pre_MsgQueue_Empty;
1172             ctx->Map.pcs[ 4 ] < RtemsMessageReqBroadcast_Pre_MsgQueue_NA;
1173             ++ctx->Map.pcs[ 4 ]
1174           ) {
1175             for (
1176               ctx->Map.pcs[ 5 ] = RtemsMessageReqBroadcast_Pre_Receivers_Waiting;
1177               ctx->Map.pcs[ 5 ] < RtemsMessageReqBroadcast_Pre_Receivers_NA;
1178               ++ctx->Map.pcs[ 5 ]
1179             ) {
1180               for (
1181                 ctx->Map.pcs[ 6 ] = RtemsMessageReqBroadcast_Pre_Storage_Nop;
1182                 ctx->Map.pcs[ 6 ] < RtemsMessageReqBroadcast_Pre_Storage_NA;
1183                 ++ctx->Map.pcs[ 6 ]
1184               ) {
1185                 ctx->Map.entry = RtemsMessageReqBroadcast_PopEntry( ctx );
1186 
1187                 if ( ctx->Map.entry.Skip ) {
1188                   continue;
1189                 }
1190 
1191                 RtemsMessageReqBroadcast_Prepare( ctx );
1192                 RtemsMessageReqBroadcast_TestVariant( ctx );
1193                 RtemsMessageReqBroadcast_Cleanup( ctx );
1194               }
1195             }
1196           }
1197         }
1198       }
1199     }
1200   }
1201 }
1202 
1203 /** @} */