Changeset c53cfd0f in rtems


Ignore:
Timestamp:
Jun 13, 1996, 8:46:15 PM (25 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
3a075f5
Parents:
25a882a6
Message:

added queued signals and cleaned up setting of process wide signals so
it occurs in only one place.

Files:
2 edited

Legend:

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

    r25a882a6 rc53cfd0f  
    1212#include <rtems/score/thread.h>
    1313#include <rtems/score/tqdata.h>
     14#include <rtems/score/wkspace.h>
    1415#include <rtems/posix/seterr.h>
    1516#include <rtems/posix/threadsup.h>
     
    117118
    118119/* XXX this routine could probably be cleaned up */
    119 void _POSIX_signals_Unblock_thread(
     120boolean _POSIX_signals_Unblock_thread(
    120121  Thread_Control  *the_thread,
    121122  int              signo,
     
    151152     
    152153      _Thread_queue_Extract_with_proxy( the_thread );
     154      return TRUE;
    153155    }
    154     return;
     156
     157    /*
     158     *  This should only be reached via pthread_kill().
     159     */
     160
     161    return FALSE;
    155162  }
    156163
     
    169176    }
    170177  }
     178  return FALSE;
    171179
    172180}
     
    219227)
    220228{
    221   sigset_t            mask;
    222   ISR_Level           level;
    223   boolean             do_callout;
    224   siginfo_t          *siginfo = NULL;  /* really needs to be set below */
    225   siginfo_t           siginfo_struct;
    226   sigset_t            saved_signals_blocked;
     229  sigset_t                    mask;
     230  ISR_Level                   level;
     231  boolean                     do_callout;
     232  POSIX_signals_Siginfo_node *psiginfo;
     233  siginfo_t                   siginfo_struct;
     234  sigset_t                    saved_signals_blocked;
    227235
    228236  mask = signo_to_mask( signo );
     
    236244    if ( is_global ) {
    237245       if ( mask & (_POSIX_signals_Pending & ~api->signals_blocked ) ) {
    238          _POSIX_signals_Clear_process_signals( mask );
     246         if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
     247           psiginfo = (POSIX_signals_Siginfo_node *)
     248             _Chain_Get_unprotected( &_POSIX_signals_Siginfo[ signo ] );
     249           if ( _Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
     250             _POSIX_signals_Clear_process_signals( mask );
     251           if ( psiginfo ) {
     252             siginfo_struct = psiginfo->Info;
     253             _Chain_Append_unprotected(
     254               &_POSIX_signals_Inactive_siginfo,
     255               &psiginfo->Node
     256             );
     257           } else
     258             do_callout = FALSE;
     259         } else
     260           _POSIX_signals_Clear_process_signals( mask );
    239261         do_callout = TRUE;
    240262       }
     
    274296  switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
    275297    case SA_SIGINFO:
    276       assert( 0 );   /* XXX we haven't completely implemented this yet */
    277       if ( !is_global ) {
    278         siginfo = &siginfo_struct;
    279         siginfo->si_signo = signo;
    280         siginfo->si_code = SI_USER;
    281         siginfo->si_value.sival_int = 0;
    282       }
     298      assert( is_global );
     299
    283300      (*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
    284301        signo,
    285         siginfo,
     302        &siginfo_struct,
    286303        NULL        /* context is undefined per 1003.1b-1993, p. 66 */
    287304      );
     
    372389 */
    373390
    374 void _POSIX_signals_Manager_Initialization( void )
     391void _POSIX_signals_Manager_Initialization(
     392  int  maximum_queued_signals
     393)
    375394{
    376395  unsigned32 signo;
     
    421440
    422441  /* XXX status codes */
     442
    423443  /*
    424    *  XXX Allocate the siginfo pools.
     444   *  Allocate the siginfo pools.
    425445   */
    426446
     
    428448    _Chain_Initialize_empty( &_POSIX_signals_Siginfo[ signo ] );
    429449
    430   /* XXX especially the inactive pool */
     450  _Chain_Initialize(
     451    &_POSIX_signals_Inactive_siginfo,
     452    _Workspace_Allocate_or_fatal_error(
     453      maximum_queued_signals * sizeof( POSIX_signals_Siginfo_node )
     454    ),
     455    maximum_queued_signals,
     456    sizeof( POSIX_signals_Siginfo_node )
     457  );
    431458}
    432459
     
    811838}
    812839
    813 /*
    814  *  3.3.9 Queue a Signal to a Process, P1003.1b-1993, p. 78
    815  */
    816 
    817 int sigqueue(
    818   pid_t               pid,
    819   int                 signo,
    820   const union sigval  value
    821 )
    822 {
    823   return POSIX_NOT_IMPLEMENTED();
    824 }
    825 
    826 /*
     840/*PAGE
     841 *
    827842 *  3.3.2 Send a Signal to a Process, P1003.1b-1993, p. 68
    828843 *
     
    833848  ( ~(_api)->signals_blocked & (_mask) )
    834849         
    835 int kill(
    836   pid_t pid,
    837   int   sig
    838 )
    839 {
    840   sigset_t              mask;
    841   POSIX_API_Control    *api;
    842   unsigned32            the_class;
    843   unsigned32            index;
    844   unsigned32            maximum;
    845   Objects_Information  *the_info;
    846   Objects_Control     **object_table;
    847   Thread_Control       *the_thread;
    848   Thread_Control       *interested_thread;
    849   Priority_Control      interested_priority;
    850   Chain_Control        *the_chain;
    851   Chain_Node           *the_node;
     850int killinfo(
     851  pid_t               pid,
     852  int                 sig,
     853  const union sigval *value
     854)
     855{
     856  sigset_t                     mask;
     857  POSIX_API_Control           *api;
     858  unsigned32                   the_class;
     859  unsigned32                   index;
     860  unsigned32                   maximum;
     861  Objects_Information         *the_info;
     862  Objects_Control            **object_table;
     863  Thread_Control              *the_thread;
     864  Thread_Control              *interested_thread;
     865  Priority_Control             interested_priority;
     866  Chain_Control               *the_chain;
     867  Chain_Node                  *the_node;
     868  siginfo_t                    siginfo_struct;
     869  siginfo_t                   *siginfo;
     870  POSIX_signals_Siginfo_node  *psiginfo;
    852871 
    853872  /*
     
    882901  mask = signo_to_mask( sig );
    883902
     903  /*
     904   *  Build up a siginfo structure
     905   */
     906
     907  siginfo = &siginfo_struct;
     908  siginfo->si_signo = sig;
     909  siginfo->si_code = SI_USER;
     910  if ( !value ) {
     911    siginfo->si_value.sival_int = 0;
     912  } else {
     913    siginfo->si_value = *value;
     914  }
     915
    884916  _Thread_Disable_dispatch();
    885917
     
    893925  api = the_thread->API_Extensions[ THREAD_API_POSIX ];
    894926  if ( _POSIX_signals_Is_interested( api, mask ) ) {
    895     _POSIX_signals_Set_process_signals( mask );
    896927    goto process_it;
    897928  }
     
    922953    }
    923954  }
    924 
    925   /*
    926    *  Since we did not deliver the signal to the current thread or to a
    927    *  specific thread via sigwait() we will mark it as pending.
    928    */
    929 
    930   _POSIX_signals_Set_process_signals( mask );
    931955
    932956  /*
     
    10621086   */
    10631087
    1064   _Thread_Enable_dispatch();
    1065   return 0;
     1088  the_thread = NULL;
     1089  goto post_process_signal;
    10661090
    10671091  /*
     
    10731097process_it:
    10741098 
    1075   api = the_thread->API_Extensions[ THREAD_API_POSIX ];
    1076 
    10771099  the_thread->do_post_task_switch_extension = TRUE;
    10781100
    1079   _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
     1101  /*
     1102   *  Returns TRUE if the signal was synchronously given to a thread
     1103   *  blocked waiting for the signal.
     1104   */
     1105
     1106  if ( _POSIX_signals_Unblock_thread( the_thread, sig, siginfo ) ) {
     1107    _Thread_Enable_dispatch();
     1108    return 0;
     1109  }
     1110
     1111post_process_signal:
     1112
     1113  /*
     1114   *  We may have woken up a thread but we definitely need to post the
     1115   *  signal to the process wide information set.
     1116   */
     1117
     1118  _POSIX_signals_Set_process_signals( mask );
     1119
     1120  if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
     1121
     1122    psiginfo = (POSIX_signals_Siginfo_node *)
     1123               _Chain_Get( &_POSIX_signals_Inactive_siginfo );
     1124    if ( !psiginfo )
     1125      set_errno_and_return_minus_one( EAGAIN );
     1126
     1127    psiginfo->Info = *siginfo;
     1128
     1129    _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
     1130  }
    10801131
    10811132  _Thread_Enable_dispatch();
    1082 
    1083    /* XXX take this out when a little more confident */
    1084   /* SIGABRT comes from abort via assert and must work no matter what */
    1085   if ( sig == SIGABRT ) {
    1086     exit( 1 );
    1087   }
    10881133  return 0;
     1134}
     1135
     1136/*PAGE
     1137 *
     1138 *  3.3.2 Send a Signal to a Process, P1003.1b-1993, p. 68
     1139 *
     1140 *  NOTE: Behavior of kill() depends on _POSIX_SAVED_IDS.
     1141 */
     1142
     1143int kill(
     1144  pid_t pid,
     1145  int   sig
     1146)
     1147{
     1148  return killinfo( pid, sig, NULL );
     1149}
     1150
     1151/*
     1152 *  3.3.9 Queue a Signal to a Process, P1003.1b-1993, p. 78
     1153 */
     1154
     1155int sigqueue(
     1156  pid_t               pid,
     1157  int                 signo,
     1158  const union sigval  value
     1159)
     1160{
     1161  return killinfo( pid, signo, &value );
    10891162}
    10901163
     
    11071180  if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
    11081181    return 0;
     1182
     1183  /*
     1184   *  RTEMS does not support sending  a siginfo signal to a specific thread.
     1185   */
     1186
     1187  if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO )
     1188    return ENOSYS;
    11091189
    11101190  the_thread = _POSIX_Threads_Get( thread, &location );
     
    11261206        api->signals_pending |= signo_to_mask( sig );
    11271207
    1128         _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
     1208        (void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
    11291209    }
    11301210    _Thread_Enable_dispatch();
  • cpukit/posix/src/psignal.c

    r25a882a6 rc53cfd0f  
    1212#include <rtems/score/thread.h>
    1313#include <rtems/score/tqdata.h>
     14#include <rtems/score/wkspace.h>
    1415#include <rtems/posix/seterr.h>
    1516#include <rtems/posix/threadsup.h>
     
    117118
    118119/* XXX this routine could probably be cleaned up */
    119 void _POSIX_signals_Unblock_thread(
     120boolean _POSIX_signals_Unblock_thread(
    120121  Thread_Control  *the_thread,
    121122  int              signo,
     
    151152     
    152153      _Thread_queue_Extract_with_proxy( the_thread );
     154      return TRUE;
    153155    }
    154     return;
     156
     157    /*
     158     *  This should only be reached via pthread_kill().
     159     */
     160
     161    return FALSE;
    155162  }
    156163
     
    169176    }
    170177  }
     178  return FALSE;
    171179
    172180}
     
    219227)
    220228{
    221   sigset_t            mask;
    222   ISR_Level           level;
    223   boolean             do_callout;
    224   siginfo_t          *siginfo = NULL;  /* really needs to be set below */
    225   siginfo_t           siginfo_struct;
    226   sigset_t            saved_signals_blocked;
     229  sigset_t                    mask;
     230  ISR_Level                   level;
     231  boolean                     do_callout;
     232  POSIX_signals_Siginfo_node *psiginfo;
     233  siginfo_t                   siginfo_struct;
     234  sigset_t                    saved_signals_blocked;
    227235
    228236  mask = signo_to_mask( signo );
     
    236244    if ( is_global ) {
    237245       if ( mask & (_POSIX_signals_Pending & ~api->signals_blocked ) ) {
    238          _POSIX_signals_Clear_process_signals( mask );
     246         if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
     247           psiginfo = (POSIX_signals_Siginfo_node *)
     248             _Chain_Get_unprotected( &_POSIX_signals_Siginfo[ signo ] );
     249           if ( _Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) )
     250             _POSIX_signals_Clear_process_signals( mask );
     251           if ( psiginfo ) {
     252             siginfo_struct = psiginfo->Info;
     253             _Chain_Append_unprotected(
     254               &_POSIX_signals_Inactive_siginfo,
     255               &psiginfo->Node
     256             );
     257           } else
     258             do_callout = FALSE;
     259         } else
     260           _POSIX_signals_Clear_process_signals( mask );
    239261         do_callout = TRUE;
    240262       }
     
    274296  switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) {
    275297    case SA_SIGINFO:
    276       assert( 0 );   /* XXX we haven't completely implemented this yet */
    277       if ( !is_global ) {
    278         siginfo = &siginfo_struct;
    279         siginfo->si_signo = signo;
    280         siginfo->si_code = SI_USER;
    281         siginfo->si_value.sival_int = 0;
    282       }
     298      assert( is_global );
     299
    283300      (*_POSIX_signals_Vectors[ signo ].sa_sigaction)(
    284301        signo,
    285         siginfo,
     302        &siginfo_struct,
    286303        NULL        /* context is undefined per 1003.1b-1993, p. 66 */
    287304      );
     
    372389 */
    373390
    374 void _POSIX_signals_Manager_Initialization( void )
     391void _POSIX_signals_Manager_Initialization(
     392  int  maximum_queued_signals
     393)
    375394{
    376395  unsigned32 signo;
     
    421440
    422441  /* XXX status codes */
     442
    423443  /*
    424    *  XXX Allocate the siginfo pools.
     444   *  Allocate the siginfo pools.
    425445   */
    426446
     
    428448    _Chain_Initialize_empty( &_POSIX_signals_Siginfo[ signo ] );
    429449
    430   /* XXX especially the inactive pool */
     450  _Chain_Initialize(
     451    &_POSIX_signals_Inactive_siginfo,
     452    _Workspace_Allocate_or_fatal_error(
     453      maximum_queued_signals * sizeof( POSIX_signals_Siginfo_node )
     454    ),
     455    maximum_queued_signals,
     456    sizeof( POSIX_signals_Siginfo_node )
     457  );
    431458}
    432459
     
    811838}
    812839
    813 /*
    814  *  3.3.9 Queue a Signal to a Process, P1003.1b-1993, p. 78
    815  */
    816 
    817 int sigqueue(
    818   pid_t               pid,
    819   int                 signo,
    820   const union sigval  value
    821 )
    822 {
    823   return POSIX_NOT_IMPLEMENTED();
    824 }
    825 
    826 /*
     840/*PAGE
     841 *
    827842 *  3.3.2 Send a Signal to a Process, P1003.1b-1993, p. 68
    828843 *
     
    833848  ( ~(_api)->signals_blocked & (_mask) )
    834849         
    835 int kill(
    836   pid_t pid,
    837   int   sig
    838 )
    839 {
    840   sigset_t              mask;
    841   POSIX_API_Control    *api;
    842   unsigned32            the_class;
    843   unsigned32            index;
    844   unsigned32            maximum;
    845   Objects_Information  *the_info;
    846   Objects_Control     **object_table;
    847   Thread_Control       *the_thread;
    848   Thread_Control       *interested_thread;
    849   Priority_Control      interested_priority;
    850   Chain_Control        *the_chain;
    851   Chain_Node           *the_node;
     850int killinfo(
     851  pid_t               pid,
     852  int                 sig,
     853  const union sigval *value
     854)
     855{
     856  sigset_t                     mask;
     857  POSIX_API_Control           *api;
     858  unsigned32                   the_class;
     859  unsigned32                   index;
     860  unsigned32                   maximum;
     861  Objects_Information         *the_info;
     862  Objects_Control            **object_table;
     863  Thread_Control              *the_thread;
     864  Thread_Control              *interested_thread;
     865  Priority_Control             interested_priority;
     866  Chain_Control               *the_chain;
     867  Chain_Node                  *the_node;
     868  siginfo_t                    siginfo_struct;
     869  siginfo_t                   *siginfo;
     870  POSIX_signals_Siginfo_node  *psiginfo;
    852871 
    853872  /*
     
    882901  mask = signo_to_mask( sig );
    883902
     903  /*
     904   *  Build up a siginfo structure
     905   */
     906
     907  siginfo = &siginfo_struct;
     908  siginfo->si_signo = sig;
     909  siginfo->si_code = SI_USER;
     910  if ( !value ) {
     911    siginfo->si_value.sival_int = 0;
     912  } else {
     913    siginfo->si_value = *value;
     914  }
     915
    884916  _Thread_Disable_dispatch();
    885917
     
    893925  api = the_thread->API_Extensions[ THREAD_API_POSIX ];
    894926  if ( _POSIX_signals_Is_interested( api, mask ) ) {
    895     _POSIX_signals_Set_process_signals( mask );
    896927    goto process_it;
    897928  }
     
    922953    }
    923954  }
    924 
    925   /*
    926    *  Since we did not deliver the signal to the current thread or to a
    927    *  specific thread via sigwait() we will mark it as pending.
    928    */
    929 
    930   _POSIX_signals_Set_process_signals( mask );
    931955
    932956  /*
     
    10621086   */
    10631087
    1064   _Thread_Enable_dispatch();
    1065   return 0;
     1088  the_thread = NULL;
     1089  goto post_process_signal;
    10661090
    10671091  /*
     
    10731097process_it:
    10741098 
    1075   api = the_thread->API_Extensions[ THREAD_API_POSIX ];
    1076 
    10771099  the_thread->do_post_task_switch_extension = TRUE;
    10781100
    1079   _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
     1101  /*
     1102   *  Returns TRUE if the signal was synchronously given to a thread
     1103   *  blocked waiting for the signal.
     1104   */
     1105
     1106  if ( _POSIX_signals_Unblock_thread( the_thread, sig, siginfo ) ) {
     1107    _Thread_Enable_dispatch();
     1108    return 0;
     1109  }
     1110
     1111post_process_signal:
     1112
     1113  /*
     1114   *  We may have woken up a thread but we definitely need to post the
     1115   *  signal to the process wide information set.
     1116   */
     1117
     1118  _POSIX_signals_Set_process_signals( mask );
     1119
     1120  if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) {
     1121
     1122    psiginfo = (POSIX_signals_Siginfo_node *)
     1123               _Chain_Get( &_POSIX_signals_Inactive_siginfo );
     1124    if ( !psiginfo )
     1125      set_errno_and_return_minus_one( EAGAIN );
     1126
     1127    psiginfo->Info = *siginfo;
     1128
     1129    _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node );
     1130  }
    10801131
    10811132  _Thread_Enable_dispatch();
    1082 
    1083    /* XXX take this out when a little more confident */
    1084   /* SIGABRT comes from abort via assert and must work no matter what */
    1085   if ( sig == SIGABRT ) {
    1086     exit( 1 );
    1087   }
    10881133  return 0;
     1134}
     1135
     1136/*PAGE
     1137 *
     1138 *  3.3.2 Send a Signal to a Process, P1003.1b-1993, p. 68
     1139 *
     1140 *  NOTE: Behavior of kill() depends on _POSIX_SAVED_IDS.
     1141 */
     1142
     1143int kill(
     1144  pid_t pid,
     1145  int   sig
     1146)
     1147{
     1148  return killinfo( pid, sig, NULL );
     1149}
     1150
     1151/*
     1152 *  3.3.9 Queue a Signal to a Process, P1003.1b-1993, p. 78
     1153 */
     1154
     1155int sigqueue(
     1156  pid_t               pid,
     1157  int                 signo,
     1158  const union sigval  value
     1159)
     1160{
     1161  return killinfo( pid, signo, &value );
    10891162}
    10901163
     
    11071180  if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN )
    11081181    return 0;
     1182
     1183  /*
     1184   *  RTEMS does not support sending  a siginfo signal to a specific thread.
     1185   */
     1186
     1187  if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO )
     1188    return ENOSYS;
    11091189
    11101190  the_thread = _POSIX_Threads_Get( thread, &location );
     
    11261206        api->signals_pending |= signo_to_mask( sig );
    11271207
    1128         _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
     1208        (void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL );
    11291209    }
    11301210    _Thread_Enable_dispatch();
Note: See TracChangeset for help on using the changeset viewer.