summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/signalsend.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/rtems/src/signalsend.c')
-rw-r--r--cpukit/rtems/src/signalsend.c74
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;
}