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