thr_attr.c (176781) | thr_attr.c (176815) |
---|---|
1/* 2 * Copyright (c) 2003 Craig Rodrigues <rodrigc@attbi.com>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 76 unchanged lines hidden (view full) --- 85 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 86 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 87 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 88 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 89 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 90 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 91 * SUCH DAMAGE. 92 * | 1/* 2 * Copyright (c) 2003 Craig Rodrigues <rodrigc@attbi.com>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 76 unchanged lines hidden (view full) --- 85 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 86 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 87 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 88 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 89 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 90 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 91 * SUCH DAMAGE. 92 * |
93 * $FreeBSD: head/lib/libthr/thread/thr_attr.c 176781 2008-03-04 03:03:24Z davidxu $ | 93 * $FreeBSD: head/lib/libthr/thread/thr_attr.c 176815 2008-03-05 06:55:48Z davidxu $ |
94 */ 95 96#include "namespace.h" 97#include <errno.h> 98#include <pthread.h> 99#include <stdlib.h> 100#include <string.h> 101#include <pthread_np.h> | 94 */ 95 96#include "namespace.h" 97#include <errno.h> 98#include <pthread.h> 99#include <stdlib.h> 100#include <string.h> 101#include <pthread_np.h> |
102#include <sys/sysctl.h> |
|
102#include "un-namespace.h" 103 104#include "thr_private.h" 105 106__weak_reference(_pthread_attr_destroy, pthread_attr_destroy); 107 108int 109_pthread_attr_destroy(pthread_attr_t *attr) --- 431 unchanged lines hidden (view full) --- 541 else { 542 /* Save the stack size: */ 543 (*attr)->stacksize_attr = stacksize; 544 ret = 0; 545 } 546 return(ret); 547} 548 | 103#include "un-namespace.h" 104 105#include "thr_private.h" 106 107__weak_reference(_pthread_attr_destroy, pthread_attr_destroy); 108 109int 110_pthread_attr_destroy(pthread_attr_t *attr) --- 431 unchanged lines hidden (view full) --- 542 else { 543 /* Save the stack size: */ 544 (*attr)->stacksize_attr = stacksize; 545 ret = 0; 546 } 547 return(ret); 548} 549 |
550static int 551_get_kern_cpuset_size() 552{ 553 static int kern_cpuset_size = 0; 554 555 if (kern_cpuset_size == 0) { 556 int len; 557 558 len = sizeof(kern_cpuset_size); 559 if (sysctlbyname("kern.smp.maxcpus", &kern_cpuset_size, 560 &len, NULL, 0)) 561 PANIC("failed to get sysctl kern.smp.maxcpus"); 562 563 kern_cpuset_size = (kern_cpuset_size + 7) / 8; 564 } 565 566 return (kern_cpuset_size); 567} 568 569__weak_reference(_pthread_attr_setaffinity_np, pthread_attr_setaffinity_np); |
|
549int | 570int |
550pthread_attr_setaffinity_np(pthread_attr_t *pattr, size_t cpusetsize, | 571_pthread_attr_setaffinity_np(pthread_attr_t *pattr, size_t cpusetsize, |
551 const cpuset_t *cpuset) 552{ 553 pthread_attr_t attr; 554 int ret; 555 556 if (pattr == NULL || (attr = (*pattr)) == NULL) 557 ret = EINVAL; 558 else { 559 if (cpusetsize == 0 || cpuset == NULL) { 560 if (attr->cpuset != NULL) { 561 free(attr->cpuset); 562 attr->cpuset = NULL; 563 attr->cpusetsize = 0; 564 } 565 return (0); 566 } 567 | 572 const cpuset_t *cpuset) 573{ 574 pthread_attr_t attr; 575 int ret; 576 577 if (pattr == NULL || (attr = (*pattr)) == NULL) 578 ret = EINVAL; 579 else { 580 if (cpusetsize == 0 || cpuset == NULL) { 581 if (attr->cpuset != NULL) { 582 free(attr->cpuset); 583 attr->cpuset = NULL; 584 attr->cpusetsize = 0; 585 } 586 return (0); 587 } 588 |
568 /* 569 * XXX figure out kernel cpuset size, reject invalid size. 570 */ 571 if (cpusetsize != attr->cpusetsize) { | 589 if (cpusetsize > attr->cpusetsize) { 590 int kern_size = _get_kern_cpuset_size(); 591 if (cpusetsize > kern_size) { 592 int i; 593 for (i = kern_size; i < cpusetsize; ++i) { 594 if (((char *)cpuset)[i]) 595 return (EINVAL); 596 } 597 } |
572 void *newset = realloc(attr->cpuset, cpusetsize); 573 if (newset == NULL) 574 return (ENOMEM); 575 attr->cpuset = newset; 576 attr->cpusetsize = cpusetsize; | 598 void *newset = realloc(attr->cpuset, cpusetsize); 599 if (newset == NULL) 600 return (ENOMEM); 601 attr->cpuset = newset; 602 attr->cpusetsize = cpusetsize; |
603 } else { 604 memset(((char *)attr->cpuset) + cpusetsize, 0, 605 cpusetsize - attr->cpusetsize); 606 attr->cpusetsize = cpusetsize; |
|
577 } 578 memcpy(attr->cpuset, cpuset, cpusetsize); 579 ret = 0; 580 } 581 return (ret); 582} 583 | 607 } 608 memcpy(attr->cpuset, cpuset, cpusetsize); 609 ret = 0; 610 } 611 return (ret); 612} 613 |
614__weak_reference(_pthread_attr_getaffinity_np, pthread_attr_getaffinity_np); |
|
584int | 615int |
585pthread_attr_getaffinity_np(const pthread_attr_t *pattr, size_t cpusetsize, | 616_pthread_attr_getaffinity_np(const pthread_attr_t *pattr, size_t cpusetsize, |
586 cpuset_t *cpuset) 587{ 588 pthread_attr_t attr; 589 int ret = 0; 590 591 if (pattr == NULL || (attr = (*pattr)) == NULL) 592 ret = EINVAL; 593 else if (attr->cpuset != NULL) { 594 memcpy(cpuset, attr->cpuset, MIN(cpusetsize, attr->cpusetsize)); 595 if (cpusetsize > attr->cpusetsize) 596 memset(((char *)cpuset) + attr->cpusetsize, 0, 597 cpusetsize - attr->cpusetsize); 598 } else { | 617 cpuset_t *cpuset) 618{ 619 pthread_attr_t attr; 620 int ret = 0; 621 622 if (pattr == NULL || (attr = (*pattr)) == NULL) 623 ret = EINVAL; 624 else if (attr->cpuset != NULL) { 625 memcpy(cpuset, attr->cpuset, MIN(cpusetsize, attr->cpusetsize)); 626 if (cpusetsize > attr->cpusetsize) 627 memset(((char *)cpuset) + attr->cpusetsize, 0, 628 cpusetsize - attr->cpusetsize); 629 } else { |
599 memset(cpuset, -1, cpusetsize); | 630 int kern_size = _get_kern_cpuset_size(); 631 memset(cpuset, -1, MIN(cpusetsize, kern_size)); 632 if (cpusetsize > kern_size) 633 memset(((char *)cpuset) + kern_size, 0, 634 cpusetsize - kern_size); |
600 } 601 return (ret); 602} | 635 } 636 return (ret); 637} |