summaryrefslogtreecommitdiffstats
path: root/lib/libthr/thread/thr_attr.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libthr/thread/thr_attr.c')
-rw-r--r--lib/libthr/thread/thr_attr.c59
1 files changed, 58 insertions, 1 deletions
diff --git a/lib/libthr/thread/thr_attr.c b/lib/libthr/thread/thr_attr.c
index ffb0453..3e5b4bf 100644
--- a/lib/libthr/thread/thr_attr.c
+++ b/lib/libthr/thread/thr_attr.c
@@ -148,7 +148,9 @@ _pthread_attr_get_np(pthread_t pid, pthread_attr_t *dst)
attr.flags |= PTHREAD_DETACHED;
_thr_ref_delete(curthread, pid);
memcpy(*dst, &attr, sizeof(struct pthread_attr));
-
+ /* XXX */
+ (*dst)->cpuset = NULL;
+ (*dst)->cpusetsize = 0;
return (0);
}
@@ -543,3 +545,58 @@ _pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize)
}
return(ret);
}
+
+int
+pthread_attr_setaffinity_np(pthread_attr_t *pattr, size_t cpusetsize,
+ const cpuset_t *cpuset)
+{
+ pthread_attr_t attr;
+ int ret;
+
+ if (pattr == NULL || (attr = (*pattr)) == NULL)
+ ret = EINVAL;
+ else {
+ if (cpusetsize == 0 || cpuset == NULL) {
+ if (attr->cpuset != NULL) {
+ free(attr->cpuset);
+ attr->cpuset = NULL;
+ attr->cpusetsize = 0;
+ }
+ return (0);
+ }
+
+ /*
+ * XXX figure out kernel cpuset size, reject invalid size.
+ */
+ if (cpusetsize != attr->cpusetsize) {
+ void *newset = realloc(attr->cpuset, cpusetsize);
+ if (newset == NULL)
+ return (ENOMEM);
+ attr->cpuset = newset;
+ attr->cpusetsize = cpusetsize;
+ }
+ memcpy(attr->cpuset, cpuset, cpusetsize);
+ ret = 0;
+ }
+ return (ret);
+}
+
+int
+pthread_attr_getaffinity_np(const pthread_attr_t *pattr, size_t cpusetsize,
+ cpuset_t *cpuset)
+{
+ pthread_attr_t attr;
+ int ret = 0;
+
+ if (pattr == NULL || (attr = (*pattr)) == NULL)
+ ret = EINVAL;
+ else if (attr->cpuset != NULL) {
+ memcpy(cpuset, attr->cpuset, MIN(cpusetsize, attr->cpusetsize));
+ if (cpusetsize > attr->cpusetsize)
+ memset(((char *)cpuset) + attr->cpusetsize, 0,
+ cpusetsize - attr->cpusetsize);
+ } else {
+ memset(cpuset, -1, cpusetsize);
+ }
+ return (ret);
+}
OpenPOWER on IntegriCloud