posix: Add dynamic pthread get and set affinity.

This patch adds the following methods:

  + pthread_get_affinity_np
  + pthread_set_affinity_np
This commit is contained in:
Jennifer Averett
2014-02-10 10:01:31 -06:00
parent 6e6adafaaa
commit dd0017c135
3 changed files with 139 additions and 1 deletions

View File

@@ -145,7 +145,8 @@ libposix_a_SOURCES += src/pthreadattrcompare.c
if HAS_SMP if HAS_SMP
## PTHREAD_AFFINITY_C_FILES ## PTHREAD_AFFINITY_C_FILES
libposix_a_SOURCES += src/pthreadattrsetaffinitynp.c \ libposix_a_SOURCES += src/pthreadattrsetaffinitynp.c \
src/pthreadattrgetaffinitynp.c src/pthreadattrgetaffinitynp.c src/pthreadgetaffinitynp.c \
src/pthreadsetaffinitynp.c
endif endif
## PSIGNAL_C_FILES ## PSIGNAL_C_FILES

View File

@@ -0,0 +1,68 @@
/**
* @file
*
* @brief Pthread Get Affinity
* @ingroup POSIXAPI
*/
/*
* 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.org/license/LICENSE.
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#if HAVE_DECL_PTHREAD_GETAFFINITY_NP
#define _GNU_SOURCE
#include <pthread.h>
#include <errno.h>
#include <rtems/posix/pthreadimpl.h>
#include <rtems/posix/priorityimpl.h>
#include <rtems/score/threadimpl.h>
int pthread_getaffinity_np(
const pthread_t id,
size_t cpusetsize,
cpu_set_t *cpuset
)
{
Objects_Locations location;
Thread_Control *the_thread;
int error;
if ( !cpuset )
return EFAULT;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
error = 0;
if ( cpusetsize != the_thread->affinity.setsize )
error = EINVAL;
else
CPU_COPY( cpuset, the_thread->affinity.set );
_Objects_Put( &the_thread->Object );
return error;
break;
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
#endif
case OBJECTS_ERROR:
break;
}
return ESRCH;
}
#endif

View File

@@ -0,0 +1,69 @@
/**
* @file
*
* @brief Pthread Set Affinity
* @ingroup POSIXAPI
*/
/*
* 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.org/license/LICENSE.
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#if HAVE_DECL_PTHREAD_SETAFFINITY_NP
#define _GNU_SOURCE
#include <pthread.h>
#include <errno.h>
#include <rtems/posix/pthreadimpl.h>
#include <rtems/posix/priorityimpl.h>
#include <rtems/score/threadimpl.h>
#include <rtems/score/cpusetimpl.h>
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;
}
#endif