summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-07-29 15:06:02 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-08-05 15:52:32 +0200
commitbfed5d5d15c814ebc9aefc988756fba14238f3f0 (patch)
tree8fe704783255a0d91f17134be44e4e1ea486ef45
parentarm: Fix CPU_MODES_INTERRUPT_MASK (diff)
downloadrtems-bfed5d5d15c814ebc9aefc988756fba14238f3f0.tar.bz2
smp: Support ASR path in rtems_task_mode()
-rw-r--r--cpukit/rtems/src/taskmode.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/cpukit/rtems/src/taskmode.c b/cpukit/rtems/src/taskmode.c
index 3d6dee8105..606366b25f 100644
--- a/cpukit/rtems/src/taskmode.c
+++ b/cpukit/rtems/src/taskmode.c
@@ -32,11 +32,25 @@ static void _RTEMS_Tasks_Dispatch_if_necessary(
if ( _Thread_Dispatch_is_enabled() ) {
bool dispatch_necessary = needs_asr_dispatching;
+ /*
+ * FIXME: This locking approach is brittle. It only works since the
+ * current simple SMP scheduler has no support for the non-preempt mode.
+ */
+#if defined( RTEMS_SMP )
+ ISR_Level level;
+
+ _ISR_Disable( level );
+#endif
+
if ( !_Thread_Is_heir( executing ) && executing->is_preemptible ) {
dispatch_necessary = true;
_Thread_Dispatch_necessary = dispatch_necessary;
}
+#if defined( RTEMS_SMP )
+ _ISR_Enable( level );
+#endif
+
if ( dispatch_necessary ) {
_Thread_Dispatch();
}