File indexing completed on 2025-05-11 08:24:36
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 #define CONFIGURE_INIT
0034 #include "system.h"
0035 #include <signal.h>
0036 #include <errno.h>
0037
0038 const char rtems_test_name[] = "PSX 3";
0039
0040 volatile int Signal_occurred;
0041 volatile int Signal_count;
0042 void Signal_handler( int signo );
0043
0044 void Signal_handler(
0045 int signo
0046 )
0047 {
0048 Signal_count++;
0049 printf(
0050 "Signal: %d caught by 0x%" PRIxpthread_t " (%d)\n",
0051 signo,
0052 pthread_self(),
0053 Signal_count
0054 );
0055 Signal_occurred = 1;
0056 }
0057
0058 void *POSIX_Init(
0059 void *argument
0060 )
0061 {
0062 int status;
0063 struct timespec timeout;
0064 struct sigaction act;
0065 sigset_t mask;
0066 sigset_t waitset;
0067 int signo;
0068 siginfo_t siginfo;
0069
0070 TEST_BEGIN();
0071
0072
0073
0074 set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
0075
0076
0077
0078 Init_id = pthread_self();
0079 printf( "Init's ID is 0x%08" PRIxpthread_t "\n", Init_id );
0080
0081
0082
0083 status = sigemptyset( &act.sa_mask );
0084 rtems_test_assert( !status );
0085
0086 act.sa_handler = Signal_handler;
0087 act.sa_flags = 0;
0088
0089 sigaction( SIGUSR1, &act, NULL );
0090
0091
0092
0093 Signal_count = 0;
0094 Signal_occurred = 0;
0095
0096
0097
0098
0099
0100
0101
0102 status = sigemptyset( &waitset );
0103 rtems_test_assert( !status );
0104
0105 status = sigaddset( &waitset, SIGUSR1 );
0106 rtems_test_assert( !status );
0107
0108 timeout.tv_sec = 3;
0109 timeout.tv_nsec = 0;
0110
0111 puts( "Init: waiting on any signal for 3 seconds." );
0112 signo = sigtimedwait( &waitset, &siginfo, &timeout );
0113 rtems_test_assert( signo == -1 );
0114
0115 if ( errno == EAGAIN )
0116 puts( "Init: correctly timed out waiting for SIGUSR1." );
0117 else
0118 printf( "sigtimedwait returned wrong errno - %d\n", errno );
0119
0120 Signal_occurred = 0;
0121
0122
0123
0124
0125
0126 empty_line();
0127
0128
0129
0130 status = sigemptyset( &mask );
0131 rtems_test_assert( !status );
0132
0133 status = sigaddset( &mask, SIGUSR2 );
0134 rtems_test_assert( !status );
0135
0136 printf( "Init: Block SIGUSR2\n" );
0137 status = sigprocmask( SIG_BLOCK, &mask, NULL );
0138 rtems_test_assert( !status );
0139
0140
0141
0142 status = pthread_create( &Task_id, NULL, Task_1, NULL );
0143 rtems_test_assert( !status );
0144
0145
0146
0147 timeout.tv_sec = 3;
0148 timeout.tv_nsec = 0;
0149
0150 puts( "Init: waiting on any signal for 3 seconds." );
0151 signo = sigtimedwait( &waitset, &siginfo, &timeout );
0152
0153
0154
0155 if ( errno == EAGAIN )
0156 puts( "Init: correctly timed out waiting for SIGUSR1." );
0157 else
0158 printf( "sigtimedwait returned wrong errno - %d\n", errno );
0159 rtems_test_assert( signo == -1 );
0160
0161
0162
0163
0164
0165 empty_line();
0166
0167
0168
0169 status = pthread_create( &Task_id, NULL, Task_2, NULL );
0170 rtems_test_assert( !status );
0171
0172
0173
0174
0175
0176 timeout.tv_sec = 3;
0177 timeout.tv_nsec = 0;
0178
0179
0180
0181 siginfo.si_code = -1;
0182 siginfo.si_signo = -1;
0183 siginfo.si_value.sival_int = -1;
0184
0185 puts( "Init: waiting on any signal for 3 seconds." );
0186 signo = sigtimedwait( &waitset, &siginfo, &timeout );
0187 printf( "Init: received (%d) SIGUSR1=%d\n", siginfo.si_signo, SIGUSR1 );
0188 rtems_test_assert( signo == SIGUSR1 );
0189 rtems_test_assert( siginfo.si_signo == SIGUSR1 );
0190 rtems_test_assert( siginfo.si_code == SI_USER );
0191 rtems_test_assert( siginfo.si_value.sival_int != -1 );
0192
0193
0194
0195 empty_line();
0196 puts( "Init: kill with SIGUSR2." );
0197 status = kill( getpid(), SIGUSR2 );
0198 rtems_test_assert( !status );
0199
0200 siginfo.si_code = -1;
0201 siginfo.si_signo = -1;
0202 siginfo.si_value.sival_int = -1;
0203
0204 status = sigemptyset( &waitset );
0205 rtems_test_assert( !status );
0206
0207 status = sigaddset( &waitset, SIGUSR1 );
0208 rtems_test_assert( !status );
0209
0210 status = sigaddset( &waitset, SIGUSR2 );
0211 rtems_test_assert( !status );
0212
0213 puts( "Init: waiting on any signal for 3 seconds." );
0214 signo = sigtimedwait( &waitset, &siginfo, &timeout );
0215 printf( "Init: received (%d) SIGUSR2=%d\n", siginfo.si_signo, SIGUSR2 );
0216 rtems_test_assert( signo == SIGUSR2 );
0217 rtems_test_assert( siginfo.si_signo == SIGUSR2 );
0218 rtems_test_assert( siginfo.si_code == SI_USER );
0219 rtems_test_assert( siginfo.si_value.sival_int != -1 );
0220
0221
0222
0223 TEST_END();
0224 rtems_test_exit( 0 );
0225
0226 return NULL;
0227 }