From 29cacfdbf3a7b90ecb513a591f225e68f14ad340 Mon Sep 17 00:00:00 2001 From: Jennifer Averett Date: Mon, 10 Feb 2014 12:30:39 -0600 Subject: 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(+) create mode 100644 cpukit/rtems/src/taskgetaffinity.c create mode 100644 cpukit/rtems/src/tasksetaffinity.c diff --git a/cpukit/rtems/Makefile.am b/cpukit/rtems/Makefile.am index ea461deabc..f89a896f2d 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 2030632380..f17d51b7e5 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 0000000000..9f625e334c --- /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 +#include +#include + +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 0000000000..cecb2686a4 --- /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 +#include +#include + +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 -- cgit v1.2.3