Deleted Added
full compact
93c93
< * $FreeBSD: head/lib/libthr/thread/thr_attr.c 176781 2008-03-04 03:03:24Z davidxu $
---
> * $FreeBSD: head/lib/libthr/thread/thr_attr.c 176815 2008-03-05 06:55:48Z davidxu $
101a102
> #include <sys/sysctl.h>
548a550,569
> static int
> _get_kern_cpuset_size()
> {
> static int kern_cpuset_size = 0;
>
> if (kern_cpuset_size == 0) {
> int len;
>
> len = sizeof(kern_cpuset_size);
> if (sysctlbyname("kern.smp.maxcpus", &kern_cpuset_size,
> &len, NULL, 0))
> PANIC("failed to get sysctl kern.smp.maxcpus");
>
> kern_cpuset_size = (kern_cpuset_size + 7) / 8;
> }
>
> return (kern_cpuset_size);
> }
>
> __weak_reference(_pthread_attr_setaffinity_np, pthread_attr_setaffinity_np);
550c571
< pthread_attr_setaffinity_np(pthread_attr_t *pattr, size_t cpusetsize,
---
> _pthread_attr_setaffinity_np(pthread_attr_t *pattr, size_t cpusetsize,
568,571c589,597
< /*
< * XXX figure out kernel cpuset size, reject invalid size.
< */
< if (cpusetsize != attr->cpusetsize) {
---
> if (cpusetsize > attr->cpusetsize) {
> int kern_size = _get_kern_cpuset_size();
> if (cpusetsize > kern_size) {
> int i;
> for (i = kern_size; i < cpusetsize; ++i) {
> if (((char *)cpuset)[i])
> return (EINVAL);
> }
> }
576a603,606
> } else {
> memset(((char *)attr->cpuset) + cpusetsize, 0,
> cpusetsize - attr->cpusetsize);
> attr->cpusetsize = cpusetsize;
583a614
> __weak_reference(_pthread_attr_getaffinity_np, pthread_attr_getaffinity_np);
585c616
< pthread_attr_getaffinity_np(const pthread_attr_t *pattr, size_t cpusetsize,
---
> _pthread_attr_getaffinity_np(const pthread_attr_t *pattr, size_t cpusetsize,
599c630,634
< memset(cpuset, -1, cpusetsize);
---
> int kern_size = _get_kern_cpuset_size();
> memset(cpuset, -1, MIN(cpusetsize, kern_size));
> if (cpusetsize > kern_size)
> memset(((char *)cpuset) + kern_size, 0,
> cpusetsize - kern_size);