summaryrefslogtreecommitdiffstats
path: root/cpukit/score/include/rtems
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2017-07-07 08:30:20 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2017-07-10 07:49:40 +0200
commit4a1bdd3045fa00c95924deb27bc0ffab7e8aaf14 (patch)
tree78f8c214621f231217d44ec7732be144627d2d6a /cpukit/score/include/rtems
parentscore: Add simple affinity support to EDF SMP (diff)
downloadrtems-4a1bdd3045fa00c95924deb27bc0ffab7e8aaf14.tar.bz2
score: Fix set scheduler
Ensure that the thread processor affinity fits the new scheduler instance. Update #3059.
Diffstat (limited to 'cpukit/score/include/rtems')
-rw-r--r--cpukit/score/include/rtems/score/schedulerimpl.h18
1 files changed, 13 insertions, 5 deletions
diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h
index cb9fd7e841..85fcace760 100644
--- a/cpukit/score/include/rtems/score/schedulerimpl.h
+++ b/cpukit/score/include/rtems/score/schedulerimpl.h
@@ -1092,10 +1092,22 @@ RTEMS_INLINE_ROUTINE Status_Control _Scheduler_Set(
}
old_scheduler = _Thread_Scheduler_get_home( the_thread );
+ new_scheduler_node = _Thread_Scheduler_get_node_by_index(
+ the_thread,
+ _Scheduler_Get_index( new_scheduler )
+ );
_Scheduler_Acquire_critical( new_scheduler, &lock_context );
- if ( _Scheduler_Get_processor_count( new_scheduler ) == 0 ) {
+ if (
+ _Scheduler_Get_processor_count( new_scheduler ) == 0
+ || !( *new_scheduler->Operations.set_affinity )(
+ new_scheduler,
+ the_thread,
+ new_scheduler_node,
+ &the_thread->Scheduler.Affinity
+ )
+ ) {
_Scheduler_Release_critical( new_scheduler, &lock_context );
_Priority_Plain_insert(
&old_scheduler_node->Wait.Priority,
@@ -1110,10 +1122,6 @@ RTEMS_INLINE_ROUTINE Status_Control _Scheduler_Set(
_Scheduler_Release_critical( new_scheduler, &lock_context );
_Thread_Scheduler_process_requests( the_thread );
- new_scheduler_node = _Thread_Scheduler_get_node_by_index(
- the_thread,
- _Scheduler_Get_index( new_scheduler )
- );
#else
new_scheduler_node = old_scheduler_node;
#endif