#include "namespace.h"
#include <sys/lwp.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
#include <pthread_np.h>
#include "un-namespace.h"
#include "thr_private.h"
int
_pthread_getaffinity_np(pthread_t thread, size_t cpusetsize,
cpu_set_t *mask)
{
pthread_t curthread = tls_get_curthread();
cpu_set_t mask1;
int ret;
if (curthread == thread) {
ret = 0;
if (lwp_getaffinity(0, thread->tid, &mask1) < 0)
ret = errno;
} else {
ret = ESRCH;
if (_thr_ref_add(curthread, thread, 0) == 0) {
THR_THREAD_LOCK(curthread, thread);
if (thread->state != PS_DEAD) {
ret = 0;
if (lwp_getaffinity(0, thread->tid, &mask1) < 0)
ret = errno;
}
THR_THREAD_UNLOCK(curthread, thread);
_thr_ref_delete(curthread, thread);
}
}
if (ret != 0)
return (ret);
if (cpusetsize > sizeof(mask1)) {
memset(mask, 0, cpusetsize);
memcpy(mask, &mask1, sizeof(mask1));
} else {
memcpy(mask, &mask1, cpusetsize);
}
return (0);
}
__strong_reference(_pthread_getaffinity_np, pthread_getaffinity_np);
int
_pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
const cpu_set_t *mask)
{
pthread_t curthread = tls_get_curthread();
size_t cplen = cpusetsize;
cpu_set_t mask1;
int ret;
if (cplen > sizeof(mask1))
cplen = sizeof(mask1);
CPU_ZERO(&mask1);
memcpy(&mask1, mask, cplen);
if (curthread == thread) {
ret = 0;
if (lwp_setaffinity(0, thread->tid, &mask1) < 0)
ret = errno;
} else {
ret = ESRCH;
if (_thr_ref_add(curthread, thread, 0) == 0) {
THR_THREAD_LOCK(curthread, thread);
if (thread->state != PS_DEAD) {
ret = 0;
if (lwp_setaffinity(0, thread->tid, &mask1) < 0)
ret = errno;
}
THR_THREAD_UNLOCK(curthread, thread);
_thr_ref_delete(curthread, thread);
}
}
return (ret);
}
__strong_reference(_pthread_setaffinity_np, pthread_setaffinity_np);