1176763Sdavidxu/*
2176763Sdavidxu * Copyright (c) 2008, David Xu <davidxu@freebsd.org>
3176763Sdavidxu * All rights reserved.
4176763Sdavidxu *
5176763Sdavidxu * Redistribution and use in source and binary forms, with or without
6176763Sdavidxu * modification, are permitted provided that the following conditions
7176763Sdavidxu * are met:
8176763Sdavidxu * 1. Redistributions of source code must retain the above copyright
9176763Sdavidxu *    notice unmodified, this list of conditions, and the following
10176763Sdavidxu *    disclaimer.
11176763Sdavidxu * 2. Redistributions in binary form must reproduce the above copyright
12176763Sdavidxu *    notice, this list of conditions and the following disclaimer in the
13176763Sdavidxu *    documentation and/or other materials provided with the distribution.
14176763Sdavidxu *
15176763Sdavidxu * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16176763Sdavidxu * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17176763Sdavidxu * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18176763Sdavidxu * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19176763Sdavidxu * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20176763Sdavidxu * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21176763Sdavidxu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22176763Sdavidxu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23176763Sdavidxu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24176763Sdavidxu * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25176763Sdavidxu *
26176763Sdavidxu * $FreeBSD$
27176763Sdavidxu *
28176763Sdavidxu */
29176763Sdavidxu
30176763Sdavidxu#include "namespace.h"
31177861Sdavidxu#include <pthread_np.h>
32176763Sdavidxu#include <sys/param.h>
33176763Sdavidxu#include <sys/cpuset.h>
34176763Sdavidxu#include "un-namespace.h"
35176763Sdavidxu
36176763Sdavidxu#include "thr_private.h"
37176763Sdavidxu
38176763Sdavidxu__weak_reference(_pthread_getaffinity_np, pthread_getaffinity_np);
39176763Sdavidxu__weak_reference(_pthread_setaffinity_np, pthread_setaffinity_np);
40176763Sdavidxu
41176763Sdavidxuint
42178446Sdelphij_pthread_setaffinity_np(pthread_t td, size_t cpusetsize, const cpuset_t *cpusetp)
43176763Sdavidxu{
44176763Sdavidxu	struct pthread	*curthread = _get_curthread();
45176763Sdavidxu	lwpid_t		tid;
46176763Sdavidxu	int		error;
47176763Sdavidxu
48177370Sdavidxu	if (td == curthread) {
49177370Sdavidxu		error = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
50178446Sdelphij			-1, cpusetsize, cpusetp);
51177370Sdavidxu		if (error == -1)
52177370Sdavidxu			error = errno;
53212536Sdavidxu	} else if ((error = _thr_find_thread(curthread, td, 0)) == 0) {
54177370Sdavidxu		tid = TID(td);
55177370Sdavidxu		error = cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, tid,
56178446Sdelphij			cpusetsize, cpusetp);
57177370Sdavidxu		if (error == -1)
58177370Sdavidxu			error = errno;
59176763Sdavidxu		THR_THREAD_UNLOCK(curthread, td);
60176763Sdavidxu	}
61176763Sdavidxu	return (error);
62176763Sdavidxu}
63176763Sdavidxu
64176763Sdavidxuint
65178446Sdelphij_pthread_getaffinity_np(pthread_t td, size_t cpusetsize, cpuset_t *cpusetp)
66176763Sdavidxu{
67177370Sdavidxu	struct pthread	*curthread = _get_curthread();
68176763Sdavidxu	lwpid_t tid;
69176763Sdavidxu	int error;
70176763Sdavidxu
71212536Sdavidxu	if (td == curthread) {
72212536Sdavidxu		error = cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID,
73212552Sdavidxu			-1, cpusetsize, cpusetp);
74212536Sdavidxu		if (error == -1)
75212536Sdavidxu			error = errno;
76212536Sdavidxu	} else if ((error = _thr_find_thread(curthread, td, 0)) == 0) {
77212536Sdavidxu		tid = TID(td);
78212552Sdavidxu		error = cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, tid,
79212552Sdavidxu			    cpusetsize, cpusetp);
80212536Sdavidxu		if (error == -1)
81212536Sdavidxu			error = errno;
82212536Sdavidxu		THR_THREAD_UNLOCK(curthread, td);
83212536Sdavidxu	}
84176763Sdavidxu	return (error);
85176763Sdavidxu}
86