diff options
author | Jennifer Averett <jennifer.averett@oarcorp.com> | 2014-03-19 15:20:01 -0500 |
---|---|---|
committer | Jennifer Averett <jennifer.averett@oarcorp.com> | 2014-04-03 10:48:56 -0500 |
commit | 56c396ba476a48c4f2a4fdd488f704dd76dbddec (patch) | |
tree | d46a5658806776a34fcd5604f815ecdd87040a07 /cpukit/score/src/schedulerpriorityaffinitysmp.c | |
parent | score: score: Add get/set affinity to Scheduler Framework. (diff) | |
download | rtems-56c396ba476a48c4f2a4fdd488f704dd76dbddec.tar.bz2 |
score: Add priority affinity smp scheduler.
Diffstat (limited to 'cpukit/score/src/schedulerpriorityaffinitysmp.c')
-rw-r--r-- | cpukit/score/src/schedulerpriorityaffinitysmp.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/cpukit/score/src/schedulerpriorityaffinitysmp.c b/cpukit/score/src/schedulerpriorityaffinitysmp.c new file mode 100644 index 0000000000..6d7dd3b7d9 --- /dev/null +++ b/cpukit/score/src/schedulerpriorityaffinitysmp.c @@ -0,0 +1,80 @@ +/** + * @file + * + * @brief Deterministic Priority Affinity SMP Scheduler Implementation + * + * @ingroup ScoreSchedulerPriorityAffinitySMP + */ + +/* + * COPYRIGHT (c) 2014. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#if HAVE_CONFIG_H + #include "config.h" +#endif + +#include <rtems/score/schedulerpriorityaffinitysmp.h> +#include <rtems/score/schedulerpriorityimpl.h> +#include <rtems/score/schedulersmpimpl.h> +#include <rtems/score/wkspace.h> +#include <rtems/score/cpusetimpl.h> + +RTEMS_INLINE_ROUTINE Scheduler_priority_affinity_SMP_Per_thread * +_Scheduler_priority_affinity_Get_scheduler_info( Thread_Control *thread ) +{ + return ( Scheduler_priority_affinity_SMP_Per_thread * ) thread->scheduler_info; +} + +void * _Scheduler_priority_affinity_SMP_Allocate( Thread_Control *the_thread ) +{ + Scheduler_priority_affinity_SMP_Per_thread *info = + _Workspace_Allocate( sizeof( *info ) ); + + info->Affinity = *_CPU_set_Default(); + info->Affinity.set = &info->Affinity.preallocated; + + the_thread->scheduler_info = info; + + return info; +} + +bool _Scheduler_priority_affinity_SMP_Get_affinity( + Thread_Control *thread, + size_t cpusetsize, + cpu_set_t *cpuset +) +{ + Scheduler_priority_affinity_SMP_Per_thread *info = + _Scheduler_priority_affinity_Get_scheduler_info(thread); + + if ( info->Affinity.setsize != cpusetsize ) { + return false; + } + + CPU_COPY( cpuset, info->Affinity.set ); + return true; +} + +bool _Scheduler_priority_affinity_SMP_Set_affinity( + Thread_Control *thread, + size_t cpusetsize, + cpu_set_t *cpuset +) +{ + Scheduler_priority_affinity_SMP_Per_thread *info = + _Scheduler_priority_affinity_Get_scheduler_info(thread); + + if ( ! _CPU_set_Is_valid( cpuset, cpusetsize ) ) { + return false; + } + + CPU_COPY( info->Affinity.set, cpuset ); + + return true; +} |