diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-02-23 16:54:54 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-03-05 11:36:19 +0100 |
commit | 6157743d67c79d21996ec2cc9742fd8e4e985be7 (patch) | |
tree | bf350ddf23443f898bfd199e139fc91e9d326af8 /cpukit/posix/src/psignalunblockthread.c | |
parent | score: Update _Thread_Heir only if necessary (diff) | |
download | rtems-6157743d67c79d21996ec2cc9742fd8e4e985be7.tar.bz2 |
score: Simplify and fix signal delivery
Deliver the POSIX signals after the thread state was updated to avoid
race-conditions on SMP configurations.
Update #2273.
Diffstat (limited to 'cpukit/posix/src/psignalunblockthread.c')
-rw-r--r-- | cpukit/posix/src/psignalunblockthread.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/cpukit/posix/src/psignalunblockthread.c b/cpukit/posix/src/psignalunblockthread.c index c93dcfc1ce..c56c1502a1 100644 --- a/cpukit/posix/src/psignalunblockthread.c +++ b/cpukit/posix/src/psignalunblockthread.c @@ -35,6 +35,17 @@ #include <rtems/posix/time.h> #include <stdio.h> +static bool _POSIX_signals_Unblock_thread_done( + Thread_Control *the_thread, + POSIX_API_Control *api, + bool status +) +{ + _Thread_Add_post_switch_action( the_thread, &api->Signal_action ); + + return status; +} + bool _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, @@ -47,8 +58,6 @@ bool _POSIX_signals_Unblock_thread( api = the_thread->API_Extensions[ THREAD_API_POSIX ]; - _Thread_Add_post_switch_action( the_thread, &api->Signal_action ); - mask = signo_to_mask( signo ); /* @@ -71,14 +80,14 @@ bool _POSIX_signals_Unblock_thread( } _Thread_queue_Extract_with_proxy( the_thread ); - return true; + return _POSIX_signals_Unblock_thread_done( the_thread, api, true ); } /* * This should only be reached via pthread_kill(). */ - return false; + return _POSIX_signals_Unblock_thread_done( the_thread, api, false ); } /* @@ -111,10 +120,7 @@ bool _POSIX_signals_Unblock_thread( (void) _Watchdog_Remove( &the_thread->Timer ); _Thread_Unblock( the_thread ); } - - } else if ( the_thread->current_state == STATES_READY ) { - _Thread_Signal_notification( the_thread ); } } - return false; + return _POSIX_signals_Unblock_thread_done( the_thread, api, false ); } |