Changeset adae080a in rtems


Ignore:
Timestamp:
07/15/96 14:02:14 (27 years ago)
Author:
Mark Johannes <Mark.Johannes@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
c65a0cee
Parents:
69c9543
Message:

Fixed default vectors initialization, sigaction which had a redundant
if clause for DFT action.

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/posix/src/psignal.c

    r69c9543 radae080a  
    5454struct sigaction _POSIX_signals_Default_vectors[ SIG_ARRAY_MAX ] = {
    5555  /* NO SIGNAL 0 */  SIGACTION_IGNORE,
    56   /* SIGABRT     */  SIGACTION_TERMINATE,
    57   /* SIGALRM     */  SIGACTION_TERMINATE,
    58   /* SIGFPE      */  SIGACTION_TERMINATE,
    59   /* SIGHUP      */  SIGACTION_TERMINATE,
    60   /* SIGILL      */  SIGACTION_TERMINATE,
    61   /* SIGINT      */  SIGACTION_TERMINATE,
    62   /* SIGKILL     */  SIGACTION_TERMINATE,
    63   /* SIGPIPE     */  SIGACTION_TERMINATE,
    64   /* SIGQUIT     */  SIGACTION_TERMINATE,
    65   /* SIGSEGV     */  SIGACTION_TERMINATE,
    66   /* SIGTERM     */  SIGACTION_TERMINATE,
    67   /* SIGUSR1     */  SIGACTION_TERMINATE,
    68   /* SIGUSR2     */  SIGACTION_TERMINATE,
    69   /* SIGRTMIN 14 */  SIGACTION_IGNORE,
    70   /* SIGRT    15 */  SIGACTION_IGNORE,
    71   /* SIGRT    16 */  SIGACTION_IGNORE,
    72   /* SIGRT    17 */  SIGACTION_IGNORE,
    73   /* SIGRT    18 */  SIGACTION_IGNORE,
     56  /* SIGHUP    1 */  SIGACTION_TERMINATE,
     57  /* SIGINT    2 */  SIGACTION_TERMINATE,
     58  /* SIGQUIT   3 */  SIGACTION_TERMINATE,
     59  /* SIGILL    4 */  SIGACTION_TERMINATE,
     60  /* SIGTRAP   5 */  SIGACTION_TERMINATE,
     61  /* SIGIOT    6 */  SIGACTION_TERMINATE,
     62  /* SIGABRT   6     SIGACTION_TERMINATE, -- alias for SIGIOT */
     63  /* SIGEMT    7 */  SIGACTION_TERMINATE,
     64  /* SIGFPE    8 */  SIGACTION_TERMINATE,
     65  /* SIGKILL   9 */  SIGACTION_TERMINATE,
     66  /* SIGBUS   10 */  SIGACTION_TERMINATE,
     67  /* SIGSEGV  11 */  SIGACTION_TERMINATE,
     68  /* SIGSYS   12 */  SIGACTION_TERMINATE,
     69  /* SIGPIPE  13 */  SIGACTION_TERMINATE,
     70  /* SIGALRM  14 */  SIGACTION_TERMINATE,
     71  /* SIGTERM  15 */  SIGACTION_TERMINATE,
     72  /* SIGUSR1  16 */  SIGACTION_TERMINATE,
     73  /* SIGUSR2  17 */  SIGACTION_TERMINATE,
     74  /* SIGRTMIN 18 */  SIGACTION_IGNORE,
    7475  /* SIGRT    19 */  SIGACTION_IGNORE,
    7576  /* SIGRT    20 */  SIGACTION_IGNORE,
     
    218219/*PAGE
    219220 *
    220  *  _POSIX_signals_Check_signal
    221  */
    222 
    223 boolean _POSIX_signals_Check_signal(
     221 *  _POSIX_signals_Clear_signals
     222 */
     223 
     224boolean _POSIX_signals_Clear_signals(
    224225  POSIX_API_Control  *api,
    225226  int                 signo,
    226   boolean             is_global
     227  siginfo_t          *info,
     228  boolean             is_global,
     229  boolean             check_blocked
    227230)
    228231{
     
    231234  boolean                     do_callout;
    232235  POSIX_signals_Siginfo_node *psiginfo;
    233   siginfo_t                   siginfo_struct;
    234   sigset_t                    saved_signals_blocked;
    235 
     236 
    236237  mask = signo_to_mask( signo );
    237 
     238 
    238239  do_callout = FALSE;
    239 
     240 
    240241  /* XXX this is not right for siginfo type signals yet */
    241242  /* XXX since they can't be cleared the same way */
    242 
     243 
    243244  _ISR_Disable( level );
    244245    if ( is_global ) {
    245        if ( mask & (_POSIX_signals_Pending & ~api->signals_blocked ) ) {
     246       if ( mask & (_POSIX_signals_Pending &
     247                       (~api->signals_blocked & check_blocked) ) ) {
    246248         if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
    247249           psiginfo = (POSIX_signals_Siginfo_node *)
     
    250252             _POSIX_signals_Clear_process_signals( mask );
    251253           if ( psiginfo ) {
    252              siginfo_struct = psiginfo->Info;
     254             *info = psiginfo->Info;
    253255             _Chain_Append_unprotected(
    254256               &_POSIX_signals_Inactive_siginfo,
     
    262264       }
    263265    } else {
    264       if ( mask & (api->signals_pending & ~api->signals_blocked ) ) {
     266      if ( mask & (api->signals_pending &
     267                      (~api->signals_blocked & check_blocked) ) ) {
    265268        api->signals_pending &= ~mask;
    266269        do_callout = TRUE;
     
    268271    }
    269272  _ISR_Enable( level );
    270 
    271   if ( !do_callout )
     273  return do_callout;
     274}
     275
     276
     277/*PAGE
     278 *
     279 *  _POSIX_signals_Check_signal
     280 */
     281
     282boolean _POSIX_signals_Check_signal(
     283  POSIX_API_Control  *api,
     284  int                 signo,
     285  boolean             is_global
     286)
     287{
     288  siginfo_t                   siginfo_struct;
     289  sigset_t                    saved_signals_blocked;
     290
     291  if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
     292                                       is_global, TRUE ) )
    272293    return FALSE;
    273294
     
    583604  if ( act ) {
    584605
     606    /*
     607     *  Unless the user is installing the default signal actions, then
     608     *  we can just copy the provided sigaction structure into the vectors.
     609     */
     610
    585611    _ISR_Disable( level );
    586612      if ( act->sa_handler == SIG_DFL ) {
    587613        _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
    588       } else if ( act->sa_handler == SIG_DFL ) {
    589          _POSIX_signals_Clear_process_signals( signo_to_mask(sig) );
    590614      } else {
    591615         _POSIX_signals_Clear_process_signals( signo_to_mask(sig) );
    592         _POSIX_signals_Vectors[ sig ] = *act;
     616         _POSIX_signals_Vectors[ sig ] = *act;
    593617      }
    594618    _ISR_Enable( level );
     
    793817    /* XXX real info later */
    794818    the_info->si_signo = _POSIX_signals_Get_highest( api->signals_pending );
     819    _POSIX_signals_Clear_signals( api, the_info->si_signo, the_info,
     820                                  FALSE, FALSE );
    795821    the_info->si_code = SI_USER;
    796822    the_info->si_value.sival_int = 0;
     
    800826  /* Process pending signals? */
    801827
    802 #warning "Mark fix me"
    803828  if ( *set & _POSIX_signals_Pending) {
    804829    signo = _POSIX_signals_Get_highest( _POSIX_signals_Pending );
    805     if ( !info || ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) ) {
     830    _POSIX_signals_Clear_signals( api, signo, the_info, TRUE, FALSE );
     831
     832    if ( !info ) {
    806833      the_info->si_signo = signo;
    807834      the_info->si_code = SI_USER;
    808835      the_info->si_value.sival_int = 0;
    809     } else {
    810 #warning "_POSIX_signals_Siginfo is an array of chains.... "
    811 #if 0
    812       *the_info = *_POSIX_signals_Siginfo[ signo ];
    813 #endif
    814836    }
    815837  }
  • cpukit/posix/src/psignal.c

    r69c9543 radae080a  
    5454struct sigaction _POSIX_signals_Default_vectors[ SIG_ARRAY_MAX ] = {
    5555  /* NO SIGNAL 0 */  SIGACTION_IGNORE,
    56   /* SIGABRT     */  SIGACTION_TERMINATE,
    57   /* SIGALRM     */  SIGACTION_TERMINATE,
    58   /* SIGFPE      */  SIGACTION_TERMINATE,
    59   /* SIGHUP      */  SIGACTION_TERMINATE,
    60   /* SIGILL      */  SIGACTION_TERMINATE,
    61   /* SIGINT      */  SIGACTION_TERMINATE,
    62   /* SIGKILL     */  SIGACTION_TERMINATE,
    63   /* SIGPIPE     */  SIGACTION_TERMINATE,
    64   /* SIGQUIT     */  SIGACTION_TERMINATE,
    65   /* SIGSEGV     */  SIGACTION_TERMINATE,
    66   /* SIGTERM     */  SIGACTION_TERMINATE,
    67   /* SIGUSR1     */  SIGACTION_TERMINATE,
    68   /* SIGUSR2     */  SIGACTION_TERMINATE,
    69   /* SIGRTMIN 14 */  SIGACTION_IGNORE,
    70   /* SIGRT    15 */  SIGACTION_IGNORE,
    71   /* SIGRT    16 */  SIGACTION_IGNORE,
    72   /* SIGRT    17 */  SIGACTION_IGNORE,
    73   /* SIGRT    18 */  SIGACTION_IGNORE,
     56  /* SIGHUP    1 */  SIGACTION_TERMINATE,
     57  /* SIGINT    2 */  SIGACTION_TERMINATE,
     58  /* SIGQUIT   3 */  SIGACTION_TERMINATE,
     59  /* SIGILL    4 */  SIGACTION_TERMINATE,
     60  /* SIGTRAP   5 */  SIGACTION_TERMINATE,
     61  /* SIGIOT    6 */  SIGACTION_TERMINATE,
     62  /* SIGABRT   6     SIGACTION_TERMINATE, -- alias for SIGIOT */
     63  /* SIGEMT    7 */  SIGACTION_TERMINATE,
     64  /* SIGFPE    8 */  SIGACTION_TERMINATE,
     65  /* SIGKILL   9 */  SIGACTION_TERMINATE,
     66  /* SIGBUS   10 */  SIGACTION_TERMINATE,
     67  /* SIGSEGV  11 */  SIGACTION_TERMINATE,
     68  /* SIGSYS   12 */  SIGACTION_TERMINATE,
     69  /* SIGPIPE  13 */  SIGACTION_TERMINATE,
     70  /* SIGALRM  14 */  SIGACTION_TERMINATE,
     71  /* SIGTERM  15 */  SIGACTION_TERMINATE,
     72  /* SIGUSR1  16 */  SIGACTION_TERMINATE,
     73  /* SIGUSR2  17 */  SIGACTION_TERMINATE,
     74  /* SIGRTMIN 18 */  SIGACTION_IGNORE,
    7475  /* SIGRT    19 */  SIGACTION_IGNORE,
    7576  /* SIGRT    20 */  SIGACTION_IGNORE,
     
    218219/*PAGE
    219220 *
    220  *  _POSIX_signals_Check_signal
    221  */
    222 
    223 boolean _POSIX_signals_Check_signal(
     221 *  _POSIX_signals_Clear_signals
     222 */
     223 
     224boolean _POSIX_signals_Clear_signals(
    224225  POSIX_API_Control  *api,
    225226  int                 signo,
    226   boolean             is_global
     227  siginfo_t          *info,
     228  boolean             is_global,
     229  boolean             check_blocked
    227230)
    228231{
     
    231234  boolean                     do_callout;
    232235  POSIX_signals_Siginfo_node *psiginfo;
    233   siginfo_t                   siginfo_struct;
    234   sigset_t                    saved_signals_blocked;
    235 
     236 
    236237  mask = signo_to_mask( signo );
    237 
     238 
    238239  do_callout = FALSE;
    239 
     240 
    240241  /* XXX this is not right for siginfo type signals yet */
    241242  /* XXX since they can't be cleared the same way */
    242 
     243 
    243244  _ISR_Disable( level );
    244245    if ( is_global ) {
    245        if ( mask & (_POSIX_signals_Pending & ~api->signals_blocked ) ) {
     246       if ( mask & (_POSIX_signals_Pending &
     247                       (~api->signals_blocked & check_blocked) ) ) {
    246248         if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
    247249           psiginfo = (POSIX_signals_Siginfo_node *)
     
    250252             _POSIX_signals_Clear_process_signals( mask );
    251253           if ( psiginfo ) {
    252              siginfo_struct = psiginfo->Info;
     254             *info = psiginfo->Info;
    253255             _Chain_Append_unprotected(
    254256               &_POSIX_signals_Inactive_siginfo,
     
    262264       }
    263265    } else {
    264       if ( mask & (api->signals_pending & ~api->signals_blocked ) ) {
     266      if ( mask & (api->signals_pending &
     267                      (~api->signals_blocked & check_blocked) ) ) {
    265268        api->signals_pending &= ~mask;
    266269        do_callout = TRUE;
     
    268271    }
    269272  _ISR_Enable( level );
    270 
    271   if ( !do_callout )
     273  return do_callout;
     274}
     275
     276
     277/*PAGE
     278 *
     279 *  _POSIX_signals_Check_signal
     280 */
     281
     282boolean _POSIX_signals_Check_signal(
     283  POSIX_API_Control  *api,
     284  int                 signo,
     285  boolean             is_global
     286)
     287{
     288  siginfo_t                   siginfo_struct;
     289  sigset_t                    saved_signals_blocked;
     290
     291  if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
     292                                       is_global, TRUE ) )
    272293    return FALSE;
    273294
     
    583604  if ( act ) {
    584605
     606    /*
     607     *  Unless the user is installing the default signal actions, then
     608     *  we can just copy the provided sigaction structure into the vectors.
     609     */
     610
    585611    _ISR_Disable( level );
    586612      if ( act->sa_handler == SIG_DFL ) {
    587613        _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
    588       } else if ( act->sa_handler == SIG_DFL ) {
    589          _POSIX_signals_Clear_process_signals( signo_to_mask(sig) );
    590614      } else {
    591615         _POSIX_signals_Clear_process_signals( signo_to_mask(sig) );
    592         _POSIX_signals_Vectors[ sig ] = *act;
     616         _POSIX_signals_Vectors[ sig ] = *act;
    593617      }
    594618    _ISR_Enable( level );
     
    793817    /* XXX real info later */
    794818    the_info->si_signo = _POSIX_signals_Get_highest( api->signals_pending );
     819    _POSIX_signals_Clear_signals( api, the_info->si_signo, the_info,
     820                                  FALSE, FALSE );
    795821    the_info->si_code = SI_USER;
    796822    the_info->si_value.sival_int = 0;
     
    800826  /* Process pending signals? */
    801827
    802 #warning "Mark fix me"
    803828  if ( *set & _POSIX_signals_Pending) {
    804829    signo = _POSIX_signals_Get_highest( _POSIX_signals_Pending );
    805     if ( !info || ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) ) {
     830    _POSIX_signals_Clear_signals( api, signo, the_info, TRUE, FALSE );
     831
     832    if ( !info ) {
    806833      the_info->si_signo = signo;
    807834      the_info->si_code = SI_USER;
    808835      the_info->si_value.sival_int = 0;
    809     } else {
    810 #warning "_POSIX_signals_Siginfo is an array of chains.... "
    811 #if 0
    812       *the_info = *_POSIX_signals_Siginfo[ signo ];
    813 #endif
    814836    }
    815837  }
Note: See TracChangeset for help on using the changeset viewer.