summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-02-20 17:05:44 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-02-21 09:38:25 +0100
commit7ee4e72e4b2052139d296100f0836403906bd317 (patch)
tree553cc802f9d23cf66b9edb495bea37f3dd3137bc
parentscore: Rename _Internal_error_Occurred() (diff)
downloadrtems-7ee4e72e4b2052139d296100f0836403906bd317.tar.bz2
score: _Thread_Start_multitasking()
Fix serious race-condition. Read the heir after the per-CPU lock acquire.
-rw-r--r--cpukit/score/src/threadstartmultitasking.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/cpukit/score/src/threadstartmultitasking.c b/cpukit/score/src/threadstartmultitasking.c
index b05ccb48c3..d73e5b4194 100644
--- a/cpukit/score/src/threadstartmultitasking.c
+++ b/cpukit/score/src/threadstartmultitasking.c
@@ -23,7 +23,7 @@
void _Thread_Start_multitasking( void )
{
Per_CPU_Control *self_cpu = _Per_CPU_Get();
- Thread_Control *heir = self_cpu->heir;
+ Thread_Control *heir;
#if defined(RTEMS_SMP)
_Per_CPU_Change_state( self_cpu, PER_CPU_STATE_UP );
@@ -35,7 +35,11 @@ void _Thread_Start_multitasking( void )
*/
_Per_CPU_Acquire( self_cpu );
self_cpu->thread_dispatch_disable_level = 1;
+#endif
+
+ heir = self_cpu->heir;
+#if defined(RTEMS_SMP)
self_cpu->executing->is_executing = false;
heir->is_executing = true;
#endif