Back to home page

LXR

 
 

    


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

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /*
0004  *  COPYRIGHT (c) 1989-2013.
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 #if !defined(OPERATION_COUNT)
0030 #define OPERATION_COUNT 100
0031 #endif
0032 
0033 #ifdef HAVE_CONFIG_H
0034 #include "config.h"
0035 #endif
0036 
0037 #include <errno.h>
0038 #include <fcntl.h>
0039 #include <semaphore.h>
0040 #include <tmacros.h>
0041 #include <timesys.h>
0042 #include <rtems/btimer.h>
0043 #include "test_support.h"
0044 #include <pthread.h>
0045 #include <sched.h>
0046 
0047 const char rtems_test_name[] = "PSXTMSEM 03";
0048 
0049 /* forward declarations to avoid warnings */
0050 void *POSIX_Init(void *argument);
0051 void *Middle(void *argument);
0052 void *Low(void *argument);
0053 
0054 #define MAX_SEMS  2
0055 
0056 sem_t  sem1;
0057 
0058 void *Low(
0059   void *argument
0060 )
0061 {
0062   benchmark_timer_t end_time;
0063 
0064   /*
0065    * Now we have finished the thread startup overhead,
0066    * so let other threads run.  When we return, we can
0067    * finish the benchmark.
0068    */
0069   sched_yield();
0070     /* let other threads run */
0071 
0072   end_time = benchmark_timer_read();
0073 
0074   put_time(
0075     "sem_wait: not available block",
0076     end_time,
0077     OPERATION_COUNT,
0078     0,
0079     0
0080   );
0081 
0082   TEST_END();
0083 
0084   rtems_test_exit( 0 );
0085   return NULL;
0086 }
0087 
0088 void *Middle(
0089   void *argument
0090 )
0091 {
0092   /*
0093    * Now we have finished the thread startup overhead,
0094    * so let other threads run.  When we return, we can
0095    * finish the benchmark.
0096    */
0097   sched_yield();
0098     /* let other threads run */
0099 
0100     (void) sem_wait( &sem1 );
0101     rtems_test_assert( FALSE );
0102   return NULL;
0103 }
0104 
0105 void *POSIX_Init(
0106   void *argument
0107 )
0108 {
0109   int        i;
0110   int        status;
0111   pthread_t  threadId;
0112 
0113   TEST_BEGIN();
0114 
0115   for ( i=0 ; i < OPERATION_COUNT - 1 ; i++ ) {
0116     status = pthread_create( &threadId, NULL, Middle, NULL );
0117     rtems_test_assert( status == 0 );
0118   }
0119 
0120   status = pthread_create( &threadId, NULL, Low, NULL );
0121   rtems_test_assert( status == 0 );
0122 
0123   /*
0124    * Deliberately create the semaphore after the threads.  This way if the
0125    * threads do run before we intend, they will get an error.
0126    */
0127     status = sem_init( &sem1, 0, 1 );
0128   rtems_test_assert( status == 0 );
0129 
0130   /*
0131    * Let the other threads start so the thread startup overhead,
0132    * is accounted for.  When we return, we can start the benchmark.
0133    */
0134   sched_yield();
0135     /* let other threads run */
0136 
0137   /* start the timer and switch through all the other tasks */
0138   benchmark_timer_initialize();
0139     status = sem_wait(&sem1);
0140   rtems_test_assert( status == 0 );
0141   return NULL;
0142 }
0143 
0144 /* configuration information */
0145 
0146 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0147 #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER
0148 
0149 #define CONFIGURE_MAXIMUM_POSIX_THREADS     OPERATION_COUNT + 2
0150 #define CONFIGURE_POSIX_INIT_THREAD_TABLE
0151 
0152 #define CONFIGURE_INIT
0153 
0154 #include <rtems/confdefs.h>
0155   /* end of file */