source: rtems/testsuites/validation/tc-message-performance.c @ 74a6b33f

Last change on this file since 74a6b33f was 74a6b33f, checked in by Sebastian Huber <sebastian.huber@…>, on 03/17/23 at 14:52:33

validation: Replace enum Event with defines

There is a Doxygen limitation that all compound names (enum, struct,
class, union, group) within a project must be unique.

Update #3716.

  • Property mode set to 100644
File size: 20.1 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 * @file
5 *
6 * @ingroup RtemsMessageValPerf
7 */
8
9/*
10 * Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 *    notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 *    notice, this list of conditions and the following disclaimer in the
19 *    documentation and/or other materials provided with the distribution.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/*
35 * This file is part of the RTEMS quality process and was automatically
36 * generated.  If you find something that needs to be fixed or
37 * worded better please post a report or patch to an RTEMS mailing list
38 * or raise a bug report:
39 *
40 * https://www.rtems.org/bugs.html
41 *
42 * For information on updating and regenerating please refer to the How-To
43 * section in the Software Requirements Engineering chapter of the
44 * RTEMS Software Engineering manual.  The manual is provided as a part of
45 * a release.  For development sources please refer to the online
46 * documentation at:
47 *
48 * https://docs.rtems.org
49 */
50
51#ifdef HAVE_CONFIG_H
52#include "config.h"
53#endif
54
55#include <rtems.h>
56
57#include "tx-support.h"
58
59#include <rtems/test.h>
60
61/**
62 * @defgroup RtemsMessageValPerf spec:/rtems/message/val/perf
63 *
64 * @ingroup TestsuitesPerformanceNoClock0
65 *
66 * @brief This test case provides a context to run @ref RTEMSAPIClassicMessage
67 *   performance tests.
68 *
69 * @{
70 */
71
72/**
73 * @brief Test context for spec:/rtems/message/val/perf test case.
74 */
75typedef struct {
76  /**
77   * @brief This member provides a message queue identifier.
78   */
79  rtems_id queue_id;
80
81  /**
82   * @brief This member provides a message to send.
83   */
84  long message;
85
86  /**
87   * @brief This member provides a worker identifier.
88   */
89  rtems_id worker_id;
90
91  /**
92   * @brief This member provides a status code.
93   */
94  rtems_status_code status;
95
96  /**
97   * @brief This member references the measure runtime context.
98   */
99  T_measure_runtime_context *context;
100
101  /**
102   * @brief This member provides the measure runtime request.
103   */
104  T_measure_runtime_request request;
105
106  /**
107   * @brief This member provides an optional measurement begin time point.
108   */
109  T_ticks begin;
110
111  /**
112   * @brief This member provides an optional measurement end time point.
113   */
114  T_ticks end;
115} RtemsMessageValPerf_Context;
116
117static RtemsMessageValPerf_Context
118  RtemsMessageValPerf_Instance;
119
120#define MAXIMUM_PENDING_MESSAGES 1
121
122#define MAXIMUM_MESSAGE_SIZE 8
123
124#define EVENT_END RTEMS_EVENT_0
125
126#define EVENT_SEND RTEMS_EVENT_1
127
128#define EVENT_SEND_END RTEMS_EVENT_2
129
130#define EVENT_RECEIVE RTEMS_EVENT_3
131
132#define EVENT_RECEIVE_END RTEMS_EVENT_4
133
134typedef RtemsMessageValPerf_Context Context;
135
136static RTEMS_MESSAGE_QUEUE_BUFFER( MAXIMUM_MESSAGE_SIZE )
137  storage_area[ MAXIMUM_PENDING_MESSAGES ];
138
139rtems_message_queue_config config = {
140  .name = OBJECT_NAME,
141  .maximum_pending_messages = MAXIMUM_PENDING_MESSAGES,
142  .maximum_message_size = MAXIMUM_MESSAGE_SIZE,
143  .storage_area = storage_area,
144  .storage_size = sizeof( storage_area )
145};
146
147static void Send( const Context *ctx, rtems_event_set events )
148{
149  SendEvents( ctx->worker_id, events );
150}
151
152static void Worker( rtems_task_argument arg )
153{
154  Context *ctx;
155
156  ctx = (Context *) arg;
157
158  while ( true ) {
159    rtems_event_set   events;
160    rtems_status_code sc;
161    T_ticks           ticks;
162
163    sc = rtems_event_receive(
164      RTEMS_ALL_EVENTS,
165      RTEMS_EVENT_ANY | RTEMS_WAIT,
166      RTEMS_NO_TIMEOUT,
167      &events
168    );
169    ticks = T_tick();
170    T_quiet_rsc_success( sc );
171
172    if ( ( events & EVENT_END ) != 0 ) {
173      ctx->end = ticks;
174    }
175
176    if ( ( events & EVENT_SEND ) != 0 ) {
177      sc = rtems_message_queue_send(
178        ctx->queue_id,
179        &ctx->message,
180        sizeof( ctx->message )
181      );
182      ticks = T_tick();
183      T_quiet_rsc_success( sc );
184
185      if ( ( events & EVENT_SEND_END ) != 0 ) {
186        ctx->end = ticks;
187      }
188    }
189
190    if ( ( events & EVENT_RECEIVE ) != 0 ) {
191      long   message;
192      size_t size;
193
194      sc = rtems_message_queue_receive(
195        ctx->queue_id,
196        &message,
197        &size,
198        RTEMS_WAIT,
199        RTEMS_NO_TIMEOUT
200      );
201      ticks = T_tick();
202      T_quiet_rsc_success( sc );
203
204      if ( ( events & EVENT_RECEIVE_END ) != 0 ) {
205        ctx->end = ticks;
206      }
207    }
208  }
209}
210
211static void RtemsMessageValPerf_Setup_Context(
212  RtemsMessageValPerf_Context *ctx
213)
214{
215  T_measure_runtime_config config;
216
217  memset( &config, 0, sizeof( config ) );
218  config.sample_count = 100;
219  ctx->request.arg = ctx;
220  ctx->request.flags = T_MEASURE_RUNTIME_REPORT_SAMPLES;
221  ctx->context = T_measure_runtime_create( &config );
222  T_assert_not_null( ctx->context );
223}
224
225/**
226 * @brief Create a message queue and a worker task.
227 */
228static void RtemsMessageValPerf_Setup( RtemsMessageValPerf_Context *ctx )
229{
230  rtems_status_code sc;
231
232  SetSelfPriority( PRIO_NORMAL );
233
234  sc = rtems_message_queue_construct( &config, &ctx->queue_id );
235  T_rsc_success( sc );
236
237  ctx->worker_id = CreateTask( "WORK", PRIO_HIGH );
238  StartTask( ctx->worker_id, Worker, ctx );
239}
240
241static void RtemsMessageValPerf_Setup_Wrap( void *arg )
242{
243  RtemsMessageValPerf_Context *ctx;
244
245  ctx = arg;
246  RtemsMessageValPerf_Setup_Context( ctx );
247  RtemsMessageValPerf_Setup( ctx );
248}
249
250/**
251 * @brief Delete the worker task and the message queue.
252 */
253static void RtemsMessageValPerf_Teardown( RtemsMessageValPerf_Context *ctx )
254{
255  rtems_status_code sc;
256
257  DeleteTask( ctx->worker_id );
258
259  sc = rtems_message_queue_delete( ctx->queue_id );
260  T_rsc_success( sc );
261
262  RestoreRunnerPriority();
263}
264
265static void RtemsMessageValPerf_Teardown_Wrap( void *arg )
266{
267  RtemsMessageValPerf_Context *ctx;
268
269  ctx = arg;
270  RtemsMessageValPerf_Teardown( ctx );
271}
272
273static T_fixture RtemsMessageValPerf_Fixture = {
274  .setup = RtemsMessageValPerf_Setup_Wrap,
275  .stop = NULL,
276  .teardown = RtemsMessageValPerf_Teardown_Wrap,
277  .scope = NULL,
278  .initial_context = &RtemsMessageValPerf_Instance
279};
280
281/**
282 * @brief Try to receive a message.
283 */
284static void RtemsMessageReqPerfReceiveTry_Body(
285  RtemsMessageValPerf_Context *ctx
286)
287{
288  uint64_t message;
289  size_t   size;
290
291  ctx->status = rtems_message_queue_receive(
292    ctx->queue_id,
293    &message,
294    &size,
295    RTEMS_NO_WAIT,
296    0
297  );
298}
299
300static void RtemsMessageReqPerfReceiveTry_Body_Wrap( void *arg )
301{
302  RtemsMessageValPerf_Context *ctx;
303
304  ctx = arg;
305  RtemsMessageReqPerfReceiveTry_Body( ctx );
306}
307
308/**
309 * @brief Discard samples interrupted by a clock tick.
310 */
311static bool RtemsMessageReqPerfReceiveTry_Teardown(
312  RtemsMessageValPerf_Context *ctx,
313  T_ticks                     *delta,
314  uint32_t                     tic,
315  uint32_t                     toc,
316  unsigned int                 retry
317)
318{
319  T_quiet_rsc( ctx->status, RTEMS_UNSATISFIED );
320
321  return tic == toc;
322}
323
324static bool RtemsMessageReqPerfReceiveTry_Teardown_Wrap(
325  void        *arg,
326  T_ticks     *delta,
327  uint32_t     tic,
328  uint32_t     toc,
329  unsigned int retry
330)
331{
332  RtemsMessageValPerf_Context *ctx;
333
334  ctx = arg;
335  return RtemsMessageReqPerfReceiveTry_Teardown( ctx, delta, tic, toc, retry );
336}
337
338/**
339 * @brief Schedule a message send.
340 */
341static void RtemsMessageReqPerfReceiveWaitForever_Setup(
342  RtemsMessageValPerf_Context *ctx
343)
344{
345  SetPriority( ctx->worker_id, PRIO_LOW );
346  Send( ctx, EVENT_END | EVENT_SEND );
347}
348
349static void RtemsMessageReqPerfReceiveWaitForever_Setup_Wrap( void *arg )
350{
351  RtemsMessageValPerf_Context *ctx;
352
353  ctx = arg;
354  RtemsMessageReqPerfReceiveWaitForever_Setup( ctx );
355}
356
357/**
358 * @brief Receive a message.  Wait forever.
359 */
360static void RtemsMessageReqPerfReceiveWaitForever_Body(
361  RtemsMessageValPerf_Context *ctx
362)
363{
364  uint64_t message;
365  size_t   size;
366
367  ctx->begin = T_tick();
368  ctx->status = rtems_message_queue_receive(
369    ctx->queue_id,
370    &message,
371    &size,
372    RTEMS_WAIT,
373    RTEMS_NO_TIMEOUT
374  );
375}
376
377static void RtemsMessageReqPerfReceiveWaitForever_Body_Wrap( void *arg )
378{
379  RtemsMessageValPerf_Context *ctx;
380
381  ctx = arg;
382  RtemsMessageReqPerfReceiveWaitForever_Body( ctx );
383}
384
385/**
386 * @brief Set the measured runtime.  Restore the worker priority.  Discard
387 *   samples interrupted by a clock tick.
388 */
389static bool RtemsMessageReqPerfReceiveWaitForever_Teardown(
390  RtemsMessageValPerf_Context *ctx,
391  T_ticks                     *delta,
392  uint32_t                     tic,
393  uint32_t                     toc,
394  unsigned int                 retry
395)
396{
397  T_quiet_rsc_success( ctx->status );
398
399  *delta = ctx->end - ctx->begin;
400  SetPriority( ctx->worker_id, PRIO_HIGH );
401
402  return tic == toc;
403}
404
405static bool RtemsMessageReqPerfReceiveWaitForever_Teardown_Wrap(
406  void        *arg,
407  T_ticks     *delta,
408  uint32_t     tic,
409  uint32_t     toc,
410  unsigned int retry
411)
412{
413  RtemsMessageValPerf_Context *ctx;
414
415  ctx = arg;
416  return RtemsMessageReqPerfReceiveWaitForever_Teardown(
417    ctx,
418    delta,
419    tic,
420    toc,
421    retry
422  );
423}
424
425/**
426 * @brief Schedule a message send.
427 */
428static void RtemsMessageReqPerfReceiveWaitTimed_Setup(
429  RtemsMessageValPerf_Context *ctx
430)
431{
432  SetPriority( ctx->worker_id, PRIO_LOW );
433  Send( ctx, EVENT_END | EVENT_SEND );
434}
435
436static void RtemsMessageReqPerfReceiveWaitTimed_Setup_Wrap( void *arg )
437{
438  RtemsMessageValPerf_Context *ctx;
439
440  ctx = arg;
441  RtemsMessageReqPerfReceiveWaitTimed_Setup( ctx );
442}
443
444/**
445 * @brief Receive a message.  Wait with a timeout.
446 */
447static void RtemsMessageReqPerfReceiveWaitTimed_Body(
448  RtemsMessageValPerf_Context *ctx
449)
450{
451  uint64_t message;
452  size_t   size;
453
454  ctx->begin = T_tick();
455  ctx->status = rtems_message_queue_receive(
456    ctx->queue_id,
457    &message,
458    &size,
459    RTEMS_WAIT,
460    UINT32_MAX
461  );
462}
463
464static void RtemsMessageReqPerfReceiveWaitTimed_Body_Wrap( void *arg )
465{
466  RtemsMessageValPerf_Context *ctx;
467
468  ctx = arg;
469  RtemsMessageReqPerfReceiveWaitTimed_Body( ctx );
470}
471
472/**
473 * @brief Set the measured runtime.  Restore the worker priority.  Discard
474 *   samples interrupted by a clock tick.
475 */
476static bool RtemsMessageReqPerfReceiveWaitTimed_Teardown(
477  RtemsMessageValPerf_Context *ctx,
478  T_ticks                     *delta,
479  uint32_t                     tic,
480  uint32_t                     toc,
481  unsigned int                 retry
482)
483{
484  T_quiet_rsc_success( ctx->status );
485
486  *delta = ctx->end - ctx->begin;
487  SetPriority( ctx->worker_id, PRIO_HIGH );
488
489  return tic == toc;
490}
491
492static bool RtemsMessageReqPerfReceiveWaitTimed_Teardown_Wrap(
493  void        *arg,
494  T_ticks     *delta,
495  uint32_t     tic,
496  uint32_t     toc,
497  unsigned int retry
498)
499{
500  RtemsMessageValPerf_Context *ctx;
501
502  ctx = arg;
503  return RtemsMessageReqPerfReceiveWaitTimed_Teardown(
504    ctx,
505    delta,
506    tic,
507    toc,
508    retry
509  );
510}
511
512/**
513 * @brief Send a message.
514 */
515static void RtemsMessageReqPerfSend_Body( RtemsMessageValPerf_Context *ctx )
516{
517  ctx->status = rtems_message_queue_send(
518    ctx->queue_id,
519    &ctx->message,
520    sizeof( ctx->message )
521  );
522}
523
524static void RtemsMessageReqPerfSend_Body_Wrap( void *arg )
525{
526  RtemsMessageValPerf_Context *ctx;
527
528  ctx = arg;
529  RtemsMessageReqPerfSend_Body( ctx );
530}
531
532/**
533 * @brief Flush the message queue.  Discard samples interrupted by a clock
534 *   tick.
535 */
536static bool RtemsMessageReqPerfSend_Teardown(
537  RtemsMessageValPerf_Context *ctx,
538  T_ticks                     *delta,
539  uint32_t                     tic,
540  uint32_t                     toc,
541  unsigned int                 retry
542)
543{
544  rtems_status_code sc;
545  uint32_t          count;
546
547  T_quiet_rsc_success( ctx->status );
548
549  sc = rtems_message_queue_flush( ctx->queue_id, &count );
550  T_quiet_rsc_success( sc );
551  T_quiet_eq_u32( count, 1 );
552
553  return tic == toc;
554}
555
556static bool RtemsMessageReqPerfSend_Teardown_Wrap(
557  void        *arg,
558  T_ticks     *delta,
559  uint32_t     tic,
560  uint32_t     toc,
561  unsigned int retry
562)
563{
564  RtemsMessageValPerf_Context *ctx;
565
566  ctx = arg;
567  return RtemsMessageReqPerfSend_Teardown( ctx, delta, tic, toc, retry );
568}
569
570/**
571 * @brief Let the worker wait on the message queue.
572 */
573static void RtemsMessageReqPerfSendOther_Setup(
574  RtemsMessageValPerf_Context *ctx
575)
576{
577  Send( ctx, EVENT_RECEIVE );
578  SetPriority( ctx->worker_id, PRIO_LOW );
579}
580
581static void RtemsMessageReqPerfSendOther_Setup_Wrap( void *arg )
582{
583  RtemsMessageValPerf_Context *ctx;
584
585  ctx = arg;
586  RtemsMessageReqPerfSendOther_Setup( ctx );
587}
588
589/**
590 * @brief Send a message.
591 */
592static void RtemsMessageReqPerfSendOther_Body(
593  RtemsMessageValPerf_Context *ctx
594)
595{
596  ctx->status = rtems_message_queue_send(
597    ctx->queue_id,
598    &ctx->message,
599    sizeof( ctx->message )
600  );
601}
602
603static void RtemsMessageReqPerfSendOther_Body_Wrap( void *arg )
604{
605  RtemsMessageValPerf_Context *ctx;
606
607  ctx = arg;
608  RtemsMessageReqPerfSendOther_Body( ctx );
609}
610
611/**
612 * @brief Restore the worker priority.  Discard samples interrupted by a clock
613 *   tick.
614 */
615static bool RtemsMessageReqPerfSendOther_Teardown(
616  RtemsMessageValPerf_Context *ctx,
617  T_ticks                     *delta,
618  uint32_t                     tic,
619  uint32_t                     toc,
620  unsigned int                 retry
621)
622{
623  T_quiet_rsc_success( ctx->status );
624
625  SetPriority( ctx->worker_id, PRIO_HIGH );
626
627  return tic == toc;
628}
629
630static bool RtemsMessageReqPerfSendOther_Teardown_Wrap(
631  void        *arg,
632  T_ticks     *delta,
633  uint32_t     tic,
634  uint32_t     toc,
635  unsigned int retry
636)
637{
638  RtemsMessageValPerf_Context *ctx;
639
640  ctx = arg;
641  return RtemsMessageReqPerfSendOther_Teardown( ctx, delta, tic, toc, retry );
642}
643
644#if defined(RTEMS_SMP)
645/**
646 * @brief Move worker to scheduler B.
647 */
648static void RtemsMessageReqPerfSendOtherCpu_Prepare(
649  RtemsMessageValPerf_Context *ctx
650)
651{
652  SetScheduler( ctx->worker_id, SCHEDULER_B_ID, PRIO_NORMAL );
653}
654
655/**
656 * @brief Let the worker wait on the message queue.
657 */
658static void RtemsMessageReqPerfSendOtherCpu_Setup(
659  RtemsMessageValPerf_Context *ctx
660)
661{
662  Send( ctx, EVENT_RECEIVE | EVENT_RECEIVE_END );
663  WaitForNextTask( 1, ctx->worker_id );
664}
665
666static void RtemsMessageReqPerfSendOtherCpu_Setup_Wrap( void *arg )
667{
668  RtemsMessageValPerf_Context *ctx;
669
670  ctx = arg;
671  RtemsMessageReqPerfSendOtherCpu_Setup( ctx );
672}
673
674/**
675 * @brief Send a message.
676 */
677static void RtemsMessageReqPerfSendOtherCpu_Body(
678  RtemsMessageValPerf_Context *ctx
679)
680{
681  ctx->begin = T_tick();
682  ctx->status = rtems_message_queue_send(
683    ctx->queue_id,
684    &ctx->message,
685    sizeof( ctx->message )
686  );
687}
688
689static void RtemsMessageReqPerfSendOtherCpu_Body_Wrap( void *arg )
690{
691  RtemsMessageValPerf_Context *ctx;
692
693  ctx = arg;
694  RtemsMessageReqPerfSendOtherCpu_Body( ctx );
695}
696
697/**
698 * @brief Make sure the worker waits for the next event.  Set the measured
699 *   runtime. Discard samples interrupted by a clock tick.
700 */
701static bool RtemsMessageReqPerfSendOtherCpu_Teardown(
702  RtemsMessageValPerf_Context *ctx,
703  T_ticks                     *delta,
704  uint32_t                     tic,
705  uint32_t                     toc,
706  unsigned int                 retry
707)
708{
709  T_quiet_rsc_success( ctx->status );
710
711  WaitForNextTask( 1, ctx->worker_id );
712  *delta = ctx->end - ctx->begin;
713
714  return tic == toc;
715}
716
717static bool RtemsMessageReqPerfSendOtherCpu_Teardown_Wrap(
718  void        *arg,
719  T_ticks     *delta,
720  uint32_t     tic,
721  uint32_t     toc,
722  unsigned int retry
723)
724{
725  RtemsMessageValPerf_Context *ctx;
726
727  ctx = arg;
728  return RtemsMessageReqPerfSendOtherCpu_Teardown(
729    ctx,
730    delta,
731    tic,
732    toc,
733    retry
734  );
735}
736
737/**
738 * @brief Move worker to scheduler A.
739 */
740static void RtemsMessageReqPerfSendOtherCpu_Cleanup(
741  RtemsMessageValPerf_Context *ctx
742)
743{
744  SetScheduler( ctx->worker_id, SCHEDULER_A_ID, PRIO_HIGH );
745}
746#endif
747
748/**
749 * @brief Let the worker wait on the message queue.
750 */
751static void RtemsMessageReqPerfSendPreempt_Setup(
752  RtemsMessageValPerf_Context *ctx
753)
754{
755  Send( ctx, EVENT_RECEIVE | EVENT_RECEIVE_END );
756}
757
758static void RtemsMessageReqPerfSendPreempt_Setup_Wrap( void *arg )
759{
760  RtemsMessageValPerf_Context *ctx;
761
762  ctx = arg;
763  RtemsMessageReqPerfSendPreempt_Setup( ctx );
764}
765
766/**
767 * @brief Send a message.
768 */
769static void RtemsMessageReqPerfSendPreempt_Body(
770  RtemsMessageValPerf_Context *ctx
771)
772{
773  ctx->begin = T_tick();
774  ctx->status = rtems_message_queue_send(
775    ctx->queue_id,
776    &ctx->message,
777    sizeof( ctx->message )
778  );
779}
780
781static void RtemsMessageReqPerfSendPreempt_Body_Wrap( void *arg )
782{
783  RtemsMessageValPerf_Context *ctx;
784
785  ctx = arg;
786  RtemsMessageReqPerfSendPreempt_Body( ctx );
787}
788
789/**
790 * @brief Set the measured runtime.  Discard samples interrupted by a clock
791 *   tick.
792 */
793static bool RtemsMessageReqPerfSendPreempt_Teardown(
794  RtemsMessageValPerf_Context *ctx,
795  T_ticks                     *delta,
796  uint32_t                     tic,
797  uint32_t                     toc,
798  unsigned int                 retry
799)
800{
801  T_quiet_rsc_success( ctx->status );
802
803  *delta = ctx->end - ctx->begin;
804
805  return tic == toc;
806}
807
808static bool RtemsMessageReqPerfSendPreempt_Teardown_Wrap(
809  void        *arg,
810  T_ticks     *delta,
811  uint32_t     tic,
812  uint32_t     toc,
813  unsigned int retry
814)
815{
816  RtemsMessageValPerf_Context *ctx;
817
818  ctx = arg;
819  return RtemsMessageReqPerfSendPreempt_Teardown(
820    ctx,
821    delta,
822    tic,
823    toc,
824    retry
825  );
826}
827
828/**
829 * @fn void T_case_body_RtemsMessageValPerf( void )
830 */
831T_TEST_CASE_FIXTURE( RtemsMessageValPerf, &RtemsMessageValPerf_Fixture )
832{
833  RtemsMessageValPerf_Context *ctx;
834
835  ctx = T_fixture_context();
836
837  ctx->request.name = "RtemsMessageReqPerfReceiveTry";
838  ctx->request.setup = NULL;
839  ctx->request.body = RtemsMessageReqPerfReceiveTry_Body_Wrap;
840  ctx->request.teardown = RtemsMessageReqPerfReceiveTry_Teardown_Wrap;
841  T_measure_runtime( ctx->context, &ctx->request );
842
843  ctx->request.name = "RtemsMessageReqPerfReceiveWaitForever";
844  ctx->request.setup = RtemsMessageReqPerfReceiveWaitForever_Setup_Wrap;
845  ctx->request.body = RtemsMessageReqPerfReceiveWaitForever_Body_Wrap;
846  ctx->request.teardown = RtemsMessageReqPerfReceiveWaitForever_Teardown_Wrap;
847  T_measure_runtime( ctx->context, &ctx->request );
848
849  ctx->request.name = "RtemsMessageReqPerfReceiveWaitTimed";
850  ctx->request.setup = RtemsMessageReqPerfReceiveWaitTimed_Setup_Wrap;
851  ctx->request.body = RtemsMessageReqPerfReceiveWaitTimed_Body_Wrap;
852  ctx->request.teardown = RtemsMessageReqPerfReceiveWaitTimed_Teardown_Wrap;
853  T_measure_runtime( ctx->context, &ctx->request );
854
855  ctx->request.name = "RtemsMessageReqPerfSend";
856  ctx->request.setup = NULL;
857  ctx->request.body = RtemsMessageReqPerfSend_Body_Wrap;
858  ctx->request.teardown = RtemsMessageReqPerfSend_Teardown_Wrap;
859  T_measure_runtime( ctx->context, &ctx->request );
860
861  ctx->request.name = "RtemsMessageReqPerfSendOther";
862  ctx->request.setup = RtemsMessageReqPerfSendOther_Setup_Wrap;
863  ctx->request.body = RtemsMessageReqPerfSendOther_Body_Wrap;
864  ctx->request.teardown = RtemsMessageReqPerfSendOther_Teardown_Wrap;
865  T_measure_runtime( ctx->context, &ctx->request );
866
867  #if defined(RTEMS_SMP)
868  RtemsMessageReqPerfSendOtherCpu_Prepare( ctx );
869  ctx->request.name = "RtemsMessageReqPerfSendOtherCpu";
870  ctx->request.setup = RtemsMessageReqPerfSendOtherCpu_Setup_Wrap;
871  ctx->request.body = RtemsMessageReqPerfSendOtherCpu_Body_Wrap;
872  ctx->request.teardown = RtemsMessageReqPerfSendOtherCpu_Teardown_Wrap;
873  T_measure_runtime( ctx->context, &ctx->request );
874  RtemsMessageReqPerfSendOtherCpu_Cleanup( ctx );
875  #endif
876
877  ctx->request.name = "RtemsMessageReqPerfSendPreempt";
878  ctx->request.setup = RtemsMessageReqPerfSendPreempt_Setup_Wrap;
879  ctx->request.body = RtemsMessageReqPerfSendPreempt_Body_Wrap;
880  ctx->request.teardown = RtemsMessageReqPerfSendPreempt_Teardown_Wrap;
881  T_measure_runtime( ctx->context, &ctx->request );
882}
883
884/** @} */
Note: See TracBrowser for help on using the repository browser.