Add pthread_setaffinity() and pthread_getaffinity()
This commit is contained in:
parent
28d138c584
commit
1b5e296cf2
@ -11512,4 +11512,6 @@
|
||||
Add an affinity field to the attrributes to permit controlling
|
||||
which CPUs a pthread may run on. Implements pthread_att_setaffinity_np()
|
||||
and pthread_attr_getaffinity_np() (2016-02-19).
|
||||
* sched/pthread: Add pthread_setaffinity() and pthread_getaffinity()
|
||||
(2016-02-19).
|
||||
|
||||
|
@ -51,6 +51,10 @@ ifneq ($(CONFIG_DISABLE_SIGNALS),y)
|
||||
CSRCS += pthread_condtimedwait.c pthread_kill.c pthread_sigmask.c
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_SMP),y)
|
||||
CSRCS += pthread_setaffinity.c pthread_getaffinity.c
|
||||
endif
|
||||
|
||||
# Include pthread build support
|
||||
|
||||
DEPPATH += --dep-path pthread
|
||||
|
103
sched/pthread/pthread_getaffinity.c
Normal file
103
sched/pthread/pthread_getaffinity.c
Normal file
@ -0,0 +1,103 @@
|
||||
/****************************************************************************
|
||||
* pthread_getaffinity.c
|
||||
*
|
||||
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <pthread.h>
|
||||
#include <sched.h>
|
||||
#include <errno.h>
|
||||
#include <debug.h>
|
||||
|
||||
#include "pthread/pthread.h"
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: pthread_getschedparam
|
||||
*
|
||||
* Description:
|
||||
* The pthread_getaffinity_np() function returns the CPU affinity mask
|
||||
* of the thread thread in the buffer pointed to by cpuset.
|
||||
*
|
||||
* The argument cpusetsize is the length (in bytes) of the buffer
|
||||
* pointed to by cpuset. Typically, this argument would be specified as
|
||||
* sizeof(cpu_set_t).
|
||||
*
|
||||
* Parameters:
|
||||
* thread - The ID of thread whose affinity set will be retrieved.
|
||||
* cpusetsize - Size of cpuset. MUST be sizeofcpu_set_t().
|
||||
* cpuset - The location to return the thread's new affinity set.
|
||||
*
|
||||
* Return Value:
|
||||
* 0 if successful. Otherwise, an errno value is returned indicating the
|
||||
* nature of the failure.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize,
|
||||
FAR cpu_set_t *cpuset)
|
||||
{
|
||||
int ret;
|
||||
|
||||
sdbg("thread ID=%d cpusetsize=%d cpuset=%p\n",
|
||||
(int)thread, (int)cpusetsize, cpusetsize);
|
||||
|
||||
DEBUGASSERT(thread > 0 && cpusetsize == sizeof(cpu_set_t) &&
|
||||
cpuset != NULL);
|
||||
|
||||
/* Let sched_getaffinity do all of the work */
|
||||
|
||||
ret = sched_getaffinity((pid_t)thread, cpusetsize, cpuset);
|
||||
if (ret < 0)
|
||||
{
|
||||
/* If sched_getaffinity() fails, return the errno */
|
||||
|
||||
ret = get_errno();
|
||||
DEBUGASSERT(ret > 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SMP */
|
105
sched/pthread/pthread_setaffinity.c
Normal file
105
sched/pthread/pthread_setaffinity.c
Normal file
@ -0,0 +1,105 @@
|
||||
/****************************************************************************
|
||||
* sched/pthread/pthread_setaffinity.c
|
||||
*
|
||||
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <pthread.h>
|
||||
#include <sched.h>
|
||||
#include <errno.h>
|
||||
#include <debug.h>
|
||||
|
||||
#include "pthread/pthread.h"
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: pthread_setaffinity
|
||||
*
|
||||
* Description:
|
||||
* The pthread_setaffinity_np() function sets the CPU affinity mask of
|
||||
* the thread thread to the CPU set pointed to by cpuset. If the call
|
||||
* is successful, and the thread is not currently running on one of the
|
||||
* CPUs in cpuset, then it is migrated to one of those CPUs.
|
||||
|
||||
* The argument cpusetsize is the length (in bytes) of the buffer
|
||||
* pointed to by cpuset. Typically, this argument would be specified as
|
||||
* sizeof(cpu_set_t).
|
||||
*
|
||||
* Parameters:
|
||||
* thread - The ID of thread whose affinity set will be modified.
|
||||
* cpusetsize - Size of cpuset. MUST be sizeofcpu_set_t().
|
||||
* cpuset - Provides the new affinity set for the thread.
|
||||
*
|
||||
* Return Value:
|
||||
* 0 if successful. Otherwise, an errno value is returned indicating the
|
||||
* nature of the failure.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
|
||||
FAR const cpu_set_t *cpuset)
|
||||
{
|
||||
int ret;
|
||||
|
||||
sdbg("thread ID=%d cpusetsize=%d cpuset=%p\n",
|
||||
(int)thread, (int)cpusetsize, cpusetsize);
|
||||
|
||||
DEBUGASSERT(thread > 0 && cpusetsize == sizeof(cpu_set_t) &&
|
||||
cpuset != NULL);
|
||||
|
||||
/* Let sched_setaffinity do all of the work */
|
||||
|
||||
ret = sched_setaffinity((pid_t)thread, cpusetsize, cpuset);
|
||||
if (ret < 0)
|
||||
{
|
||||
/* If sched_setaffinity() fails, return the errno */
|
||||
|
||||
ret = get_errno();
|
||||
DEBUGASSERT(ret > 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_SMP */
|
Loading…
Reference in New Issue
Block a user