diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-11-10 17:23:12 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-11-12 08:21:45 +0100 |
commit | b84a51c8a48b1bba6cf5ecea4a226f47e39ef22b (patch) | |
tree | 065e23c74513ff7c04b674cfbf675507073c881c /cpukit/rtems/src/eventseize.c | |
parent | irq-server: Fix race condition on SMP systems (diff) | |
download | rtems-b84a51c8a48b1bba6cf5ecea4a226f47e39ef22b.tar.bz2 |
score: Fix race condition on SMP
We must ensure that the Thread_Control::Wait information update is
visible to the target thread before we update its wait flags, otherwise
we may return out of date events or a wrong status.
Diffstat (limited to 'cpukit/rtems/src/eventseize.c')
-rw-r--r-- | cpukit/rtems/src/eventseize.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/cpukit/rtems/src/eventseize.c b/cpukit/rtems/src/eventseize.c index a9290b38e8..9c41b777f9 100644 --- a/cpukit/rtems/src/eventseize.c +++ b/cpukit/rtems/src/eventseize.c @@ -100,6 +100,12 @@ void _Event_Seize( _Thread_Set_state( executing, block_state ); + /* + * See _Event_Surrender() and _Thread_Timeout(), corresponding atomic + * variable is Thread_Control::Wait::flags. + */ + _Atomic_Fence( ATOMIC_ORDER_ACQUIRE ); + success = _Thread_Wait_flags_try_change( executing, intend_to_block, |