Changeset adae080a in rtems
- Timestamp:
- 07/15/96 14:02:14 (27 years ago)
- Branches:
- 4.10, 4.11, 4.8, 4.9, 5, master
- Children:
- c65a0cee
- Parents:
- 69c9543
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
c/src/exec/posix/src/psignal.c
r69c9543 radae080a 54 54 struct sigaction _POSIX_signals_Default_vectors[ SIG_ARRAY_MAX ] = { 55 55 /* 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, 74 75 /* SIGRT 19 */ SIGACTION_IGNORE, 75 76 /* SIGRT 20 */ SIGACTION_IGNORE, … … 218 219 /*PAGE 219 220 * 220 * _POSIX_signals_C heck_signal221 */ 222 223 boolean _POSIX_signals_C heck_signal(221 * _POSIX_signals_Clear_signals 222 */ 223 224 boolean _POSIX_signals_Clear_signals( 224 225 POSIX_API_Control *api, 225 226 int signo, 226 boolean is_global 227 siginfo_t *info, 228 boolean is_global, 229 boolean check_blocked 227 230 ) 228 231 { … … 231 234 boolean do_callout; 232 235 POSIX_signals_Siginfo_node *psiginfo; 233 siginfo_t siginfo_struct; 234 sigset_t saved_signals_blocked; 235 236 236 237 mask = signo_to_mask( signo ); 237 238 238 239 do_callout = FALSE; 239 240 240 241 /* XXX this is not right for siginfo type signals yet */ 241 242 /* XXX since they can't be cleared the same way */ 242 243 243 244 _ISR_Disable( level ); 244 245 if ( is_global ) { 245 if ( mask & (_POSIX_signals_Pending & ~api->signals_blocked ) ) { 246 if ( mask & (_POSIX_signals_Pending & 247 (~api->signals_blocked & check_blocked) ) ) { 246 248 if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) { 247 249 psiginfo = (POSIX_signals_Siginfo_node *) … … 250 252 _POSIX_signals_Clear_process_signals( mask ); 251 253 if ( psiginfo ) { 252 siginfo_struct= psiginfo->Info;254 *info = psiginfo->Info; 253 255 _Chain_Append_unprotected( 254 256 &_POSIX_signals_Inactive_siginfo, … … 262 264 } 263 265 } else { 264 if ( mask & (api->signals_pending & ~api->signals_blocked ) ) { 266 if ( mask & (api->signals_pending & 267 (~api->signals_blocked & check_blocked) ) ) { 265 268 api->signals_pending &= ~mask; 266 269 do_callout = TRUE; … … 268 271 } 269 272 _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 282 boolean _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 ) ) 272 293 return FALSE; 273 294 … … 583 604 if ( act ) { 584 605 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 585 611 _ISR_Disable( level ); 586 612 if ( act->sa_handler == SIG_DFL ) { 587 613 _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) );590 614 } else { 591 615 _POSIX_signals_Clear_process_signals( signo_to_mask(sig) ); 592 _POSIX_signals_Vectors[ sig ] = *act;616 _POSIX_signals_Vectors[ sig ] = *act; 593 617 } 594 618 _ISR_Enable( level ); … … 793 817 /* XXX real info later */ 794 818 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 ); 795 821 the_info->si_code = SI_USER; 796 822 the_info->si_value.sival_int = 0; … … 800 826 /* Process pending signals? */ 801 827 802 #warning "Mark fix me"803 828 if ( *set & _POSIX_signals_Pending) { 804 829 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 ) { 806 833 the_info->si_signo = signo; 807 834 the_info->si_code = SI_USER; 808 835 the_info->si_value.sival_int = 0; 809 } else {810 #warning "_POSIX_signals_Siginfo is an array of chains.... "811 #if 0812 *the_info = *_POSIX_signals_Siginfo[ signo ];813 #endif814 836 } 815 837 } -
cpukit/posix/src/psignal.c
r69c9543 radae080a 54 54 struct sigaction _POSIX_signals_Default_vectors[ SIG_ARRAY_MAX ] = { 55 55 /* 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, 74 75 /* SIGRT 19 */ SIGACTION_IGNORE, 75 76 /* SIGRT 20 */ SIGACTION_IGNORE, … … 218 219 /*PAGE 219 220 * 220 * _POSIX_signals_C heck_signal221 */ 222 223 boolean _POSIX_signals_C heck_signal(221 * _POSIX_signals_Clear_signals 222 */ 223 224 boolean _POSIX_signals_Clear_signals( 224 225 POSIX_API_Control *api, 225 226 int signo, 226 boolean is_global 227 siginfo_t *info, 228 boolean is_global, 229 boolean check_blocked 227 230 ) 228 231 { … … 231 234 boolean do_callout; 232 235 POSIX_signals_Siginfo_node *psiginfo; 233 siginfo_t siginfo_struct; 234 sigset_t saved_signals_blocked; 235 236 236 237 mask = signo_to_mask( signo ); 237 238 238 239 do_callout = FALSE; 239 240 240 241 /* XXX this is not right for siginfo type signals yet */ 241 242 /* XXX since they can't be cleared the same way */ 242 243 243 244 _ISR_Disable( level ); 244 245 if ( is_global ) { 245 if ( mask & (_POSIX_signals_Pending & ~api->signals_blocked ) ) { 246 if ( mask & (_POSIX_signals_Pending & 247 (~api->signals_blocked & check_blocked) ) ) { 246 248 if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) { 247 249 psiginfo = (POSIX_signals_Siginfo_node *) … … 250 252 _POSIX_signals_Clear_process_signals( mask ); 251 253 if ( psiginfo ) { 252 siginfo_struct= psiginfo->Info;254 *info = psiginfo->Info; 253 255 _Chain_Append_unprotected( 254 256 &_POSIX_signals_Inactive_siginfo, … … 262 264 } 263 265 } else { 264 if ( mask & (api->signals_pending & ~api->signals_blocked ) ) { 266 if ( mask & (api->signals_pending & 267 (~api->signals_blocked & check_blocked) ) ) { 265 268 api->signals_pending &= ~mask; 266 269 do_callout = TRUE; … … 268 271 } 269 272 _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 282 boolean _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 ) ) 272 293 return FALSE; 273 294 … … 583 604 if ( act ) { 584 605 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 585 611 _ISR_Disable( level ); 586 612 if ( act->sa_handler == SIG_DFL ) { 587 613 _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) );590 614 } else { 591 615 _POSIX_signals_Clear_process_signals( signo_to_mask(sig) ); 592 _POSIX_signals_Vectors[ sig ] = *act;616 _POSIX_signals_Vectors[ sig ] = *act; 593 617 } 594 618 _ISR_Enable( level ); … … 793 817 /* XXX real info later */ 794 818 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 ); 795 821 the_info->si_code = SI_USER; 796 822 the_info->si_value.sival_int = 0; … … 800 826 /* Process pending signals? */ 801 827 802 #warning "Mark fix me"803 828 if ( *set & _POSIX_signals_Pending) { 804 829 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 ) { 806 833 the_info->si_signo = signo; 807 834 the_info->si_code = SI_USER; 808 835 the_info->si_value.sival_int = 0; 809 } else {810 #warning "_POSIX_signals_Siginfo is an array of chains.... "811 #if 0812 *the_info = *_POSIX_signals_Siginfo[ signo ];813 #endif814 836 } 815 837 }
Note: See TracChangeset
for help on using the changeset viewer.