Back to home page

LXR

 
 

    


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

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  *  COPYRIGHT (c) 1989-2011.
0005  *  On-Line Applications Research Corporation (OAR).
0006  *
0007  * Redistribution and use in source and binary forms, with or without
0008  * modification, are permitted provided that the following conditions
0009  * are met:
0010  * 1. Redistributions of source code must retain the above copyright
0011  *    notice, this list of conditions and the following disclaimer.
0012  * 2. Redistributions in binary form must reproduce the above copyright
0013  *    notice, this list of conditions and the following disclaimer in the
0014  *    documentation and/or other materials provided with the distribution.
0015  *
0016  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0017  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0018  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0019  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0020  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0021  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0022  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0023  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0024  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0025  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0026  * POSSIBILITY OF SUCH DAMAGE.
0027  */
0028 
0029 #ifdef HAVE_CONFIG_H
0030 #include "config.h"
0031 #endif
0032 
0033 #include <tmacros.h>  /* includes bsp.h, stdio, etc... */
0034 
0035 const char rtems_test_name[] = "SP 33";
0036 
0037 /* prototype */
0038 rtems_task Init (rtems_task_argument ignored);
0039 
0040 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0041 
0042 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0043 
0044 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0045 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0046 #define CONFIGURE_MAXIMUM_TASKS     5
0047 #define CONFIGURE_MAXIMUM_BARRIERS  1
0048 
0049 #define CONFIGURE_INIT
0050 
0051 rtems_task Waiter(
0052   rtems_task_argument number
0053 );
0054 
0055 rtems_id    Barrier;
0056 
0057 int SuccessfulCase;
0058 int DeletedCase;
0059 
0060 rtems_task Waiter(
0061   rtems_task_argument number
0062 )
0063 {
0064   rtems_status_code status;
0065   int               waiter = (int) number;
0066 
0067   printf( "Waiter %d waiting on barrier\n", waiter );
0068   status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0069 
0070   printf( "Waiter %d back from barrier\n", waiter );
0071 
0072   if ( SuccessfulCase == TRUE ) {
0073     directive_failed(status, "rtems_barrier_wait");
0074   } else if ( DeletedCase == TRUE ) {
0075     fatal_directive_status(
0076       status,
0077       RTEMS_OBJECT_WAS_DELETED,
0078       "rtems_barrier_wait did not get deleted"
0079     );
0080   }
0081 
0082   rtems_task_exit();
0083 }
0084 
0085 #include <rtems/confdefs.h>
0086 
0087 rtems_task Init(
0088   rtems_task_argument ignored
0089 )
0090 {
0091   rtems_status_code status;
0092   rtems_name        name = rtems_build_name('B','A','R','1');
0093   uint32_t          released;
0094   rtems_id          testId;
0095   rtems_id          Tasks[CONFIGURE_MAXIMUM_TASKS-1];
0096   uint32_t          i;
0097 
0098   TEST_BEGIN();
0099 
0100   /* Check bad argument cases */
0101   puts( "rtems_barrier_delete - bad id - INVALID_ID" );
0102   status = rtems_barrier_delete( 100 );
0103   fatal_directive_status(
0104     status,
0105     RTEMS_INVALID_ID,
0106     "rtems_barrier_delete did not return RTEMS_INVALID_ID"
0107   );
0108 
0109   puts( "rtems_barrier_release - bad id - INVALID_ID" );
0110   status = rtems_barrier_release( 100, &released );
0111   fatal_directive_status(
0112     status,
0113     RTEMS_INVALID_ID,
0114     "rtems_barrier_release did not return RTEMS_INVALID_ID"
0115   );
0116 
0117   puts( "rtems_barrier_wait - bad id - INVALID_ID" );
0118   status = rtems_barrier_wait( 100, 10 );
0119   fatal_directive_status(
0120     status,
0121     RTEMS_INVALID_ID,
0122     "rtems_barrier_wait did not return RTEMS_INVALID_ID"
0123   );
0124 
0125   /* Create barrier with automatic release and 0 maximum waiters */
0126   puts( "Create barrier with automatic release and 0 max waiters" );
0127   status = rtems_barrier_create(
0128     name, RTEMS_BARRIER_AUTOMATIC_RELEASE, 0, &Barrier
0129   );
0130   fatal_directive_status(
0131     status,
0132     RTEMS_INVALID_NUMBER,
0133     "rtems_barrier_create did not return RTEMS_INVALID_NUMBER"
0134   );
0135 
0136   /* create barrier with bad name */
0137   puts( "rtems_barrier_create - bad name - INVALID_NAME" );
0138   status = rtems_barrier_create(
0139     0, RTEMS_BARRIER_AUTOMATIC_RELEASE, 1, &Barrier);
0140   fatal_directive_status(
0141     status,
0142     RTEMS_INVALID_NAME,
0143     "rtems_barrier_create did not return RTEMS_INVALID_NAME"
0144   );
0145 
0146   /* create barrier with bad id return address */
0147   puts( "rtems_barrier_create - NULL barrier ID - INVALID_ADDRESS" );
0148   status = rtems_barrier_create(name, RTEMS_BARRIER_AUTOMATIC_RELEASE, 1, NULL);
0149   fatal_directive_status(
0150     status,
0151     RTEMS_INVALID_ADDRESS,
0152     "rtems_barrier_create did not return RTEMS_INVALID_ADDRESS"
0153   );
0154 
0155   /* Create barrier */
0156   puts( "rtems_barrier_create - OK" );
0157   status = rtems_barrier_create( name, RTEMS_DEFAULT_ATTRIBUTES, 0, &Barrier );
0158   directive_failed(status, "rtems_barrier_create");
0159 
0160   /* Check for creating too many */
0161   puts( "rtems_barrier_create - too many" );
0162   status = rtems_barrier_create( name, RTEMS_DEFAULT_ATTRIBUTES, 0, &Barrier );
0163   fatal_directive_status(
0164     status,
0165     RTEMS_TOO_MANY,
0166     "rtems_barrier_create did not return RTEMS_TOO_MANY"
0167   );
0168 
0169   puts( "Check barrier ident" );
0170   status = rtems_barrier_ident( name, &testId );
0171   directive_failed(status, "rtems_barrier_ident");
0172   if ( testId != Barrier ) {
0173     printf( "ERROR -- rtems_barrier_create -- did not get Id expected\n" );
0174     exit( 0 );
0175   }
0176 
0177   puts( "Wait on barrier w/timeout and TIMEOUT" );
0178   status = rtems_barrier_wait( Barrier, 25 );
0179   fatal_directive_status(
0180     status,
0181     RTEMS_TIMEOUT,
0182     "rtems_barrier_wait did not timeout"
0183   );
0184 
0185   /* Release with bad return pointer */
0186   puts( "rtems_barrier_release - NULL return count - INVALID_ADDRESS" );
0187   status = rtems_barrier_release( Barrier, NULL );
0188   fatal_directive_status(
0189     status,
0190     RTEMS_INVALID_ADDRESS,
0191     "rtems_barrier_release bad return pointer"
0192   );
0193 
0194   /* Release no tasks */
0195   status = rtems_barrier_release( Barrier, &released );
0196   directive_failed(status, "rtems_barrier_release");
0197   if ( released != 0 ) {
0198     printf(
0199       "ERROR -- rtems_barrier_release -- released != 0, = %" PRIu32,
0200       released
0201     );
0202     rtems_test_exit(0);
0203   }
0204 
0205   /*  Create some tasks to wait for the barrier */
0206   SuccessfulCase = TRUE;
0207   DeletedCase    = FALSE;
0208   puts( "\n*** Testing manual release of barrier ***" );
0209   for (i=0 ; i<(CONFIGURE_MAXIMUM_TASKS-1) ; i++) {
0210     status = rtems_task_create(
0211       rtems_build_name('W','A','I','T'),
0212       1,
0213       RTEMS_MINIMUM_STACK_SIZE,
0214       RTEMS_DEFAULT_MODES,
0215       RTEMS_DEFAULT_ATTRIBUTES,
0216       &Tasks[ i ]
0217     );
0218     directive_failed( status, "rtems_task_create of Waiter" );
0219 
0220     status = rtems_task_start( Tasks[ i ], Waiter, i );
0221     directive_failed( status, "rtems_task_start of Waiter" );
0222   }
0223 
0224   puts( "Delay to let Waiters block" );
0225   status = rtems_task_wake_after( rtems_clock_get_ticks_per_second() );
0226   directive_failed(status, "rtems_task_wake_after");
0227 
0228   /* Release tasks which were waiting */
0229   puts( "Releasing tasks" );
0230   status = rtems_barrier_release( Barrier, &released );
0231   directive_failed(status, "rtems_barrier_release");
0232   if ( released != (CONFIGURE_MAXIMUM_TASKS-1) ) {
0233     printf(
0234       "ERROR -- rtems_barrier_release -- released != %d, = %" PRIu32,
0235       (CONFIGURE_MAXIMUM_TASKS-1),
0236       released
0237     );
0238     rtems_test_exit(0);
0239   }
0240 
0241   puts( "Delay to let Waiters print a message" );
0242   status = rtems_task_wake_after( rtems_clock_get_ticks_per_second() );
0243   directive_failed(status, "rtems_task_wake_after");
0244 
0245   /*  Create some tasks to wait for the barrier */
0246   SuccessfulCase = FALSE;
0247   DeletedCase    = TRUE;
0248   puts( "\n*** Testing Deletion of barrier ***" );
0249   for (i=0 ; i<(CONFIGURE_MAXIMUM_TASKS-1) ; i++) {
0250     status = rtems_task_create(
0251       rtems_build_name('W','A','I','T'),
0252       1,
0253       RTEMS_MINIMUM_STACK_SIZE,
0254       RTEMS_DEFAULT_MODES,
0255       RTEMS_DEFAULT_ATTRIBUTES,
0256       &Tasks[ i ]
0257     );
0258     directive_failed( status, "rtems_task_create of Waiter" );
0259 
0260     status = rtems_task_start( Tasks[ i ], Waiter, i );
0261     directive_failed( status, "rtems_task_start of Waiter" );
0262   }
0263 
0264   puts( "Delay to let Waiters block" );
0265   status = rtems_task_wake_after( rtems_clock_get_ticks_per_second() );
0266   directive_failed(status, "rtems_task_wake_after");
0267 
0268   puts( "rtems_barrier_delete - OK" );
0269   status = rtems_barrier_delete( Barrier );
0270   directive_failed(status, "rtems_barrier_delete");
0271 
0272   puts( "Delay to let Waiters print a message" );
0273   status = rtems_task_wake_after( rtems_clock_get_ticks_per_second() );
0274   directive_failed(status, "rtems_task_wake_after");
0275 
0276   /* Create barrier with automatic release */
0277   puts( "rtems_barrier_create - OK" );
0278   status = rtems_barrier_create(
0279     name, RTEMS_BARRIER_AUTOMATIC_RELEASE, CONFIGURE_MAXIMUM_TASKS-1, &Barrier
0280   );
0281   directive_failed(status, "rtems_barrier_create");
0282 
0283   /*  Create some tasks to wait for the barrier */
0284   SuccessfulCase = TRUE;
0285   DeletedCase    = FALSE;
0286   puts( "\n*** Testing automatic release of barrier ***" );
0287   for (i=0 ; i<(CONFIGURE_MAXIMUM_TASKS-1) ; i++) {
0288     status = rtems_task_create(
0289       rtems_build_name('W','A','I','T'),
0290       1,
0291       RTEMS_MINIMUM_STACK_SIZE,
0292       RTEMS_DEFAULT_MODES,
0293       RTEMS_DEFAULT_ATTRIBUTES,
0294       &Tasks[ i ]
0295     );
0296     directive_failed( status, "rtems_task_create of Waiter" );
0297 
0298     status = rtems_task_start( Tasks[ i ], Waiter, i );
0299     directive_failed( status, "rtems_task_start of Waiter" );
0300   }
0301 
0302   puts( "Delay to let task wait on barrier" );
0303   status = rtems_task_wake_after( rtems_clock_get_ticks_per_second() );
0304   directive_failed(status, "rtems_task_wake_after");
0305 
0306   /* the end */
0307   TEST_END();
0308   rtems_test_exit(0);
0309 }