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