Starting in commit c468fb98a831ed64fb5feadb9ab71f30e2ae3295, we support
pthread_setaffinity_np() on other threads, not just on the current thread.
This patch adds this support also for sched_setaffinity().

Since both functions behave almost the same, the patch creates a single
function which both of them will call. Note how the return values differ,
though: pthread_setaffinity_np() follows pthread tradition and returns
errors directly, while sched_setaffinity() follows Unix tradition and
returns errors in errno.

Refs #776.

Signed-off-by: Nadav Har'El <n...@scylladb.com>
---
 libc/pthread.cc | 33 +++++++++++++++++++++++++++------
 1 file changed, 27 insertions(+), 6 deletions(-)

diff --git a/libc/pthread.cc b/libc/pthread.cc
index d109ce1..ac783bc 100644
--- a/libc/pthread.cc
+++ b/libc/pthread.cc
@@ -940,10 +940,9 @@ int pthread_attr_setaffinity_np(pthread_attr_t *attr, 
size_t cpusetsize,
     return 0;
 }
 
-int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
+static int setaffinity(sched::thread* t, size_t cpusetsize,
         const cpu_set_t *cpuset)
 {
-    sched::thread *t = &pthread::from_libc(thread)->_thread;
     int count = CPU_COUNT(cpuset);
     if (count == 0) {
         // Having a cpuset with no CPUs in it is invalid.
@@ -967,14 +966,36 @@ int pthread_setaffinity_np(pthread_t thread, size_t 
cpusetsize,
     return 0;
 }
 
+int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,
+        const cpu_set_t *cpuset)
+{
+    sched::thread *t = &pthread::from_libc(thread)->_thread;
+    return setaffinity(t, cpusetsize, cpuset);
+}
+
 int sched_setaffinity(pid_t pid, size_t cpusetsize,
         cpu_set_t *cpuset)
 {
-    if (pid != 0 && (unsigned int)pid != sched::thread::current()->id()) {
-        WARN_STUBBED();
-        return EINVAL;
+    sched::thread *t;
+    if (pid == 0) {
+        t = sched::thread::current();
+    } else {
+        t = sched::thread::find_by_id(pid);
+        if (!t) {
+            errno = ESRCH;
+            return -1;
+        }
+        // TODO: After the thread was found, if it exits the code below
+        // may crash. Perhaps we should have a version of find_by_id(),
+        // with_thread_by_id(pid, func), which holds thread_map_mutex while
+        // func runs.
+    }
+    int err = setaffinity(t, cpusetsize, cpuset);
+    if (err) {
+        errno = err;
+        return -1;
     }
-    return pthread_setaffinity_np(pthread_self(), cpusetsize, cpuset);
+    return 0;
 }
 
 int pthread_getaffinity_np(const pthread_t thread, size_t cpusetsize,
-- 
2.5.5

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to osv-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to