[rtems commit] rtems: Add Classic API get and set affinity methods.

Jennifer Averett jennifer at rtems.org
Fri Mar 7 15:08:50 UTC 2014


Module:    rtems
Branch:    master
Commit:    29cacfdbf3a7b90ecb513a591f225e68f14ad340
Changeset: http://git.rtems.org/rtems/commit/?id=29cacfdbf3a7b90ecb513a591f225e68f14ad340

Author:    Jennifer Averett <jennifer.averett at oarcorp.com>
Date:      Mon Feb 10 12:30:39 2014 -0600

rtems: Add Classic API get and set affinity methods.

Add the following methods:

  + rtems_task_get_affinity
  + rtems_task_set_affinity

---

 cpukit/rtems/Makefile.am                 |    7 +++
 cpukit/rtems/include/rtems/rtems/tasks.h |   45 +++++++++++++++++++++
 cpukit/rtems/src/taskgetaffinity.c       |   63 ++++++++++++++++++++++++++++++
 cpukit/rtems/src/tasksetaffinity.c       |   62 +++++++++++++++++++++++++++++
 4 files changed, 177 insertions(+), 0 deletions(-)

diff --git a/cpukit/rtems/Makefile.am b/cpukit/rtems/Makefile.am
index ea461de..f89a896 100644
--- a/cpukit/rtems/Makefile.am
+++ b/cpukit/rtems/Makefile.am
@@ -269,5 +269,12 @@ librtems_a_SOURCES += src/signalmp.c
 librtems_a_SOURCES += src/taskmp.c
 endif
 
+## SMP Files
+if HAS_SMP
+librtems_a_SOURCES += src/tasksetaffinity.c
+librtems_a_SOURCES += src/taskgetaffinity.c
+endif
+
+
 include $(srcdir)/preinstall.am
 include $(top_srcdir)/automake/local.am
diff --git a/cpukit/rtems/include/rtems/rtems/tasks.h b/cpukit/rtems/include/rtems/rtems/tasks.h
index 2030632..f17d51b 100644
--- a/cpukit/rtems/include/rtems/rtems/tasks.h
+++ b/cpukit/rtems/include/rtems/rtems/tasks.h
@@ -490,6 +490,51 @@ rtems_status_code rtems_task_variable_delete(
   void    **ptr
 );
 
+#if defined(__RTEMS_HAVE_SYS_CPUSET_H__) && defined(RTEMS_SMP)
+/**
+ *  @brief RTEMS Get Task Affinity
+ *
+ *  This directive returns the cpuset for the 
+ *  given task.  The cpuset size must be the
+ *  same size as the task affinity set size.
+ *
+ * @param[in] id is the thread to extract
+ * @param[in] cpusetsize is the size of the cpuset
+ * @param[out] cpuset is the tasks affinity cpuset
+ *
+ * @retval RTEMS_SUCCESSFUL if successful or error code if unsuccessful 
+ * @retval RTEMS_INVALID_ADDRESS if cpuset is NULL
+ * @retval RTEMS_INVALID_NUMBER if cpusetsize is incorrect
+ * @retval RTEMS_INVALID_ID if id not valid 
+ */ 
+rtems_status_code rtems_task_get_affinity(
+  rtems_id             id,
+  size_t               cpusetsize,
+  cpu_set_t           *cpuset 
+);
+
+/**
+ *  @brief RTEMS Set Task Affinity
+ *
+ *  This directive sets the given tasks 
+ *  affinity cpuset.
+ *
+ * @param[in] id is the thread to extract
+ * @param[in] cpusetsize is the size of the cpuset
+ * @param[in] cpuset is affinity set to assign to the task
+ *
+ * @retval RTEMS_SUCCESSFUL if successful or error code if unsuccessful 
+ * @retval RTEMS_INVALID_ADDRESS if cpuset is NULL
+ * @retval RTEMS_INVALID_NUMBER if cpuset or cpusetsize is incorrect 
+ * @retval RTEMS_INVALID_ID if id not valid 
+ */ 
+rtems_status_code rtems_task_set_affinity(
+  rtems_id             id,
+  size_t               cpusetsize,
+  cpu_set_t           *cpuset 
+);
+#endif
+
 /**
  *  @brief RTEMS Get Self Task Id
  *
diff --git a/cpukit/rtems/src/taskgetaffinity.c b/cpukit/rtems/src/taskgetaffinity.c
new file mode 100644
index 0000000..9f625e3
--- /dev/null
+++ b/cpukit/rtems/src/taskgetaffinity.c
@@ -0,0 +1,63 @@
+/**
+ * @file
+ *
+ * @brief  RTEMS Task Get Affinity
+ * @ingroup ClassicTasks Tasks
+ */
+
+/*
+ *  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.com/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
+
+#include <rtems/rtems/tasks.h>
+#include <rtems/score/threadimpl.h>
+#include <rtems/score/cpusetimpl.h>
+
+rtems_status_code rtems_task_get_affinity(
+  rtems_id             id,
+  size_t               cpusetsize,
+  cpu_set_t           *cpuset 
+)
+{
+  Thread_Control        *the_thread;
+  Objects_Locations      location;
+  rtems_status_code      status = RTEMS_SUCCESSFUL;
+
+  if ( !cpuset )
+    return RTEMS_INVALID_ADDRESS;
+
+  the_thread = _Thread_Get( id, &location );
+
+  switch ( location ) {
+
+    case OBJECTS_LOCAL:
+      if ( cpusetsize != the_thread->affinity.setsize ) {
+        status = RTEMS_INVALID_NUMBER;
+      } else {
+        CPU_COPY( cpuset, the_thread->affinity.set );
+      }
+      _Objects_Put( &the_thread->Object );
+      return status;
+
+#if defined(RTEMS_MULTIPROCESSING)
+    case OBJECTS_REMOTE:
+#endif
+
+    case OBJECTS_ERROR:
+      break;
+  }
+
+  return RTEMS_INVALID_ID;
+}
+#endif
diff --git a/cpukit/rtems/src/tasksetaffinity.c b/cpukit/rtems/src/tasksetaffinity.c
new file mode 100644
index 0000000..cecb268
--- /dev/null
+++ b/cpukit/rtems/src/tasksetaffinity.c
@@ -0,0 +1,62 @@
+/**
+ * @file
+ *
+ * @brief  RTEMS Task Set Affinity
+ * @ingroup ClassicTasks Tasks
+ */
+
+/*
+ *  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.com/license/LICENSE.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
+
+#include <rtems/rtems/tasks.h>
+#include <rtems/score/threadimpl.h>
+#include <rtems/score/cpusetimpl.h>
+
+rtems_status_code rtems_task_set_affinity(
+  rtems_id             id,
+  size_t               cpusetsize,
+  cpu_set_t           *cpuset 
+)
+{
+  Thread_Control        *the_thread;
+  Objects_Locations      location;
+  int                    error;
+
+  if ( !cpuset )
+    return RTEMS_INVALID_ADDRESS;
+
+  error = _CPU_set_Is_valid( cpuset, cpusetsize );
+  if ( error != 0 )
+    return RTEMS_INVALID_NUMBER;
+
+  the_thread = _Thread_Get( id, &location );
+  switch ( location ) {
+
+    case OBJECTS_LOCAL:
+      CPU_COPY( the_thread->affinity.set, cpuset );
+      _Objects_Put( &the_thread->Object );
+      return RTEMS_SUCCESSFUL;
+
+#if defined(RTEMS_MULTIPROCESSING)
+    case OBJECTS_REMOTE:
+#endif
+
+    case OBJECTS_ERROR:
+      break;
+  }
+
+  return RTEMS_INVALID_ID;
+}
+#endif




More information about the vc mailing list