diff options
Diffstat (limited to 'cpukit/rtems/src/signalsend.c')
-rw-r--r-- | cpukit/rtems/src/signalsend.c | 74 |
1 files changed, 36 insertions, 38 deletions
diff --git a/cpukit/rtems/src/signalsend.c b/cpukit/rtems/src/signalsend.c index 4153e407f4..162de5c7c8 100644 --- a/cpukit/rtems/src/signalsend.c +++ b/cpukit/rtems/src/signalsend.c @@ -21,7 +21,7 @@ #include <rtems/rtems/signalimpl.h> #include <rtems/rtems/asrimpl.h> #include <rtems/rtems/tasks.h> -#include <rtems/score/isr.h> +#include <rtems/score/threaddispatch.h> #include <rtems/score/threadimpl.h> rtems_status_code rtems_signal_send( @@ -29,50 +29,48 @@ rtems_status_code rtems_signal_send( rtems_signal_set signal_set ) { - Thread_Control *the_thread; - Objects_Locations location; - RTEMS_API_Control *api; - ASR_Information *asr; + Thread_Control *the_thread; + ISR_lock_Context lock_context; + RTEMS_API_Control *api; + ASR_Information *asr; - if ( !signal_set ) + if ( signal_set == 0 ) { return RTEMS_INVALID_NUMBER; + } - the_thread = _Thread_Get( id, &location ); - switch ( location ) { - - case OBJECTS_LOCAL: - api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; - asr = &api->Signal; - - if ( ! _ASR_Is_null_handler( asr->handler ) ) { - if ( asr->is_enabled ) { - _ASR_Post_signals( asr, signal_set, &asr->signals_posted ); - _Thread_Add_post_switch_action( - the_thread, - &api->Signal_action, - _Signal_Action_handler - ); - } else { - _ASR_Post_signals( asr, signal_set, &asr->signals_pending ); - } - _Objects_Put( &the_thread->Object ); - return RTEMS_SUCCESSFUL; - } - _Objects_Put( &the_thread->Object ); - return RTEMS_NOT_DEFINED; + the_thread = _Thread_Get_interrupt_disable( id, &lock_context ); + if ( the_thread == NULL ) { #if defined(RTEMS_MULTIPROCESSING) - case OBJECTS_REMOTE: - return _Signal_MP_Send_request_packet( - SIGNAL_MP_SEND_REQUEST, - id, - signal_set - ); + return _Signal_MP_Send( id, signal_set ); +#else + return RTEMS_INVALID_ID; #endif + } + + api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; + asr = &api->Signal; + + _ASR_Acquire_critical( asr, &lock_context ); + + if ( _ASR_Is_null_handler( asr->handler ) ) { + _ASR_Release( asr, &lock_context ); + return RTEMS_NOT_DEFINED; + } - case OBJECTS_ERROR: - break; + if ( asr->is_enabled ) { + _ASR_Post_signals( signal_set, &asr->signals_posted ); + _ASR_Release( asr, &lock_context ); + _Thread_Add_post_switch_action( + the_thread, + &api->Signal_action, + _Signal_Action_handler + ); + _Thread_Dispatch(); + } else { + _ASR_Post_signals( signal_set, &asr->signals_pending ); + _ASR_Release( asr, &lock_context ); } - return RTEMS_INVALID_ID; + return RTEMS_SUCCESSFUL; } |