[PATCH 3/3] score: Task get/set affinity
Jennifer Averett
Jennifer.Averett at OARcorp.com
Tue Apr 8 15:09:13 UTC 2014
I thought the consensus was that non-smp systems would not
support affinity methods.
> -----Original Message-----
> From: rtems-devel-bounces at rtems.org [mailto:rtems-devel-
> bounces at rtems.org] On Behalf Of Sebastian Huber
> Sent: Tuesday, April 08, 2014 9:15 AM
> To: rtems-devel at rtems.org
> Subject: [PATCH 3/3] score: Task get/set affinity
>
> Make rtems_task_get_affinity() and rtems_task_set_affinity() available on
> non-SMP configurations. Allow larger CPU sets.
> ---
> cpukit/rtems/Makefile.am | 9 +-
> cpukit/rtems/include/rtems/rtems/tasks.h | 50 ++++----
> cpukit/score/Makefile.am | 2 +
> cpukit/score/include/rtems/score/cpusetimpl.h | 18 +++
> cpukit/score/include/rtems/score/schedulerimpl.h | 103 ++++++++++------
> cpukit/score/src/schedulerdefaultgetaffinity.c | 20 +--
> cpukit/score/src/schedulerdefaultsetaffinity.c | 11 +-
> cpukit/score/src/schedulergetaffinity.c | 55 +++++++++
> cpukit/score/src/schedulersetaffinity.c | 55 +++++++++
> testsuites/sptests/Makefile.am | 3 +-
> testsuites/sptests/configure.ac | 1 +
> testsuites/sptests/spscheduler01/Makefile.am | 19 +++
> testsuites/sptests/spscheduler01/init.c | 127
> ++++++++++++++++++++
> testsuites/sptests/spscheduler01/spscheduler01.doc | 13 ++
> testsuites/sptests/spscheduler01/spscheduler01.scn | 2 +
> 15 files changed, 397 insertions(+), 91 deletions(-) create mode 100644
> cpukit/score/src/schedulergetaffinity.c
> create mode 100644 cpukit/score/src/schedulersetaffinity.c
> create mode 100644 testsuites/sptests/spscheduler01/Makefile.am
> create mode 100644 testsuites/sptests/spscheduler01/init.c
> create mode 100644 testsuites/sptests/spscheduler01/spscheduler01.doc
> create mode 100644 testsuites/sptests/spscheduler01/spscheduler01.scn
>
> diff --git a/cpukit/rtems/Makefile.am b/cpukit/rtems/Makefile.am index
> 6cb5181..70a8855 100644
> --- a/cpukit/rtems/Makefile.am
> +++ b/cpukit/rtems/Makefile.am
> @@ -92,6 +92,7 @@ librtems_a_SOURCES +=
> src/rtemsobjectgetclassicname.c librtems_a_SOURCES += src/tasks.c
> librtems_a_SOURCES += src/taskcreate.c librtems_a_SOURCES +=
> src/taskdelete.c
> +librtems_a_SOURCES += src/taskgetaffinity.c
> librtems_a_SOURCES += src/taskgetnote.c librtems_a_SOURCES +=
> src/taskident.c librtems_a_SOURCES += src/taskinitusers.c @@ -100,6 +101,7
> @@ librtems_a_SOURCES += src/taskmode.c librtems_a_SOURCES +=
> src/taskrestart.c librtems_a_SOURCES += src/taskresume.c
> librtems_a_SOURCES += src/taskself.c
> +librtems_a_SOURCES += src/tasksetaffinity.c
> librtems_a_SOURCES += src/tasksetnote.c librtems_a_SOURCES +=
> src/tasksetpriority.c librtems_a_SOURCES += src/taskstart.c @@ -271,12
> +273,5 @@ 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 af4fb1c..4da32c4 100644
> --- a/cpukit/rtems/include/rtems/rtems/tasks.h
> +++ b/cpukit/rtems/include/rtems/rtems/tasks.h
> @@ -494,22 +494,23 @@ rtems_status_code rtems_task_variable_delete( );
> #endif
>
> -#if defined(__RTEMS_HAVE_SYS_CPUSET_H__) && defined(RTEMS_SMP)
> +#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
> /**
> - * @brief RTEMS Get Task Affinity
> + * @brief Gets the processor affinity set of a task.
> *
> - * 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 Identifier of the task. Use @ref RTEMS_SELF to select
> + the
> + * executing task.
> + * @param[in] cpusetsize Size of the specified affinity set buffer in
> + * bytes. This value must be positive.
> + * @param[out] cpuset The current processor affinity set of the task.
> + A set
> + * bit in the affinity set means that the task can execute on this
> + processor
> + * and a cleared bit means the opposite.
> *
> - * @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
> + * @retval RTEMS_SUCCESSFUL Successful operation.
> + * @retval RTEMS_INVALID_ADDRESS The @a cpuset parameter is @c
> NULL.
> + * @retval RTEMS_INVALID_ID Invalid task identifier.
> + * @retval RTEMS_INVALID_NUMBER The affinity set buffer is too small
> + for the
> + * current processor affinity set of the task.
> */
> rtems_status_code rtems_task_get_affinity(
> rtems_id id,
> @@ -518,19 +519,20 @@ rtems_status_code rtems_task_get_affinity( );
>
> /**
> - * @brief RTEMS Set Task Affinity
> + * @brief Sets the processor affinity set of a task.
> *
> - * This directive sets the given tasks
> - * affinity cpuset.
> + * @param[in] id Identifier of the task. Use @ref RTEMS_SELF to select
> + the
> + * executing task.
> + * @param[in] cpusetsize Size of the specified affinity set buffer in
> + * bytes. This value must be positive.
> + * @param[in] cpuset The new processor affinity set for the task. A
> + set bit in
> + * the affinity set means that the task can execute on this processor
> + and a
> + * cleared bit means the opposite.
> *
> - * @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
> + * @retval RTEMS_SUCCESSFUL Successful operation.
> + * @retval RTEMS_INVALID_ADDRESS The @a cpuset parameter is @c
> NULL.
> + * @retval RTEMS_INVALID_ID Invalid task identifier.
> + * @retval RTEMS_INVALID_NUMBER Invalid processor affinity set.
> */
> rtems_status_code rtems_task_set_affinity(
> rtems_id id,
> diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am index
> 4cd89d7..ae92550 100644
> --- a/cpukit/score/Makefile.am
> +++ b/cpukit/score/Makefile.am
> @@ -195,6 +195,8 @@ libscore_a_SOURCES += src/objectallocate.c
> src/objectclose.c \ ## SCHEDULER_C_FILES libscore_a_SOURCES +=
> src/log2table.c libscore_a_SOURCES += src/scheduler.c
> +libscore_a_SOURCES += src/schedulergetaffinity.c libscore_a_SOURCES +=
> +src/schedulersetaffinity.c
> libscore_a_SOURCES += src/schedulerdefaultallocatefree.c
> libscore_a_SOURCES += src/schedulerdefaultreleasejob.c
> libscore_a_SOURCES += src/schedulerdefaultstartidle.c diff --git
> a/cpukit/score/include/rtems/score/cpusetimpl.h
> b/cpukit/score/include/rtems/score/cpusetimpl.h
> index 06fe3f5..8ae2408 100644
> --- a/cpukit/score/include/rtems/score/cpusetimpl.h
> +++ b/cpukit/score/include/rtems/score/cpusetimpl.h
> @@ -20,6 +20,9 @@
> #define _RTEMS_SCORE_CPUSETIMPL_H
>
> #include <rtems/score/cpuset.h>
> +#include <rtems/score/smp.h>
> +
> +#include <limits.h>
>
> #ifdef __cplusplus
> extern "C" {
> @@ -58,6 +61,21 @@ void _CPU_set_Show_default( const char *description
> );
> */
> const CPU_set_Control *_CPU_set_Default(void);
>
> +RTEMS_INLINE_ROUTINE size_t _CPU_set_Maximum_CPU_count(
> + size_t cpusetsize
> +)
> +{
> + return cpusetsize * CHAR_BIT;
> +}
> +
> +RTEMS_INLINE_ROUTINE bool _CPU_set_Is_large_enough(
> + size_t cpusetsize
> +)
> +{
> + return _CPU_set_Maximum_CPU_count( cpusetsize )
> + >= _SMP_Get_processor_count();
> +}
> +
> #endif
>
> /**
> diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h
> b/cpukit/score/include/rtems/score/schedulerimpl.h
> index 5c78723..abad068 100644
> --- a/cpukit/score/include/rtems/score/schedulerimpl.h
> +++ b/cpukit/score/include/rtems/score/schedulerimpl.h
> @@ -20,6 +20,7 @@
> #define _RTEMS_SCORE_SCHEDULERIMPL_H
>
> #include <rtems/score/scheduler.h>
> +#include <rtems/score/cpusetimpl.h>
> #include <rtems/score/threadimpl.h>
>
> #ifdef __cplusplus
> @@ -257,49 +258,71 @@ RTEMS_INLINE_ROUTINE void
> _Scheduler_Start_idle(
> ( *scheduler->Operations.start_idle )( scheduler, the_thread, cpu ); }
>
> -#if defined(__RTEMS_HAVE_SYS_CPUSET_H__) && defined(RTEMS_SMP)
> - /**
> - * @brief Obtain the processor affinity for a thread.
> - *
> - * @param[in,out] thread The thread.
> - * @parma[out] cpuset The processor affinity for this thread
> - */
> - RTEMS_INLINE_ROUTINE int _Scheduler_Get_affinity(
> - const Scheduler_Control *scheduler,
> - Thread_Control *the_thread,
> - size_t cpusetsize,
> - cpu_set_t *cpuset
> - )
> - {
> - return ( *scheduler->Operations.get_affinity )(
> - scheduler,
> - the_thread,
> - cpusetsize,
> - cpuset
> - );
> +#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
> +
> +RTEMS_INLINE_ROUTINE bool _Scheduler_default_Get_affinity_body(
> + const Scheduler_Control *scheduler,
> + Thread_Control *the_thread,
> + size_t cpusetsize,
> + cpu_set_t *cpuset
> +)
> +{
> + uint32_t cpu_count = _SMP_Get_processor_count();
> + uint32_t cpu_index;
> +
> + (void) scheduler;
> + (void) the_thread;
> +
> + CPU_ZERO_S( cpusetsize, cpuset );
> +
> + for ( cpu_index = 0 ; cpu_index < cpu_count ; ++cpu_index ) {
> + CPU_SET_S( (int) cpu_index, cpusetsize, cpuset ); }
> +
> + return true;
> +}
> +
> +bool _Scheduler_Get_affinity(
> + const Scheduler_Control *scheduler,
> + Thread_Control *the_thread,
> + size_t cpusetsize,
> + cpu_set_t *cpuset
> +);
> +
> +RTEMS_INLINE_ROUTINE bool _Scheduler_default_Set_affinity_body(
> + const Scheduler_Control *scheduler,
> + Thread_Control *the_thread,
> + size_t cpusetsize,
> + const cpu_set_t *cpuset
> +)
> +{
> + size_t cpu_max = _CPU_set_Maximum_CPU_count( cpusetsize );
> + uint32_t cpu_count = _SMP_Get_processor_count();
> + uint32_t cpu_index;
> + bool ok = true;
> +
> + (void) scheduler;
> + (void) the_thread;
> +
> + for ( cpu_index = 0 ; cpu_index < cpu_count ; ++cpu_index ) {
> + ok = ok && CPU_ISSET_S( (int) cpu_index, cpusetsize, cpuset );
> }
>
> - /**
> - * @brief Set the processor affinity for a thread.
> - *
> - * @param[in,out] thread The thread.
> - * @parma[in] cpuset The processor affinity for this thread
> - */
> - RTEMS_INLINE_ROUTINE int _Scheduler_Set_affinity(
> - const Scheduler_Control *scheduler,
> - Thread_Control *the_thread,
> - size_t cpusetsize,
> - const cpu_set_t *cpuset
> - )
> - {
> - return ( *scheduler->Operations.set_affinity )(
> - scheduler,
> - the_thread,
> - cpusetsize,
> - cpuset
> - );
> + for ( ; cpu_index < cpu_max ; ++cpu_index ) {
> + ok = ok && !CPU_ISSET_S( (int) cpu_index, cpusetsize, cpuset );
> }
> -#endif
> +
> + return ok;
> +}
> +
> +bool _Scheduler_Set_affinity(
> + const Scheduler_Control *scheduler,
> + Thread_Control *the_thread,
> + size_t cpusetsize,
> + const cpu_set_t *cpuset
> +);
> +
> +#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
>
> RTEMS_INLINE_ROUTINE void _Scheduler_Update_heir(
> Thread_Control *heir,
> diff --git a/cpukit/score/src/schedulerdefaultgetaffinity.c
> b/cpukit/score/src/schedulerdefaultgetaffinity.c
> index 367fc25..56a4ee4 100644
> --- a/cpukit/score/src/schedulerdefaultgetaffinity.c
> +++ b/cpukit/score/src/schedulerdefaultgetaffinity.c
> @@ -20,7 +20,6 @@
> #endif
>
> #include <rtems/score/schedulerimpl.h>
> -#include <rtems/score/cpusetimpl.h>
>
> bool _Scheduler_default_Get_affinity(
> const Scheduler_Control *scheduler,
> @@ -29,17 +28,10 @@ bool _Scheduler_default_Get_affinity(
> cpu_set_t *cpuset
> )
> {
> - const CPU_set_Control *ctl;
> -
> - (void) scheduler;
> - (void) thread;
> -
> - ctl = _CPU_set_Default();
> - if ( cpusetsize != ctl->setsize ) {
> - return false;
> - }
> -
> - CPU_COPY( cpuset, ctl->set );
> -
> - return true;
> + return _Scheduler_default_Get_affinity_body(
> + scheduler,
> + thread,
> + cpusetsize,
> + cpuset
> + );
> }
> diff --git a/cpukit/score/src/schedulerdefaultsetaffinity.c
> b/cpukit/score/src/schedulerdefaultsetaffinity.c
> index 33be12b..e53f8b8 100644
> --- a/cpukit/score/src/schedulerdefaultsetaffinity.c
> +++ b/cpukit/score/src/schedulerdefaultsetaffinity.c
> @@ -20,7 +20,6 @@
> #endif
>
> #include <rtems/score/schedulerimpl.h>
> -#include <rtems/score/cpusetimpl.h>
>
> bool _Scheduler_default_Set_affinity(
> const Scheduler_Control *scheduler,
> @@ -29,8 +28,10 @@ bool _Scheduler_default_Set_affinity(
> const cpu_set_t *cpuset
> )
> {
> - (void) scheduler;
> - (void) thread;
> -
> - return _CPU_set_Is_valid( cpuset, cpusetsize );
> + return _Scheduler_default_Set_affinity_body(
> + scheduler,
> + thread,
> + cpusetsize,
> + cpuset
> + );
> }
> diff --git a/cpukit/score/src/schedulergetaffinity.c
> b/cpukit/score/src/schedulergetaffinity.c
> new file mode 100644
> index 0000000..d9e62b5
> --- /dev/null
> +++ b/cpukit/score/src/schedulergetaffinity.c
> @@ -0,0 +1,55 @@
> +/*
> + * Copyright (c) 2014 embedded brains GmbH. All rights reserved.
> + *
> + * embedded brains GmbH
> + * Dornierstr. 4
> + * 82178 Puchheim
> + * Germany
> + * <rtems at embedded-brains.de>
> + *
> + * 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/schedulerimpl.h>
> +
> +#if defined(__RTEMS_HAVE_SYS_CPUSET_H__)
> +
> +bool _Scheduler_Get_affinity(
> + const Scheduler_Control *scheduler,
> + Thread_Control *the_thread,
> + size_t cpusetsize,
> + cpu_set_t *cpuset
> +)
> +{
> + bool ok;
> +
> + if ( _CPU_set_Is_large_enough( cpusetsize ) ) { #if
> +defined(RTEMS_SMP)
> + ok = ( *scheduler->Operations.get_affinity )(
> + scheduler,
> + the_thread,
> + cpusetsize,
> + cpuset
> + );
> +#else
> + ok = _Scheduler_default_Get_affinity_body(
> + scheduler,
> + the_thread,
> + cpusetsize,
> + cpuset
> + );
> +#endif
> + } else {
> + ok = false;
> + }
> +
> + return ok;
> +}
> +
> +#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
> diff --git a/cpukit/score/src/schedulersetaffinity.c
> b/cpukit/score/src/schedulersetaffinity.c
> new file mode 100644
> index 0000000..2416a19
> --- /dev/null
> +++ b/cpukit/score/src/schedulersetaffinity.c
> @@ -0,0 +1,55 @@
> +/*
> + * Copyright (c) 2014 embedded brains GmbH. All rights reserved.
> + *
> + * embedded brains GmbH
> + * Dornierstr. 4
> + * 82178 Puchheim
> + * Germany
> + * <rtems at embedded-brains.de>
> + *
> + * 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/schedulerimpl.h>
> +
> +#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
> +)
> +{
> + bool ok;
> +
> + if ( _CPU_set_Is_large_enough( cpusetsize ) ) { #if
> +defined(RTEMS_SMP)
> + ok = ( *scheduler->Operations.set_affinity )(
> + scheduler,
> + the_thread,
> + cpusetsize,
> + cpuset
> + );
> +#else
> + ok = _Scheduler_default_Set_affinity_body(
> + scheduler,
> + the_thread,
> + cpusetsize,
> + cpuset
> + );
> +#endif
> + } else {
> + ok = false;
> + }
> +
> + return ok;
> +}
> +
> +#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */
> diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am
> index 1d530e2..0477e26 100644
> --- a/testsuites/sptests/Makefile.am
> +++ b/testsuites/sptests/Makefile.am
> @@ -37,7 +37,8 @@ if HAS_SMP
> else
> SUBDIRS += sp29
> endif
> - SUBDIRS += spprofiling01
> +SUBDIRS += spscheduler01
> +SUBDIRS += spprofiling01
> SUBDIRS += spfatal28
> SUBDIRS += spthreadlife01
> SUBDIRS += spprofiling01
> diff --git a/testsuites/sptests/configure.ac b/testsuites/sptests/configure.ac
> index 30d2787..6be14e4 100644
> --- a/testsuites/sptests/configure.ac
> +++ b/testsuites/sptests/configure.ac
> @@ -40,6 +40,7 @@ AM_CONDITIONAL(HAS_SMP,test
> "$rtems_cv_RTEMS_SMP" = "yes")
>
> # Explicitly list all Makefiles here
> AC_CONFIG_FILES([Makefile
> +spscheduler01/Makefile
> spfatal28/Makefile
> spthreadlife01/Makefile
> spprofiling01/Makefile
> diff --git a/testsuites/sptests/spscheduler01/Makefile.am
> b/testsuites/sptests/spscheduler01/Makefile.am
> new file mode 100644
> index 0000000..f108426
> --- /dev/null
> +++ b/testsuites/sptests/spscheduler01/Makefile.am
> @@ -0,0 +1,19 @@
> +rtems_tests_PROGRAMS = spscheduler01
> +spscheduler01_SOURCES = init.c
> +
> +dist_rtems_tests_DATA = spscheduler01.scn spscheduler01.doc
> +
> +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP at .cfg
> +include $(top_srcdir)/../automake/compile.am
> +include $(top_srcdir)/../automake/leaf.am
> +
> +AM_CPPFLAGS += -I$(top_srcdir)/../support/include
> +
> +LINK_OBJS = $(spscheduler01_OBJECTS)
> +LINK_LIBS = $(spscheduler01_LDLIBS)
> +
> +spscheduler01$(EXEEXT): $(spscheduler01_OBJECTS)
> $(spscheduler01_DEPENDENCIES)
> + @rm -f spscheduler01$(EXEEXT)
> + $(make-exe)
> +
> +include $(top_srcdir)/../automake/local.am
> diff --git a/testsuites/sptests/spscheduler01/init.c
> b/testsuites/sptests/spscheduler01/init.c
> new file mode 100644
> index 0000000..59e535d
> --- /dev/null
> +++ b/testsuites/sptests/spscheduler01/init.c
> @@ -0,0 +1,127 @@
> +/*
> + * Copyright (c) 2014 embedded brains GmbH. All rights reserved.
> + *
> + * embedded brains GmbH
> + * Dornierstr. 4
> + * 82178 Puchheim
> + * Germany
> + * <rtems at embedded-brains.de>
> + *
> + * 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.
> + */
> +
> +#ifdef HAVE_CONFIG_H
> + #include "config.h"
> +#endif
> +
> +#include <rtems.h>
> +#include <rtems/libcsupport.h>
> +
> +#include <limits.h>
> +
> +#include "tmacros.h"
> +
> +const char rtems_test_name[] = "SPSCHEDULER 1";
> +
> +static void test_set_get_affinity(void) { #if
> +defined(__RTEMS_HAVE_SYS_CPUSET_H__)
> + rtems_id id = rtems_task_self();
> + rtems_status_code sc;
> + cpu_set_t cpusetone;
> + cpu_set_t cpuset;
> + size_t big = 2 * CHAR_BIT * sizeof(cpu_set_t);
> + size_t cpusetbigsize = CPU_ALLOC_SIZE(big);
> + cpu_set_t *cpusetbigone;
> + cpu_set_t *cpusetbig;
> + rtems_resource_snapshot snapshot;
> +
> + rtems_resource_snapshot_take(&snapshot);
> +
> + CPU_ZERO(&cpusetone);
> + CPU_SET(0, &cpusetone);
> +
> + sc = rtems_task_get_affinity(RTEMS_SELF, sizeof(cpuset), NULL);
> + rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
> +
> + sc = rtems_task_set_affinity(RTEMS_SELF, sizeof(cpuset), NULL);
> + rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
> +
> + sc = rtems_task_get_affinity(RTEMS_SELF, 0, &cpuset);
> + rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
> +
> + sc = rtems_task_set_affinity(RTEMS_SELF, 0, &cpuset);
> + rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
> +
> + sc = rtems_task_get_affinity(id + 1, sizeof(cpuset), &cpuset);
> + rtems_test_assert(sc == RTEMS_INVALID_ID);
> +
> + sc = rtems_task_set_affinity(id + 1, sizeof(cpuset), &cpuset);
> + rtems_test_assert(sc == RTEMS_INVALID_ID);
> +
> + sc = rtems_task_get_affinity(RTEMS_SELF, sizeof(cpuset), &cpuset);
> + rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +
> + rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
> +
> + sc = rtems_task_set_affinity(RTEMS_SELF, sizeof(cpuset), &cpuset);
> + rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +
> + sc = rtems_task_get_affinity(id, sizeof(cpuset), &cpuset);
> + rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +
> + rtems_test_assert(CPU_EQUAL(&cpuset, &cpusetone));
> +
> + sc = rtems_task_set_affinity(id, sizeof(cpuset), &cpuset);
> + rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +
> + cpusetbigone = CPU_ALLOC(big);
> + rtems_test_assert(cpusetbigone != NULL);
> +
> + cpusetbig = CPU_ALLOC(big);
> + rtems_test_assert(cpusetbig != NULL);
> +
> + CPU_ZERO_S(cpusetbigsize, cpusetbigone); CPU_SET_S(0, cpusetbigsize,
> + cpusetbigone);
> +
> + sc = rtems_task_get_affinity(RTEMS_SELF, cpusetbigsize, cpusetbig);
> + rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +
> + rtems_test_assert(CPU_EQUAL_S(cpusetbigsize, cpusetbig,
> + cpusetbigone));
> +
> + sc = rtems_task_set_affinity(RTEMS_SELF, cpusetbigsize, cpusetbig);
> + rtems_test_assert(sc == RTEMS_SUCCESSFUL);
> +
> + CPU_FREE(cpusetbig);
> + CPU_FREE(cpusetbigone);
> +
> + rtems_test_assert(rtems_resource_snapshot_check(&snapshot));
> +#endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */ }
> +
> +static void Init(rtems_task_argument arg) {
> + TEST_BEGIN();
> +
> + test_set_get_affinity();
> +
> + TEST_END();
> + rtems_test_exit(0);
> +}
> +
> +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
> +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
> +
> +#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM
> +
> +#define CONFIGURE_MAXIMUM_TASKS 1
> +
> +#define CONFIGURE_INITIAL_EXTENSIONS
> RTEMS_TEST_INITIAL_EXTENSION
> +
> +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
> +
> +#define CONFIGURE_INIT
> +
> +#include <rtems/confdefs.h>
> diff --git a/testsuites/sptests/spscheduler01/spscheduler01.doc
> b/testsuites/sptests/spscheduler01/spscheduler01.doc
> new file mode 100644
> index 0000000..00ac13e
> --- /dev/null
> +++ b/testsuites/sptests/spscheduler01/spscheduler01.doc
> @@ -0,0 +1,13 @@
> +This file describes the directives and concepts tested by this test set.
> +
> +test set name: spscheduler01
> +
> +directives:
> +
> + - rtems_task_get_affinity()
> + - rtems_task_set_affinity()
> +
> +concepts:
> +
> + - Ensure that the task set/get affinity functions work on non-SMP
> + configurations.
> diff --git a/testsuites/sptests/spscheduler01/spscheduler01.scn
> b/testsuites/sptests/spscheduler01/spscheduler01.scn
> new file mode 100644
> index 0000000..8c73372
> --- /dev/null
> +++ b/testsuites/sptests/spscheduler01/spscheduler01.scn
> @@ -0,0 +1,2 @@
> +*** BEGIN OF TEST SPSCHEDULER 1 ***
> +*** END OF TEST SPSCHEDULER 1 ***
> --
> 1.7.7
>
> _______________________________________________
> rtems-devel mailing list
> rtems-devel at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-devel
More information about the devel
mailing list