source: rtems/cpukit/posix/src/psignal.c @ bf95ccb5

4.104.114.95
Last change on this file since bf95ccb5 was bf95ccb5, checked in by Thomas Doerfler <Thomas.Doerfler@…>, on 05/27/08 at 10:34:15

Added const qualifier to various pointers and data tables to

reduce size of data area.
IMFS: Fixed creation of symbolic links to avoid a compiler warning.
DOSFS: Use LibBlock? instead of read() to read the boot record.

  • Property mode set to 100644
File size: 5.5 KB
Line 
1/*
2 *  COPYRIGHT (c) 1989-2007.
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 *  $Id$
10 */
11
12#if HAVE_CONFIG_H
13#include "config.h"
14#endif
15
16#include <assert.h>
17#include <errno.h>
18#include <pthread.h>
19#include <signal.h>
20#include <string.h>     /* memcpy */
21#include <stdlib.h>     /* exit */
22
23#include <rtems/system.h>
24#include <rtems/score/isr.h>
25#include <rtems/score/thread.h>
26#include <rtems/score/tqdata.h>
27#include <rtems/score/wkspace.h>
28#include <rtems/seterr.h>
29#include <rtems/posix/threadsup.h>
30#include <rtems/posix/psignal.h>
31#include <rtems/posix/pthread.h>
32#include <rtems/posix/time.h>
33#include <stdio.h>
34
35/*** PROCESS WIDE STUFF ****/
36
37sigset_t  _POSIX_signals_Pending;
38
39void _POSIX_signals_Abnormal_termination_handler( int signo )
40{
41  exit( 1 );
42}
43
44#define SIG_ARRAY_MAX  (SIGRTMAX + 1)
45const struct sigaction _POSIX_signals_Default_vectors[ SIG_ARRAY_MAX ] = {
46  /* NO SIGNAL 0 */  SIGACTION_IGNORE,
47  /* SIGHUP    1 */  SIGACTION_TERMINATE,
48  /* SIGINT    2 */  SIGACTION_TERMINATE,
49  /* SIGQUIT   3 */  SIGACTION_TERMINATE,
50  /* SIGILL    4 */  SIGACTION_TERMINATE,
51  /* SIGTRAP   5 */  SIGACTION_TERMINATE,
52  /* SIGIOT    6 */  SIGACTION_TERMINATE,
53  /* SIGABRT   6     SIGACTION_TERMINATE, -- alias for SIGIOT */
54  /* SIGEMT    7 */  SIGACTION_TERMINATE,
55  /* SIGFPE    8 */  SIGACTION_TERMINATE,
56  /* SIGKILL   9 */  SIGACTION_TERMINATE,
57  /* SIGBUS   10 */  SIGACTION_TERMINATE,
58  /* SIGSEGV  11 */  SIGACTION_TERMINATE,
59  /* SIGSYS   12 */  SIGACTION_TERMINATE,
60  /* SIGPIPE  13 */  SIGACTION_TERMINATE,
61  /* SIGALRM  14 */  SIGACTION_TERMINATE,
62  /* SIGTERM  15 */  SIGACTION_TERMINATE,
63  /* SIGURG   16 */  SIGACTION_TERMINATE,
64  /* SIGSTOP  17 */  SIGACTION_TERMINATE,
65  /* SIGTSTP  18 */  SIGACTION_TERMINATE,
66  /* SIGCONT  19 */  SIGACTION_TERMINATE,
67  /* SIGCHLD  20 */  SIGACTION_TERMINATE,
68  /* SIGTTIN  21 */  SIGACTION_TERMINATE,
69  /* SIGTTOU  22 */  SIGACTION_TERMINATE,
70  /* SIGIO    23 */  SIGACTION_TERMINATE,
71  /* SIGWINCH 24 */  SIGACTION_TERMINATE,
72  /* SIGUSR1  25 */  SIGACTION_TERMINATE,
73  /* SIGUSR2  26 */  SIGACTION_TERMINATE,
74  /* SIGRT    27 */  SIGACTION_TERMINATE,
75  /* SIGRT    28 */  SIGACTION_TERMINATE,
76  /* SIGRT    29 */  SIGACTION_TERMINATE,
77  /* SIGRT    30 */  SIGACTION_TERMINATE,
78  /* SIGRTMAX 31 */  SIGACTION_TERMINATE
79};
80
81struct sigaction _POSIX_signals_Vectors[ SIG_ARRAY_MAX ];
82
83Thread_queue_Control _POSIX_signals_Wait_queue;
84
85Chain_Control _POSIX_signals_Inactive_siginfo;
86Chain_Control _POSIX_signals_Siginfo[ SIG_ARRAY_MAX ];
87
88/*PAGE
89 *
90 *  XXX - move these
91 */
92
93#define _States_Is_interruptible_signal( _states ) \
94  ( ((_states) & \
95    (STATES_WAITING_FOR_SIGNAL|STATES_INTERRUPTIBLE_BY_SIGNAL)) == \
96      (STATES_WAITING_FOR_SIGNAL|STATES_INTERRUPTIBLE_BY_SIGNAL))
97
98/*
99 *  _POSIX_signals_Post_switch_extension
100 */
101
102void _POSIX_signals_Post_switch_extension(
103  Thread_Control  *the_thread
104)
105{
106  POSIX_API_Control  *api;
107  int                 signo;
108  ISR_Level           level;
109
110  api = the_thread->API_Extensions[ THREAD_API_POSIX ];
111  if ( !api )
112    return;
113
114  /*
115   *  If we invoke any user code, there is the possibility that
116   *  a new signal has been posted that we should process so we
117   *  restart the loop if a signal handler was invoked.
118   *
119   *  The first thing done is to check there are any signals to be
120   *  processed at all.  No point in doing this loop otherwise.
121   */
122  while (1) {
123  restart:
124    _ISR_Disable( level );
125      if ( !(~api->signals_blocked &
126            (api->signals_pending | _POSIX_signals_Pending)) ) {
127       _ISR_Enable( level );
128       break;
129     }
130    _ISR_Enable( level );
131
132    for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
133
134      if ( _POSIX_signals_Check_signal( api, signo, FALSE ) )
135        goto restart;
136
137      if ( _POSIX_signals_Check_signal( api, signo, TRUE ) )
138        goto restart;
139
140    }
141
142    /* XXX - add __SIGFIRSTNOTRT or something like that to newlib signal .h */
143
144    for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) {
145
146      if ( _POSIX_signals_Check_signal( api, signo, FALSE ) )
147        goto restart;
148
149      if ( _POSIX_signals_Check_signal( api, signo, TRUE ) )
150        goto restart;
151
152    }
153  }
154  return;
155}
156
157/*PAGE
158 *
159 *  _POSIX_signals_Manager_Initialization
160 */
161
162void _POSIX_signals_Manager_Initialization(
163  int  maximum_queued_signals
164)
165{
166  uint32_t   signo;
167
168  /*
169   *  Ensure we have the same number of vectors and default vector entries
170   */
171
172  assert(
173   sizeof(_POSIX_signals_Vectors) == sizeof(_POSIX_signals_Default_vectors)
174  );
175
176  memcpy(
177    _POSIX_signals_Vectors,
178    _POSIX_signals_Default_vectors,
179    sizeof( _POSIX_signals_Vectors )
180  );
181
182  /*
183   *  Initialize the set of pending signals for the entire process
184   */
185
186  sigemptyset( &_POSIX_signals_Pending );
187
188  /*
189   *  Initialize the queue we use to block for signals
190   */
191
192  _Thread_queue_Initialize(
193    &_POSIX_signals_Wait_queue,
194    THREAD_QUEUE_DISCIPLINE_PRIORITY,
195    STATES_WAITING_FOR_SIGNAL | STATES_INTERRUPTIBLE_BY_SIGNAL,
196    EAGAIN
197  );
198
199  /* XXX status codes */
200
201  /*
202   *  Allocate the siginfo pools.
203   */
204
205  for ( signo=1 ; signo<= SIGRTMAX ; signo++ )
206    _Chain_Initialize_empty( &_POSIX_signals_Siginfo[ signo ] );
207
208  _Chain_Initialize(
209    &_POSIX_signals_Inactive_siginfo,
210    _Workspace_Allocate_or_fatal_error(
211      maximum_queued_signals * sizeof( POSIX_signals_Siginfo_node )
212    ),
213    maximum_queued_signals,
214    sizeof( POSIX_signals_Siginfo_node )
215  );
216}
Note: See TracBrowser for help on using the repository browser.