1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- #include <alloca.h>
- #include <errno.h>
- #include <pthreadP.h>
- #include <sysdep.h>
- #include <sys/types.h>
- size_t __kernel_cpumask_size;
- extern int __determine_cpumask_size (pid_t tid);
- libpthread_hidden_proto(__determine_cpumask_size)
- int __determine_cpumask_size (pid_t tid)
- {
- INTERNAL_SYSCALL_DECL (err);
- int res;
- size_t psize = 128;
- void *p = alloca (psize);
- while (res = INTERNAL_SYSCALL (sched_getaffinity, err, 3, tid, psize, p),
- INTERNAL_SYSCALL_ERROR_P (res, err)
- && INTERNAL_SYSCALL_ERRNO (res, err) == EINVAL)
- p = extend_alloca (p, psize, 2 * psize);
- if (res == 0 || INTERNAL_SYSCALL_ERROR_P (res, err))
- return INTERNAL_SYSCALL_ERRNO (res, err);
- __kernel_cpumask_size = res;
- return 0;
- }
- libpthread_hidden_def(__determine_cpumask_size)
- int
- pthread_setaffinity_np (pthread_t th, size_t cpusetsize,
- const cpu_set_t *cpuset)
- {
- const struct pthread *pd = (const struct pthread *) th;
- INTERNAL_SYSCALL_DECL (err);
- int res;
- if (__builtin_expect (__kernel_cpumask_size == 0, 0))
- {
- res = __determine_cpumask_size (pd->tid);
- if (res != 0)
- return res;
- }
-
- size_t cnt;
- for (cnt = __kernel_cpumask_size; cnt < cpusetsize; ++cnt)
- if (((char *) cpuset)[cnt] != '\0')
-
- return EINVAL;
- res = INTERNAL_SYSCALL (sched_setaffinity, err, 3, pd->tid, cpusetsize,
- cpuset);
- return (INTERNAL_SYSCALL_ERROR_P (res, err)
- ? INTERNAL_SYSCALL_ERRNO (res, err)
- : 0);
- }
|