[PATCH 07/10] posix: Move affinity from thread to scheduler.
Gedare Bloom
gedare at rtems.org
Mon Mar 24 20:29:00 UTC 2014
On Mon, Mar 24, 2014 at 2:39 PM, Jennifer <jennifer.averett at oarcorp.com> wrote:
> From: Jennifer Averett <jennifer.averett at oarcorp.com>
>
> ---
> cpukit/posix/src/pthreadcreate.c | 14 ++++++++++++--
> cpukit/posix/src/pthreadgetaffinitynp.c | 12 +++++-------
> cpukit/posix/src/pthreadsetaffinitynp.c | 8 ++++++--
> 3 files changed, 23 insertions(+), 11 deletions(-)
>
> diff --git a/cpukit/posix/src/pthreadcreate.c b/cpukit/posix/src/pthreadcreate.c
> index 5a6d929..075a092 100644
> --- a/cpukit/posix/src/pthreadcreate.c
> +++ b/cpukit/posix/src/pthreadcreate.c
> @@ -32,6 +32,8 @@
> #include <rtems/score/apimutex.h>
> #include <rtems/score/stackimpl.h>
> #include <rtems/score/watchdogimpl.h>
> +#include <rtems/score/schedulerimpl.h>
> +
>
> static inline size_t _POSIX_Threads_Ensure_minimum_stack (
> size_t size
> @@ -196,8 +198,16 @@ int pthread_create(
>
> #if defined(RTEMS_SMP)
> #if __RTEMS_HAVE_SYS_CPUSET_H__
> - the_thread->affinity.setsize = the_attr->affinitysetsize;
> - *the_thread->affinity.set = *the_attr->affinityset;
> + rc = _Scheduler_Set_affinity(
> + the_thread,
> + attr->affinitysetsize,
> + attr->affinityset
> + );
> + if ( rc != 0 ) {
> + _POSIX_Threads_Free( the_thread );
> + _RTEMS_Unlock_allocator();
> + return EINVAL;
> + }
What is the condition this rc != 0 may occur, sine CPU_set_Is_valid() passed?
> #endif
> #endif
>
> diff --git a/cpukit/posix/src/pthreadgetaffinitynp.c b/cpukit/posix/src/pthreadgetaffinitynp.c
> index 082e41a..fd61af5 100644
> --- a/cpukit/posix/src/pthreadgetaffinitynp.c
> +++ b/cpukit/posix/src/pthreadgetaffinitynp.c
> @@ -28,6 +28,7 @@
> #include <rtems/posix/pthreadimpl.h>
> #include <rtems/posix/priorityimpl.h>
> #include <rtems/score/threadimpl.h>
> +#include <rtems/score/schedulerimpl.h>
>
> int pthread_getaffinity_np(
> const pthread_t id,
> @@ -46,14 +47,11 @@ int pthread_getaffinity_np(
> switch ( location ) {
>
> case OBJECTS_LOCAL:
> - error = 0;
> - if ( cpusetsize != the_thread->affinity.setsize )
> - error = EINVAL;
> - else
> - CPU_COPY( cpuset, the_thread->affinity.set );
> -
> + error = _Scheduler_Get_affinity( the_thread, cpusetsize, cpuset );
> _Objects_Put( &the_thread->Object );
> - return error;
> + if (error)
> + return EINVAL;
> + return 0;
> break;
>
> #if defined(RTEMS_MULTIPROCESSING)
> diff --git a/cpukit/posix/src/pthreadsetaffinitynp.c b/cpukit/posix/src/pthreadsetaffinitynp.c
> index fc2194d..51aaee9 100644
> --- a/cpukit/posix/src/pthreadsetaffinitynp.c
> +++ b/cpukit/posix/src/pthreadsetaffinitynp.c
> @@ -28,6 +28,7 @@
> #include <rtems/posix/priorityimpl.h>
> #include <rtems/score/threadimpl.h>
> #include <rtems/score/cpusetimpl.h>
> +#include <rtems/score/schedulerimpl.h>
>
> int pthread_setaffinity_np(
> pthread_t id,
> @@ -51,9 +52,12 @@ int pthread_setaffinity_np(
>
> case OBJECTS_LOCAL:
> api = the_thread->API_Extensions[ THREAD_API_POSIX ];
> - CPU_COPY( the_thread->affinity.set, cpuset );
> - CPU_COPY( api->Attributes.affinityset, cpuset );
> + error = _Scheduler_Set_affinity( the_thread, cpusetsize, cpuset );
> + if (!error)
> + CPU_COPY( api->Attributes.affinityset, cpuset );
> _Objects_Put( &the_thread->Object );
> + if (error)
> + return EINVAL;
> return 0;
> break;
>
> --
> 1.8.1.4
>
> _______________________________________________
> rtems-devel mailing list
> rtems-devel at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-devel
More information about the devel
mailing list