Patch for pthread get and set affinity
Sebastian Huber
sebastian.huber at embedded-brains.de
Wed Mar 5 07:25:07 UTC 2014
On 2014-02-27 14:28, Jennifer Averett wrote:
> +int pthread_setaffinity_np(
> + pthread_t id,
> + size_t cpusetsize,
> + const cpu_set_t *cpuset)
> +{
> + Objects_Locations location;
> + POSIX_API_Control *api;
> + Thread_Control *the_thread;
> + int error;
> +
> + if ( !cpuset )
> + return EFAULT;
> +
> + error = _CPU_set_Is_valid( cpuset, cpusetsize );
> + if ( error != 0 )
> + return EINVAL;
> +
> + the_thread = _Thread_Get( id, &location );
> + switch ( location ) {
> +
> + case OBJECTS_LOCAL:
> + api = the_thread->API_Extensions[ THREAD_API_POSIX ];
> + CPU_COPY( the_thread->affinity.set, cpuset );
> + CPU_COPY( api->Attributes.affinityset, cpuset );
> + _Objects_Put( &the_thread->Object );
> + return 0;
> + break;
> +
> +#if defined(RTEMS_MULTIPROCESSING)
> + case OBJECTS_REMOTE:
> +#endif
> + case OBJECTS_ERROR:
> + break;
> + }
> +
> + return ESRCH;
> +}
Sorry, for the late answer, but I think this approach makes no sense.
Your pthread_setaffinity_np() implementation just copies some bits from A to B.
I think that the thread processor affinity is independent of the API
(Classic, POSIX, Internal). So the storage space for the affinity set should
not be in "api->Attributes". The scheduler should know about an affinity set
change, so here we need a scheduler operation invocation.
http://www.rtems.org/wiki/index.php?title=SMP#Scheduler_Implementation
Since the scheduler knows best what do it should also store the affinity set in
its per-thread control block, e.g. in the stuff allocated via
/**
* @brief Scheduler allocate.
*
* This routine allocates @a the_thread->scheduler
*/
RTEMS_INLINE_ROUTINE void* _Scheduler_Allocate(
Thread_Control *the_thread
)
{
return _Scheduler.Operations.allocate( the_thread );
}
The scheduler can then use the optimal data structure for its algorithms.
Since all currently implemented schedulers in RTEMS don't support thread
affinity this is particularly easy, they only have to check the affinity set
and need to store nothing.
This makes also _CPU_set_Is_valid() superfluous since the scheduler is then
responsible to check the affinity set.
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.huber at embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
More information about the devel
mailing list