From b85649c47b1510c981fece87d9b27c8534717ab0 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 13 Jun 1996 16:42:21 +0000 Subject: basic test cases for kill() and alarm(). kill() in particular needs more test cases for full coverage. The search for a thread interested in this signal has a lot of paths. --- cpukit/posix/src/psignal.c | 61 +++++++++++++++++++++++++++++++++++++--------- cpukit/posix/src/pthread.c | 13 ++++++++++ 2 files changed, 63 insertions(+), 11 deletions(-) (limited to 'cpukit/posix') diff --git a/cpukit/posix/src/psignal.c b/cpukit/posix/src/psignal.c index 42f22aa795..312e3d0d38 100644 --- a/cpukit/posix/src/psignal.c +++ b/cpukit/posix/src/psignal.c @@ -171,6 +171,42 @@ void _POSIX_signals_Unblock_thread( } +/*PAGE + * + * _POSIX_signals_Set_process_signals + */ + +void _POSIX_signals_Set_process_signals( + sigset_t mask +) +{ + ISR_Level level; + + _ISR_Disable( level ); + if ( !_POSIX_signals_Pending ) + _Thread_Do_post_task_switch_extension++; + _POSIX_signals_Pending |= mask; + _ISR_Enable( level ); +} + +/*PAGE + * + * _POSIX_signals_Clear_process_signals + */ + +void _POSIX_signals_Clear_process_signals( + sigset_t mask +) +{ + ISR_Level level; + + _ISR_Disable( level ); + _POSIX_signals_Pending &= ~mask; + if ( !_POSIX_signals_Pending ) + _Thread_Do_post_task_switch_extension--; + _ISR_Enable( level ); +} + /*PAGE * * _POSIX_signals_Check_signal @@ -199,7 +235,7 @@ boolean _POSIX_signals_Check_signal( _ISR_Disable( level ); if ( is_global ) { if ( mask & (_POSIX_signals_Pending & ~api->signals_blocked ) ) { - _POSIX_signals_Pending &= ~mask; + _POSIX_signals_Clear_process_signals( mask ); do_callout = TRUE; } } else { @@ -286,9 +322,10 @@ void _POSIX_signals_Post_switch_extension( restart: _ISR_Disable( level ); if ( !(~api->signals_blocked & - (api->signals_pending | _POSIX_signals_Pending)) ) - return; - _ISR_Enable( level ); + (api->signals_pending | _POSIX_signals_Pending)) ) { + _ISR_Enable( level ); + return; + } for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { @@ -322,7 +359,11 @@ void _POSIX_signals_Alarm_TSR( void *argument ) { - kill( getpid(), SIGALRM ); + int status; + + status = kill( getpid(), SIGALRM ); + /* XXX can't print from an ISR, should this be fatal? */ + assert( !status ); } /*PAGE @@ -517,9 +558,9 @@ int sigaction( if ( act->sa_handler == SIG_DFL ) { _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ]; } else if ( act->sa_handler == SIG_DFL ) { - _POSIX_signals_Pending &= ~signo_to_mask( sig ); + _POSIX_signals_Clear_process_signals( signo_to_mask(sig) ); } else { - _POSIX_signals_Pending &= ~signo_to_mask( sig ); + _POSIX_signals_Clear_process_signals( signo_to_mask(sig) ); _POSIX_signals_Vectors[ sig ] = *act; } _ISR_Enable( level ); @@ -851,7 +892,7 @@ int kill( api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( _POSIX_signals_Is_interested( api, mask ) ) { - _POSIX_signals_Pending |= mask; + _POSIX_signals_Set_process_signals( mask ); goto process_it; } @@ -886,7 +927,7 @@ int kill( * specific thread via sigwait() we will mark it as pending. */ - _POSIX_signals_Pending |= mask; + _POSIX_signals_Set_process_signals( mask ); /* * Is any other thread interested? The highest priority interested @@ -924,8 +965,6 @@ int kill( assert( object_table ); /* always at least 1 entry */ - object_table++; /* skip entry 0 */ - for ( index = 1 ; index <= maximum ; index++ ) { the_thread = (Thread_Control *) object_table[ index ]; diff --git a/cpukit/posix/src/pthread.c b/cpukit/posix/src/pthread.c index 957c2a717e..dd8027c4f2 100644 --- a/cpukit/posix/src/pthread.c +++ b/cpukit/posix/src/pthread.c @@ -117,6 +117,7 @@ boolean _POSIX_Threads_Create_extension( created->API_Extensions[ THREAD_API_POSIX ] = api; + /* XXX check all fields are touched */ api->Attributes = _POSIX_Threads_Default_attributes; api->detachstate = _POSIX_Threads_Default_attributes.detachstate; api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy; @@ -124,6 +125,18 @@ boolean _POSIX_Threads_Create_extension( api->schedparam.sched_priority = _POSIX_Priority_From_core( created->current_priority ); + /* + * If the thread is not a posix thread, then all posix signals are blocked + * by default. + */ + + /* XXX use signal constants */ + api->signals_pending = 0; + if ( _Objects_Get_class( created->Object.id ) == OBJECTS_POSIX_THREADS ) + api->signals_blocked = 0; + else + api->signals_blocked = 0xffffffff; + /* XXX set signal parameters -- block all signals for non-posix threads */ _Thread_queue_Initialize( -- cgit v1.2.3