forked from Imagelibrary/rtems
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:
@@ -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 ];
|
||||||
|
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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 ];
|
||||||
|
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user