summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/schedulersetaffinity.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/src/schedulersetaffinity.c')
-rw-r--r--cpukit/score/src/schedulersetaffinity.c31
1 files changed, 23 insertions, 8 deletions
diff --git a/cpukit/score/src/schedulersetaffinity.c b/cpukit/score/src/schedulersetaffinity.c
index 2416a195c5..a20888b617 100644
--- a/cpukit/score/src/schedulersetaffinity.c
+++ b/cpukit/score/src/schedulersetaffinity.c
@@ -21,7 +21,6 @@
#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
bool _Scheduler_Set_affinity(
- const Scheduler_Control *scheduler,
Thread_Control *the_thread,
size_t cpusetsize,
const cpu_set_t *cpuset
@@ -31,15 +30,31 @@ bool _Scheduler_Set_affinity(
if ( _CPU_set_Is_large_enough( cpusetsize ) ) {
#if defined(RTEMS_SMP)
- ok = ( *scheduler->Operations.set_affinity )(
- scheduler,
- the_thread,
- cpusetsize,
- cpuset
- );
+ uint32_t cpu_count = _SMP_Get_processor_count();
+ uint32_t cpu_index;
+
+ ok = false;
+
+ for ( cpu_index = 0 ; cpu_index < cpu_count ; ++cpu_index ) {
+ if ( CPU_ISSET_S( (int) cpu_index, cpusetsize, cpuset ) ) {
+ const Scheduler_Control *scheduler_of_cpu =
+ _Scheduler_Get_by_CPU_index( cpu_index );
+
+ if ( scheduler_of_cpu != NULL ) {
+ ok = ( *scheduler_of_cpu->Operations.set_affinity )(
+ scheduler_of_cpu,
+ the_thread,
+ cpusetsize,
+ cpuset
+ );
+ }
+
+ break;
+ }
+ }
#else
ok = _Scheduler_default_Set_affinity_body(
- scheduler,
+ _Scheduler_Get( the_thread ),
the_thread,
cpusetsize,
cpuset