source: rtems/cpukit/posix/src/psignal.c @ 1da7812

4.104.115
Last change on this file since 1da7812 was 1da7812, checked in by Sebastian Huber <sebastian.huber@…>, on 04/30/10 at 08:37:27

2010-04-30 Sebastian Huber <sebastian.huber@…>

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