File indexing completed on 2025-05-11 08:24:41
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 #ifdef HAVE_CONFIG_H
0030 #include "config.h"
0031 #endif
0032
0033 #include <errno.h>
0034 #include <fcntl.h>
0035 #include <semaphore.h>
0036 #include <tmacros.h>
0037 #include <timesys.h>
0038 #include "test_support.h"
0039 #include <pthread.h>
0040 #include <sched.h>
0041 #include <rtems/btimer.h>
0042
0043 const char rtems_test_name[] = "PSXTMSEM 05";
0044
0045
0046 void *POSIX_Init(void *argument);
0047 void *Middle(void *argument);
0048 void *Low(void *argument);
0049
0050 #define MAX_SEMS 2
0051
0052 sem_t sem1;
0053
0054 void *Low(
0055 void *argument
0056 )
0057 {
0058 int status;
0059 benchmark_timer_t end_time;
0060
0061 status = sem_wait(&sem1);
0062 end_time = benchmark_timer_read();
0063
0064 rtems_test_assert( status == 0 );
0065
0066 put_time(
0067 "sem_post: thread waiting preempt",
0068 end_time,
0069 OPERATION_COUNT,
0070 0,
0071 0
0072 );
0073
0074 TEST_END();
0075 rtems_test_exit( 0 );
0076 return NULL;
0077 }
0078
0079 void *Middle(
0080 void *argument
0081 )
0082 {
0083 int status;
0084
0085 status = sem_wait(&sem1);
0086 rtems_test_assert( status == 0 );
0087
0088
0089
0090 status = sem_post(&sem1);
0091 rtems_test_assert( status == 0 );
0092
0093
0094
0095
0096 rtems_test_assert( FALSE );
0097 return NULL;
0098 }
0099
0100 void *POSIX_Init(
0101 void *argument
0102 )
0103 {
0104 int i;
0105 int status;
0106 pthread_t threadId;
0107 pthread_attr_t attr;
0108 struct sched_param param;
0109
0110 TEST_BEGIN();
0111
0112
0113
0114
0115
0116 status = sem_init( &sem1, 0, 1 );
0117 rtems_test_assert( status == 0 );
0118
0119
0120
0121
0122 status = sem_wait( &sem1 );
0123 rtems_test_assert( status == 0 );
0124
0125
0126
0127
0128 status = pthread_attr_init( &attr );
0129 rtems_test_assert( status == 0 );
0130
0131 status = pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
0132 rtems_test_assert( status == 0 );
0133
0134 status = pthread_attr_setschedpolicy( &attr, SCHED_RR );
0135 rtems_test_assert( status == 0 );
0136
0137 param.sched_priority = 2;
0138 status = pthread_attr_setschedparam( &attr, ¶m );
0139 rtems_test_assert( status == 0 );
0140
0141
0142
0143
0144
0145 for ( i=0 ; i < OPERATION_COUNT ; i++ ) {
0146
0147 param.sched_priority = 3 + i;
0148 status = pthread_attr_setschedparam( &attr, ¶m );
0149 rtems_test_assert( status == 0 );
0150
0151 status = pthread_create(
0152 &threadId,
0153 &attr,
0154 (i == OPERATION_COUNT - 1) ? Low : Middle,
0155 NULL
0156 );
0157 rtems_test_assert( status == 0 );
0158 }
0159
0160
0161
0162
0163
0164 benchmark_timer_initialize();
0165
0166 status = sem_post( &sem1 );
0167
0168
0169
0170 rtems_test_assert( FALSE );
0171 return NULL;
0172 }
0173
0174
0175
0176 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0177 #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER
0178
0179 #define CONFIGURE_MAXIMUM_POSIX_THREADS OPERATION_COUNT + 2
0180 #define CONFIGURE_POSIX_INIT_THREAD_TABLE
0181
0182 #define CONFIGURE_INIT
0183
0184 #include <rtems/confdefs.h>
0185