summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/schedulerpriorityaffinitysmp.c
diff options
context:
space:
mode:
authorJennifer Averett <jennifer.averett@oarcorp.com>2014-03-19 15:20:01 -0500
committerJennifer Averett <jennifer.averett@oarcorp.com>2014-04-03 10:48:56 -0500
commit56c396ba476a48c4f2a4fdd488f704dd76dbddec (patch)
treed46a5658806776a34fcd5604f815ecdd87040a07 /cpukit/score/src/schedulerpriorityaffinitysmp.c
parentscore: score: Add get/set affinity to Scheduler Framework. (diff)
downloadrtems-56c396ba476a48c4f2a4fdd488f704dd76dbddec.tar.bz2
score: Add priority affinity smp scheduler.
Diffstat (limited to 'cpukit/score/src/schedulerpriorityaffinitysmp.c')
-rw-r--r--cpukit/score/src/schedulerpriorityaffinitysmp.c80
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;
+}