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 #define N 5
0041
0042 const char rtems_test_name[] = "PSXTMCOND 06";
0043
0044
0045 void *POSIX_Init(void *argument);
0046 void *Blocker(void *argument);
0047
0048 pthread_mutex_t MutexID;
0049 pthread_cond_t CondID;
0050
0051 void *Blocker(
0052 void *argument
0053 )
0054 {
0055 int status;
0056
0057 status = pthread_mutex_lock(&MutexID);
0058 rtems_test_assert( status == 0 );
0059
0060
0061 pthread_cond_wait(&CondID,&MutexID);
0062
0063
0064 rtems_test_assert( FALSE );
0065
0066 return NULL;
0067 }
0068
0069 void *POSIX_Init(
0070 void *argument
0071 )
0072 {
0073 uint32_t end_time;
0074 int status;
0075 int i;
0076 pthread_t threadId;
0077 pthread_attr_t attr;
0078 struct sched_param param;
0079 int policy;
0080
0081 TEST_BEGIN();
0082
0083
0084 status = pthread_create( &threadId, NULL, Blocker, NULL );
0085 rtems_test_assert( status == 0 );
0086 status = pthread_mutex_init(&MutexID, NULL);
0087 rtems_test_assert( status == 0 );
0088 status = pthread_cond_init(&CondID, NULL);
0089 rtems_test_assert( status == 0 );
0090
0091
0092
0093
0094 status = pthread_attr_init( &attr );
0095 rtems_test_assert( status == 0 );
0096 status = pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED );
0097 rtems_test_assert( status == 0 );
0098 status = pthread_attr_setschedpolicy( &attr, SCHED_FIFO );
0099 rtems_test_assert( status == 0 );
0100 param.sched_priority = sched_get_priority_max(SCHED_FIFO) / 2;
0101 status = pthread_attr_setschedparam( &attr, ¶m );
0102 rtems_test_assert( status == 0 );
0103
0104 for ( i=0 ; i < N ; i++) {
0105
0106 status = pthread_create(&threadId, &attr, Blocker, NULL);
0107 rtems_test_assert( status == 0 );
0108 }
0109
0110
0111
0112
0113 status = pthread_getschedparam(pthread_self(), &policy, ¶m);
0114 rtems_test_assert( status == 0 );
0115 param.sched_priority = sched_get_priority_max(policy) - 1;
0116 status = pthread_setschedparam(pthread_self(), policy, ¶m);
0117 rtems_test_assert( status == 0 );
0118
0119 benchmark_timer_initialize();
0120 status = pthread_cond_broadcast(&CondID);
0121 end_time = benchmark_timer_read();
0122 rtems_test_assert( status == 0 );
0123
0124 put_time(
0125 "pthread_cond_broadcast: threads waiting no preempt",
0126 end_time,
0127 1,
0128 0,
0129 0
0130 );
0131
0132 TEST_END();
0133 rtems_test_exit( 0 );
0134
0135 return NULL;
0136 }
0137
0138
0139
0140 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0141 #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER
0142
0143 #define CONFIGURE_MAXIMUM_POSIX_THREADS 2 + N
0144 #define CONFIGURE_POSIX_INIT_THREAD_TABLE
0145
0146 #define CONFIGURE_INIT
0147
0148 #include <rtems/confdefs.h>
0149