summaryrefslogtreecommitdiffstats
path: root/cpukit/score/include/rtems/score/schedulerimpl.h
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-02-26 10:33:36 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-03-05 11:36:19 +0100
commitb8a5abf3fafa9df7cc0354c0ada6192c38e78354 (patch)
treea20b108ecbf95fa3e401a8073d7f35603b4bf2e1 /cpukit/score/include/rtems/score/schedulerimpl.h
parentscore: Add and use PRIORITY_PSEUDO_ISR (diff)
downloadrtems-b8a5abf3fafa9df7cc0354c0ada6192c38e78354.tar.bz2
score: Update _Thread_Heir only if necessary
Previously, the _Thread_Heir was updated unconditionally in case a new heir was determined. The _Thread_Dispatch_necessary was only updated in case the executing thread was preemptible or an internal thread was unblocked. Change this to update the _Thread_Heir and _Thread_Dispatch_necessary only in case the currently selected heir thread is preemptible or a dispatch is forced. Move the schedule decision into the change priority operation and use the schedule operation only in rtems_task_mode() in case preemption is enabled or an ASR dispatch is necessary. This is a behaviour change. Previously, the RTEMS_NO_PREEMPT also prevented signal delivery in certain cases (not always). Now, signal delivery is no longer influenced by RTEMS_NO_PREEMPT. Since the currently selected heir thread is used to determine if a new heir is chosen, non-preemptible heir threads currently not executing now prevent a new heir. This may have an application impact, see change test tm04. Document this change in sp04. Update #2273.
Diffstat (limited to 'cpukit/score/include/rtems/score/schedulerimpl.h')
-rw-r--r--cpukit/score/include/rtems/score/schedulerimpl.h15
1 files changed, 9 insertions, 6 deletions
diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h
index 31ae6d184d..7bf4038b5e 100644
--- a/cpukit/score/include/rtems/score/schedulerimpl.h
+++ b/cpukit/score/include/rtems/score/schedulerimpl.h
@@ -314,6 +314,9 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Unblock( Thread_Control *the_thread )
* must ensure that the priority value actually changed and is not equal to the
* current priority value.
*
+ * The operation must update the heir and thread dispatch necessary variables
+ * in case the set of scheduled threads changes.
+ *
* @param[in] the_thread The thread changing its priority.
* @param[in] new_priority The new thread priority.
* @param[in] prepend_it In case this is true, then enqueue the thread as the
@@ -630,16 +633,16 @@ bool _Scheduler_Set_affinity(
#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
RTEMS_INLINE_ROUTINE void _Scheduler_Update_heir(
- Thread_Control *heir,
- bool force_dispatch
+ Thread_Control *new_heir,
+ bool force_dispatch
)
{
- Thread_Control *executing = _Thread_Executing;
-
- _Thread_Heir = heir;
+ Thread_Control *heir = _Thread_Heir;
- if ( executing != heir && ( force_dispatch || executing->is_preemptible ) )
+ if ( heir != new_heir && ( heir->is_preemptible || force_dispatch ) ) {
+ _Thread_Heir = new_heir;
_Thread_Dispatch_necessary = true;
+ }
}
RTEMS_INLINE_ROUTINE void _Scheduler_Generic_block(