source: rtems/testsuites/psxtests/psxsignal01/init.c @ 6c2de60

4.115
Last change on this file since 6c2de60 was 6c2de60, checked in by Joel Sherrill <joel.sherrill@…>, on 05/11/12 at 19:12:11

psxtests - Eliminate missing prototype warnings

  • Property mode set to 100644
File size: 5.6 KB
Line 
1/*
2 *  COPYRIGHT (c) 1989-2012.
3 *  On-Line Applications Research Corporation (OAR).
4 *
5 *  The license and distribution terms for this file may be
6 *  found in the file LICENSE in this distribution or at
7 *  http://www.rtems.com/license/LICENSE.
8 */
9
10#ifdef HAVE_CONFIG_H
11#include "config.h"
12#endif
13
14#define CONFIGURE_INIT
15#include "system.h"
16#include <signal.h>
17#include <errno.h>
18
19/* forward declarations to avoid warnings */
20int test_main(void);
21void Handler_1(int signo);
22void Signal_handler(int signo);
23void Signal_info_handler(int signo, siginfo_t *info, void *context);
24rtems_timer_service_routine Signal_duringISR_TSR(
25  rtems_id  ignored_id,
26  void     *ignored_address
27);
28
29typedef void (*sighandler_t)(int);
30sighandler_t signal(int signum, sighandler_t handler);
31extern void _POSIX_signals_Abnormal_termination_handler( int signo );
32
33volatile int Signal_occurred;
34volatile int Signal_count;
35
36void Handler_1(
37  int signo
38)
39{
40  Signal_count++;
41  printf(
42    "Handler_1: Signal: %d caught by 0x%" PRIxpthread_t " (%d)\n",
43    signo,
44    pthread_self(),
45    Signal_count
46  );
47  Signal_occurred = 1;
48}
49
50void Signal_handler(
51  int signo
52)
53{
54  Signal_count++;
55  printf(
56    "Signal: %d caught by 0x%"PRIxpthread_t " (%d)\n",
57    signo,
58    pthread_self(),
59    Signal_count
60  );
61  Signal_occurred = 1;
62}
63
64void Signal_info_handler(
65  int        signo,
66  siginfo_t *info,
67  void      *context
68)
69{
70  Signal_count++;
71  printf(
72    "Signal_info: %d caught by 0x%" PRIxpthread_t " (%d) si_signo= %d si_code= %d value= %d\n",
73    signo,
74    pthread_self(),
75    Signal_count,
76    info->si_signo,
77    info->si_code,
78    info->si_value.sival_int
79  );
80  Signal_occurred = 1;
81}
82
83rtems_timer_service_routine Signal_duringISR_TSR(
84  rtems_id  ignored_id,
85  void     *ignored_address
86)
87{
88  int  status;
89
90  status = pthread_kill( pthread_self(), SIGUSR1 );
91  rtems_test_assert( status == 0 );
92}
93
94
95void *POSIX_Init(
96  void *argument
97)
98{
99  int               status;
100  struct sigaction  act;
101  sigset_t          mask;
102  sighandler_t      oldHandler;
103  sighandler_t      newHandler;
104  rtems_interval start, end;
105
106  puts( "\n\n*** POSIX TEST SIGNAL ***" );
107
108  /* set the time of day, and print our buffer in multiple ways */
109
110  set_time( TM_FRIDAY, TM_MAY, 24, 96, 11, 5, 0 );
111
112  /* get id of this thread */
113
114  Init_id = pthread_self();
115  printf( "Init's ID is 0x%08" PRIxpthread_t "\n", Init_id );
116
117  Signal_occurred = 0;
118  Signal_count = 0;
119  act.sa_handler = Handler_1;
120  act.sa_flags   = 0;
121  sigaction( SIGUSR1, &act, NULL );
122  sigaction( SIGFPE, &act, NULL );
123  sigaction( SIGILL, &act, NULL );
124  sigaction( SIGSEGV, &act, NULL );
125
126
127  /*
128   * If we have the signal pending with default, we will die.
129   */
130  puts("Validate signal with SIG_DFL");
131  signal( SIGUSR1, SIG_DFL );
132  status = kill( getpid(), SIGUSR1 );
133  status = sleep( 1 );
134
135  puts("Validate signal with SIG_IGN");
136  signal( SIGUSR1, SIG_IGN );
137  status = kill( getpid(), SIGUSR1 );
138  status = sleep( 1 );
139
140/* unblock Signal and see if it happened */
141  status = sigemptyset( &mask );
142  rtems_test_assert( !status );
143
144  status = sigaddset( &mask, SIGUSR1 );
145  rtems_test_assert( !status );
146
147  status = sigaddset( &mask, SIGFPE );
148  rtems_test_assert( !status );
149
150  status = sigaddset( &mask, SIGILL );
151  rtems_test_assert( !status );
152
153  status = sigaddset( &mask, SIGSEGV );
154  rtems_test_assert( !status );
155
156  puts( "Init: Unblock SIGUSR1 SIGFPE SIGILL SIGSEGV" );
157  status = sigprocmask( SIG_UNBLOCK, &mask, NULL );
158  rtems_test_assert( !status );
159
160/* install a signal handler for SIGUSR1 */
161  Signal_occurred = 0;
162  Signal_count = 0;
163  act.sa_handler = Handler_1;
164  act.sa_flags   = 0;
165  sigaction( SIGUSR1, &act, NULL );
166
167  Signal_count = 0;
168  Signal_occurred = 0;
169
170  newHandler = Signal_handler;
171  oldHandler = signal( SIGUSR1, newHandler );
172  if (oldHandler == Handler_1 )
173    puts("Init: signal return value verified");
174  else
175    puts("Init: ERROR==> signal unexpected return value" );
176  status = sleep( 1 );
177
178  puts( "Init: send SIGUSR1 to process" );
179  status = kill( getpid(), SIGUSR1 );
180  status = sleep( 5 );
181
182  puts( "Init: send SIGFPE to process" );
183  status = _kill_r( NULL, getpid(), SIGFPE );
184  status = sleep(5);
185
186  puts( "Init: send SIGILL to process" );
187  status = _kill_r( NULL, getpid(), SIGILL );
188  status = sleep(5);
189
190  puts( "Init: send SIGSEGV to process" );
191  status = _kill_r( NULL, getpid(), SIGSEGV );
192  status = sleep(5);
193
194  Timer_name[0]= rtems_build_name( 'T', 'M', '1', ' ' );
195  status = rtems_timer_create( Timer_name[0], &Timer_id[0]);
196
197  Signal_count = 0;
198  Signal_occurred = 0;
199  puts( "Init: send SIGUSR1 to process from a TSR (interruptible sleep)" );
200  status = rtems_timer_fire_after(
201    Timer_id[ 0 ],
202    1,
203    Signal_duringISR_TSR,
204    NULL
205  );
206  sleep(5);
207  /* signal occurs during interruptible sleep */
208
209  /* now schedule another one to fire but do not sleep */
210
211  puts( "Init: send SIGUSR1 to process from a TSR (spin)" );
212  start = rtems_clock_get_ticks_since_boot();
213  Signal_count = 0;
214  Signal_occurred = 0;
215  status = rtems_timer_fire_after(
216    Timer_id[ 0 ],
217    10,
218    Signal_duringISR_TSR,
219    NULL
220  );
221  do {
222    end = rtems_clock_get_ticks_since_boot();
223  } while ( !Signal_occurred && ((end - start) <= 800));
224
225  if ( !Signal_occurred ) {
226    puts( "Signal did not occur" );
227    rtems_test_exit(0);
228  }
229
230/* end of install a signal handler for SIGUSR1 */
231
232  Signal_occurred = 0;
233
234  puts("*** Validate unexpected program termination ***");
235  puts( "*** END OF POSIX TEST SIGNAL ***" );
236  _POSIX_signals_Abnormal_termination_handler( SIGUSR1 );
237  status = sleep( 1 );
238
239  puts( "ERROR==> Expected program termination");
240  rtems_test_exit(0);
241  return NULL; /* just so the compiler thinks we returned something */
242}
Note: See TracBrowser for help on using the repository browser.