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.
This commit is contained in:
Joel Sherrill
1996-06-13 16:42:21 +00:00
parent 7fc3029a59
commit b85649c47b
4 changed files with 126 additions and 22 deletions

View File

@@ -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 /*PAGE
* *
* _POSIX_signals_Check_signal * _POSIX_signals_Check_signal
@@ -199,7 +235,7 @@ boolean _POSIX_signals_Check_signal(
_ISR_Disable( level ); _ISR_Disable( level );
if ( is_global ) { if ( is_global ) {
if ( mask & (_POSIX_signals_Pending & ~api->signals_blocked ) ) { if ( mask & (_POSIX_signals_Pending & ~api->signals_blocked ) ) {
_POSIX_signals_Pending &= ~mask; _POSIX_signals_Clear_process_signals( mask );
do_callout = TRUE; do_callout = TRUE;
} }
} else { } else {
@@ -286,9 +322,10 @@ void _POSIX_signals_Post_switch_extension(
restart: restart:
_ISR_Disable( level ); _ISR_Disable( level );
if ( !(~api->signals_blocked & if ( !(~api->signals_blocked &
(api->signals_pending | _POSIX_signals_Pending)) ) (api->signals_pending | _POSIX_signals_Pending)) ) {
return;
_ISR_Enable( level ); _ISR_Enable( level );
return;
}
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
@@ -322,7 +359,11 @@ void _POSIX_signals_Alarm_TSR(
void *argument 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 /*PAGE
@@ -517,9 +558,9 @@ int sigaction(
if ( act->sa_handler == SIG_DFL ) { if ( act->sa_handler == SIG_DFL ) {
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ]; _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
} else if ( act->sa_handler == SIG_DFL ) { } else if ( act->sa_handler == SIG_DFL ) {
_POSIX_signals_Pending &= ~signo_to_mask( sig ); _POSIX_signals_Clear_process_signals( signo_to_mask(sig) );
} else { } else {
_POSIX_signals_Pending &= ~signo_to_mask( sig ); _POSIX_signals_Clear_process_signals( signo_to_mask(sig) );
_POSIX_signals_Vectors[ sig ] = *act; _POSIX_signals_Vectors[ sig ] = *act;
} }
_ISR_Enable( level ); _ISR_Enable( level );
@@ -851,7 +892,7 @@ int kill(
api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) { if ( _POSIX_signals_Is_interested( api, mask ) ) {
_POSIX_signals_Pending |= mask; _POSIX_signals_Set_process_signals( mask );
goto process_it; goto process_it;
} }
@@ -886,7 +927,7 @@ int kill(
* specific thread via sigwait() we will mark it as pending. * 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 * Is any other thread interested? The highest priority interested
@@ -924,8 +965,6 @@ int kill(
assert( object_table ); /* always at least 1 entry */ assert( object_table ); /* always at least 1 entry */
object_table++; /* skip entry 0 */
for ( index = 1 ; index <= maximum ; index++ ) { for ( index = 1 ; index <= maximum ; index++ ) {
the_thread = (Thread_Control *) object_table[ index ]; the_thread = (Thread_Control *) object_table[ index ];

View File

@@ -117,6 +117,7 @@ boolean _POSIX_Threads_Create_extension(
created->API_Extensions[ THREAD_API_POSIX ] = api; created->API_Extensions[ THREAD_API_POSIX ] = api;
/* XXX check all fields are touched */
api->Attributes = _POSIX_Threads_Default_attributes; api->Attributes = _POSIX_Threads_Default_attributes;
api->detachstate = _POSIX_Threads_Default_attributes.detachstate; api->detachstate = _POSIX_Threads_Default_attributes.detachstate;
api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy; api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy;
@@ -124,6 +125,18 @@ boolean _POSIX_Threads_Create_extension(
api->schedparam.sched_priority = api->schedparam.sched_priority =
_POSIX_Priority_From_core( created->current_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 */ /* XXX set signal parameters -- block all signals for non-posix threads */
_Thread_queue_Initialize( _Thread_queue_Initialize(

View File

@@ -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 /*PAGE
* *
* _POSIX_signals_Check_signal * _POSIX_signals_Check_signal
@@ -199,7 +235,7 @@ boolean _POSIX_signals_Check_signal(
_ISR_Disable( level ); _ISR_Disable( level );
if ( is_global ) { if ( is_global ) {
if ( mask & (_POSIX_signals_Pending & ~api->signals_blocked ) ) { if ( mask & (_POSIX_signals_Pending & ~api->signals_blocked ) ) {
_POSIX_signals_Pending &= ~mask; _POSIX_signals_Clear_process_signals( mask );
do_callout = TRUE; do_callout = TRUE;
} }
} else { } else {
@@ -286,9 +322,10 @@ void _POSIX_signals_Post_switch_extension(
restart: restart:
_ISR_Disable( level ); _ISR_Disable( level );
if ( !(~api->signals_blocked & if ( !(~api->signals_blocked &
(api->signals_pending | _POSIX_signals_Pending)) ) (api->signals_pending | _POSIX_signals_Pending)) ) {
return;
_ISR_Enable( level ); _ISR_Enable( level );
return;
}
for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) {
@@ -322,7 +359,11 @@ void _POSIX_signals_Alarm_TSR(
void *argument 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 /*PAGE
@@ -517,9 +558,9 @@ int sigaction(
if ( act->sa_handler == SIG_DFL ) { if ( act->sa_handler == SIG_DFL ) {
_POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ]; _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ];
} else if ( act->sa_handler == SIG_DFL ) { } else if ( act->sa_handler == SIG_DFL ) {
_POSIX_signals_Pending &= ~signo_to_mask( sig ); _POSIX_signals_Clear_process_signals( signo_to_mask(sig) );
} else { } else {
_POSIX_signals_Pending &= ~signo_to_mask( sig ); _POSIX_signals_Clear_process_signals( signo_to_mask(sig) );
_POSIX_signals_Vectors[ sig ] = *act; _POSIX_signals_Vectors[ sig ] = *act;
} }
_ISR_Enable( level ); _ISR_Enable( level );
@@ -851,7 +892,7 @@ int kill(
api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api = the_thread->API_Extensions[ THREAD_API_POSIX ];
if ( _POSIX_signals_Is_interested( api, mask ) ) { if ( _POSIX_signals_Is_interested( api, mask ) ) {
_POSIX_signals_Pending |= mask; _POSIX_signals_Set_process_signals( mask );
goto process_it; goto process_it;
} }
@@ -886,7 +927,7 @@ int kill(
* specific thread via sigwait() we will mark it as pending. * 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 * Is any other thread interested? The highest priority interested
@@ -924,8 +965,6 @@ int kill(
assert( object_table ); /* always at least 1 entry */ assert( object_table ); /* always at least 1 entry */
object_table++; /* skip entry 0 */
for ( index = 1 ; index <= maximum ; index++ ) { for ( index = 1 ; index <= maximum ; index++ ) {
the_thread = (Thread_Control *) object_table[ index ]; the_thread = (Thread_Control *) object_table[ index ];

View File

@@ -117,6 +117,7 @@ boolean _POSIX_Threads_Create_extension(
created->API_Extensions[ THREAD_API_POSIX ] = api; created->API_Extensions[ THREAD_API_POSIX ] = api;
/* XXX check all fields are touched */
api->Attributes = _POSIX_Threads_Default_attributes; api->Attributes = _POSIX_Threads_Default_attributes;
api->detachstate = _POSIX_Threads_Default_attributes.detachstate; api->detachstate = _POSIX_Threads_Default_attributes.detachstate;
api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy; api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy;
@@ -124,6 +125,18 @@ boolean _POSIX_Threads_Create_extension(
api->schedparam.sched_priority = api->schedparam.sched_priority =
_POSIX_Priority_From_core( created->current_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 */ /* XXX set signal parameters -- block all signals for non-posix threads */
_Thread_queue_Initialize( _Thread_queue_Initialize(