1bb535300SJeff Roberson /* 2bb535300SJeff Roberson * Copyright (c) 2003 Craig Rodrigues <rodrigc@attbi.com>. 3bb535300SJeff Roberson * All rights reserved. 4bb535300SJeff Roberson * 5bb535300SJeff Roberson * Redistribution and use in source and binary forms, with or without 6bb535300SJeff Roberson * modification, are permitted provided that the following conditions 7bb535300SJeff Roberson * are met: 8bb535300SJeff Roberson * 1. Redistributions of source code must retain the above copyright 9bb535300SJeff Roberson * notice, this list of conditions and the following disclaimer. 10bb535300SJeff Roberson * 2. Redistributions in binary form must reproduce the above copyright 11bb535300SJeff Roberson * notice, this list of conditions and the following disclaimer in the 12bb535300SJeff Roberson * documentation and/or other materials provided with the distribution. 13bb535300SJeff Roberson * 3. All advertising materials mentioning features or use of this software 14bb535300SJeff Roberson * must display the following acknowledgement: 15bb535300SJeff Roberson * This product includes software developed by Craig Rodrigues. 16bb535300SJeff Roberson * 4. Neither the name of the author nor the names of any co-contributors 17bb535300SJeff Roberson * may be used to endorse or promote products derived from this software 18bb535300SJeff Roberson * without specific prior written permission. 19bb535300SJeff Roberson * 20bb535300SJeff Roberson * THIS SOFTWARE IS PROVIDED BY CRAIG RODRIGUES AND CONTRIBUTORS ``AS IS'' AND 21bb535300SJeff Roberson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22bb535300SJeff Roberson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23bb535300SJeff Roberson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24bb535300SJeff Roberson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25bb535300SJeff Roberson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26bb535300SJeff Roberson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27bb535300SJeff Roberson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28bb535300SJeff Roberson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29bb535300SJeff Roberson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30bb535300SJeff Roberson * SUCH DAMAGE. 31bb535300SJeff Roberson * 32bb535300SJeff Roberson */ 33bb535300SJeff Roberson 34bb535300SJeff Roberson /* 35bb535300SJeff Roberson * Copyright (c) 1998 Daniel Eischen <eischen@vigrid.com>. 36bb535300SJeff Roberson * Copyright (C) 2001 Jason Evans <jasone@freebsd.org>. 37bb535300SJeff Roberson * Copyright (c) 2002,2003 Alexey Zelkin <phantom@FreeBSD.org> 38bb535300SJeff Roberson * All rights reserved. 39bb535300SJeff Roberson * 40bb535300SJeff Roberson * Redistribution and use in source and binary forms, with or without 41bb535300SJeff Roberson * modification, are permitted provided that the following conditions 42bb535300SJeff Roberson * are met: 43bb535300SJeff Roberson * 1. Redistributions of source code must retain the above copyright 44bb535300SJeff Roberson * notice(s), this list of conditions and the following disclaimer 45bb535300SJeff Roberson * unmodified other than the allowable addition of one or more 46bb535300SJeff Roberson * copyright notices. 47bb535300SJeff Roberson * 2. Redistributions in binary form must reproduce the above copyright 48bb535300SJeff Roberson * notice(s), this list of conditions and the following disclaimer in 49bb535300SJeff Roberson * the documentation and/or other materials provided with the 50bb535300SJeff Roberson * distribution. 51bb535300SJeff Roberson * 52bb535300SJeff Roberson * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY 53bb535300SJeff Roberson * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 54bb535300SJeff Roberson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 55bb535300SJeff Roberson * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE 56bb535300SJeff Roberson * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 57bb535300SJeff Roberson * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 58bb535300SJeff Roberson * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 59bb535300SJeff Roberson * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 60bb535300SJeff Roberson * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 61bb535300SJeff Roberson * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 62bb535300SJeff Roberson * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 63bb535300SJeff Roberson */ 64bb535300SJeff Roberson 65a091d823SDavid Xu /* 66a091d823SDavid Xu * Copyright (c) 1996 John Birrell <jb@cimlogic.com.au>. 67a091d823SDavid Xu * All rights reserved. 68a091d823SDavid Xu * 69a091d823SDavid Xu * Redistribution and use in source and binary forms, with or without 70a091d823SDavid Xu * modification, are permitted provided that the following conditions 71a091d823SDavid Xu * are met: 72a091d823SDavid Xu * 1. Redistributions of source code must retain the above copyright 73a091d823SDavid Xu * notice, this list of conditions and the following disclaimer. 74a091d823SDavid Xu * 2. Redistributions in binary form must reproduce the above copyright 75a091d823SDavid Xu * notice, this list of conditions and the following disclaimer in the 76a091d823SDavid Xu * documentation and/or other materials provided with the distribution. 77fed32d75SWarner Losh * 3. Neither the name of the author nor the names of any co-contributors 78a091d823SDavid Xu * may be used to endorse or promote products derived from this software 79a091d823SDavid Xu * without specific prior written permission. 80a091d823SDavid Xu * 81a091d823SDavid Xu * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND 82a091d823SDavid Xu * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 83a091d823SDavid Xu * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 84a091d823SDavid Xu * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 85a091d823SDavid Xu * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 86a091d823SDavid Xu * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 87a091d823SDavid Xu * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 88a091d823SDavid Xu * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 89a091d823SDavid Xu * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 90a091d823SDavid Xu * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 91a091d823SDavid Xu * SUCH DAMAGE. 92a091d823SDavid Xu * 93a091d823SDavid Xu * $FreeBSD$ 94a091d823SDavid Xu */ 95bb535300SJeff Roberson 9637a6356bSDavid Xu #include "namespace.h" 97bb535300SJeff Roberson #include <errno.h> 98bb535300SJeff Roberson #include <pthread.h> 99bb535300SJeff Roberson #include <stdlib.h> 100bb535300SJeff Roberson #include <string.h> 101a091d823SDavid Xu #include <pthread_np.h> 10237a6356bSDavid Xu #include "un-namespace.h" 103bb535300SJeff Roberson 104bb535300SJeff Roberson #include "thr_private.h" 105bb535300SJeff Roberson 1060d48409fSMike Makonnen __weak_reference(_pthread_attr_destroy, pthread_attr_destroy); 107bb535300SJeff Roberson 108bb535300SJeff Roberson int 109bb535300SJeff Roberson _pthread_attr_destroy(pthread_attr_t *attr) 110bb535300SJeff Roberson { 111a091d823SDavid Xu int ret; 112bb535300SJeff Roberson 113a091d823SDavid Xu /* Check for invalid arguments: */ 114a091d823SDavid Xu if (attr == NULL || *attr == NULL) 115a091d823SDavid Xu /* Invalid argument: */ 116a091d823SDavid Xu ret = EINVAL; 117a091d823SDavid Xu else { 118a091d823SDavid Xu /* Free the memory allocated to the attribute object: */ 119bb535300SJeff Roberson free(*attr); 120a091d823SDavid Xu 121a091d823SDavid Xu /* 122a091d823SDavid Xu * Leave the attribute pointer NULL now that the memory 123a091d823SDavid Xu * has been freed: 124a091d823SDavid Xu */ 125bb535300SJeff Roberson *attr = NULL; 126a091d823SDavid Xu ret = 0; 127a091d823SDavid Xu } 128a091d823SDavid Xu return(ret); 129bb535300SJeff Roberson } 130bb535300SJeff Roberson 131a091d823SDavid Xu __weak_reference(_pthread_attr_get_np, pthread_attr_get_np); 132bb535300SJeff Roberson 133bb535300SJeff Roberson int 134bb535300SJeff Roberson _pthread_attr_get_np(pthread_t pid, pthread_attr_t *dst) 135bb535300SJeff Roberson { 136a091d823SDavid Xu struct pthread *curthread; 137a091d823SDavid Xu struct pthread_attr attr; 138bb535300SJeff Roberson int ret; 139bb535300SJeff Roberson 140bb535300SJeff Roberson if (pid == NULL || dst == NULL || *dst == NULL) 141bb535300SJeff Roberson return (EINVAL); 142bb535300SJeff Roberson 143a091d823SDavid Xu curthread = _get_curthread(); 144a091d823SDavid Xu if ((ret = _thr_ref_add(curthread, pid, /*include dead*/0)) != 0) 145bb535300SJeff Roberson return (ret); 146a091d823SDavid Xu attr = pid->attr; 1474160cda0SDavid Xu if (pid->tlflags & TLFLAGS_DETACHED) 1484160cda0SDavid Xu attr.flags |= PTHREAD_DETACHED; 149a091d823SDavid Xu _thr_ref_delete(curthread, pid); 150a091d823SDavid Xu memcpy(*dst, &attr, sizeof(struct pthread_attr)); 151bb535300SJeff Roberson 152bb535300SJeff Roberson return (0); 153bb535300SJeff Roberson } 154bb535300SJeff Roberson 155a091d823SDavid Xu __weak_reference(_pthread_attr_getdetachstate, pthread_attr_getdetachstate); 156a091d823SDavid Xu 157bb535300SJeff Roberson int 158bb535300SJeff Roberson _pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate) 159bb535300SJeff Roberson { 160a091d823SDavid Xu int ret; 161bb535300SJeff Roberson 162a091d823SDavid Xu /* Check for invalid arguments: */ 163bb535300SJeff Roberson if (attr == NULL || *attr == NULL || detachstate == NULL) 164a091d823SDavid Xu ret = EINVAL; 165a091d823SDavid Xu else { 166bb535300SJeff Roberson /* Check if the detached flag is set: */ 167bb535300SJeff Roberson if ((*attr)->flags & PTHREAD_DETACHED) 168a091d823SDavid Xu /* Return detached: */ 169bb535300SJeff Roberson *detachstate = PTHREAD_CREATE_DETACHED; 170bb535300SJeff Roberson else 171a091d823SDavid Xu /* Return joinable: */ 172bb535300SJeff Roberson *detachstate = PTHREAD_CREATE_JOINABLE; 173a091d823SDavid Xu ret = 0; 174bb535300SJeff Roberson } 175a091d823SDavid Xu return(ret); 176a091d823SDavid Xu } 177a091d823SDavid Xu 178a091d823SDavid Xu __weak_reference(_pthread_attr_getguardsize, pthread_attr_getguardsize); 179bb535300SJeff Roberson 180bb535300SJeff Roberson int 181bb535300SJeff Roberson _pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guardsize) 182bb535300SJeff Roberson { 183a091d823SDavid Xu int ret; 184a091d823SDavid Xu 185a091d823SDavid Xu /* Check for invalid arguments: */ 186bb535300SJeff Roberson if (attr == NULL || *attr == NULL || guardsize == NULL) 187a091d823SDavid Xu ret = EINVAL; 188a091d823SDavid Xu else { 189a091d823SDavid Xu /* Return the guard size: */ 190bb535300SJeff Roberson *guardsize = (*attr)->guardsize_attr; 191a091d823SDavid Xu ret = 0; 192bb535300SJeff Roberson } 193a091d823SDavid Xu return(ret); 194a091d823SDavid Xu } 195a091d823SDavid Xu 196a091d823SDavid Xu __weak_reference(_pthread_attr_getinheritsched, pthread_attr_getinheritsched); 197bb535300SJeff Roberson 198bb535300SJeff Roberson int 199bb535300SJeff Roberson _pthread_attr_getinheritsched(const pthread_attr_t *attr, int *sched_inherit) 200bb535300SJeff Roberson { 201a091d823SDavid Xu int ret = 0; 202bb535300SJeff Roberson 203a091d823SDavid Xu if ((attr == NULL) || (*attr == NULL)) 204a091d823SDavid Xu ret = EINVAL; 205a091d823SDavid Xu else 206bb535300SJeff Roberson *sched_inherit = (*attr)->sched_inherit; 207bb535300SJeff Roberson 208a091d823SDavid Xu return(ret); 209bb535300SJeff Roberson } 210bb535300SJeff Roberson 211a091d823SDavid Xu __weak_reference(_pthread_attr_getschedparam, pthread_attr_getschedparam); 212a091d823SDavid Xu 213bb535300SJeff Roberson int 214bb535300SJeff Roberson _pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param) 215bb535300SJeff Roberson { 216a091d823SDavid Xu int ret = 0; 217bb535300SJeff Roberson 218a091d823SDavid Xu if ((attr == NULL) || (*attr == NULL) || (param == NULL)) 219a091d823SDavid Xu ret = EINVAL; 220a091d823SDavid Xu else 221bb535300SJeff Roberson param->sched_priority = (*attr)->prio; 222bb535300SJeff Roberson 223a091d823SDavid Xu return(ret); 224bb535300SJeff Roberson } 225bb535300SJeff Roberson 226a091d823SDavid Xu __weak_reference(_pthread_attr_getschedpolicy, pthread_attr_getschedpolicy); 227a091d823SDavid Xu 228bb535300SJeff Roberson int 229bb535300SJeff Roberson _pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy) 230bb535300SJeff Roberson { 231a091d823SDavid Xu int ret = 0; 232bb535300SJeff Roberson 233a091d823SDavid Xu if ((attr == NULL) || (*attr == NULL) || (policy == NULL)) 234a091d823SDavid Xu ret = EINVAL; 235a091d823SDavid Xu else 236bb535300SJeff Roberson *policy = (*attr)->sched_policy; 237bb535300SJeff Roberson 238a091d823SDavid Xu return(ret); 239bb535300SJeff Roberson } 240bb535300SJeff Roberson 241a091d823SDavid Xu __weak_reference(_pthread_attr_getscope, pthread_attr_getscope); 242a091d823SDavid Xu 243bb535300SJeff Roberson int 244bb535300SJeff Roberson _pthread_attr_getscope(const pthread_attr_t *attr, int *contentionscope) 245bb535300SJeff Roberson { 246a091d823SDavid Xu int ret = 0; 247bb535300SJeff Roberson 248a091d823SDavid Xu if ((attr == NULL) || (*attr == NULL) || (contentionscope == NULL)) 249a091d823SDavid Xu /* Return an invalid argument: */ 250a091d823SDavid Xu ret = EINVAL; 251a091d823SDavid Xu 252a091d823SDavid Xu else 253bb535300SJeff Roberson *contentionscope = (*attr)->flags & PTHREAD_SCOPE_SYSTEM ? 254bb535300SJeff Roberson PTHREAD_SCOPE_SYSTEM : PTHREAD_SCOPE_PROCESS; 255bb535300SJeff Roberson 256a091d823SDavid Xu return(ret); 257bb535300SJeff Roberson } 258bb535300SJeff Roberson 259a091d823SDavid Xu __weak_reference(_pthread_attr_getstack, pthread_attr_getstack); 260a091d823SDavid Xu 261bb535300SJeff Roberson int 262bb535300SJeff Roberson _pthread_attr_getstack(const pthread_attr_t * __restrict attr, 263bb535300SJeff Roberson void ** __restrict stackaddr, 264bb535300SJeff Roberson size_t * __restrict stacksize) 265bb535300SJeff Roberson { 266a091d823SDavid Xu int ret; 267a091d823SDavid Xu 268a091d823SDavid Xu /* Check for invalid arguments: */ 269bb535300SJeff Roberson if (attr == NULL || *attr == NULL || stackaddr == NULL 270bb535300SJeff Roberson || stacksize == NULL ) 271a091d823SDavid Xu ret = EINVAL; 272a091d823SDavid Xu else { 273a091d823SDavid Xu /* Return the stack address and size */ 274bb535300SJeff Roberson *stackaddr = (*attr)->stackaddr_attr; 275bb535300SJeff Roberson *stacksize = (*attr)->stacksize_attr; 276a091d823SDavid Xu ret = 0; 277bb535300SJeff Roberson } 278a091d823SDavid Xu return(ret); 279a091d823SDavid Xu } 280a091d823SDavid Xu 281a091d823SDavid Xu __weak_reference(_pthread_attr_getstackaddr, pthread_attr_getstackaddr); 282bb535300SJeff Roberson 283bb535300SJeff Roberson int 284bb535300SJeff Roberson _pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr) 285bb535300SJeff Roberson { 286a091d823SDavid Xu int ret; 287a091d823SDavid Xu 288a091d823SDavid Xu /* Check for invalid arguments: */ 289bb535300SJeff Roberson if (attr == NULL || *attr == NULL || stackaddr == NULL) 290a091d823SDavid Xu ret = EINVAL; 291a091d823SDavid Xu else { 292a091d823SDavid Xu /* Return the stack address: */ 293bb535300SJeff Roberson *stackaddr = (*attr)->stackaddr_attr; 294a091d823SDavid Xu ret = 0; 295bb535300SJeff Roberson } 296a091d823SDavid Xu return(ret); 297a091d823SDavid Xu } 298a091d823SDavid Xu 299a091d823SDavid Xu __weak_reference(_pthread_attr_getstacksize, pthread_attr_getstacksize); 300bb535300SJeff Roberson 301bb535300SJeff Roberson int 302bb535300SJeff Roberson _pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize) 303bb535300SJeff Roberson { 304a091d823SDavid Xu int ret; 305a091d823SDavid Xu 306a091d823SDavid Xu /* Check for invalid arguments: */ 307bb535300SJeff Roberson if (attr == NULL || *attr == NULL || stacksize == NULL) 308a091d823SDavid Xu ret = EINVAL; 309a091d823SDavid Xu else { 310a091d823SDavid Xu /* Return the stack size: */ 311bb535300SJeff Roberson *stacksize = (*attr)->stacksize_attr; 312a091d823SDavid Xu ret = 0; 313a091d823SDavid Xu } 314a091d823SDavid Xu return(ret); 315a091d823SDavid Xu } 316bb535300SJeff Roberson 317a091d823SDavid Xu __weak_reference(_pthread_attr_init, pthread_attr_init); 318a091d823SDavid Xu 319a091d823SDavid Xu int 320a091d823SDavid Xu _pthread_attr_init(pthread_attr_t *attr) 321a091d823SDavid Xu { 322a091d823SDavid Xu int ret; 323a091d823SDavid Xu pthread_attr_t pattr; 324a091d823SDavid Xu 325a091d823SDavid Xu _thr_check_init(); 326a091d823SDavid Xu 327a091d823SDavid Xu /* Allocate memory for the attribute object: */ 328a091d823SDavid Xu if ((pattr = (pthread_attr_t) malloc(sizeof(struct pthread_attr))) == NULL) 329a091d823SDavid Xu /* Insufficient memory: */ 330a091d823SDavid Xu ret = ENOMEM; 331a091d823SDavid Xu else { 332a091d823SDavid Xu /* Initialise the attribute object with the defaults: */ 333a091d823SDavid Xu memcpy(pattr, &_pthread_attr_default, sizeof(struct pthread_attr)); 334a091d823SDavid Xu 335a091d823SDavid Xu /* Return a pointer to the attribute object: */ 336a091d823SDavid Xu *attr = pattr; 337a091d823SDavid Xu ret = 0; 338a091d823SDavid Xu } 339a091d823SDavid Xu return(ret); 340a091d823SDavid Xu } 341a091d823SDavid Xu 342a091d823SDavid Xu __weak_reference(_pthread_attr_setcreatesuspend_np, pthread_attr_setcreatesuspend_np); 343a091d823SDavid Xu 344a091d823SDavid Xu int 345a091d823SDavid Xu _pthread_attr_setcreatesuspend_np(pthread_attr_t *attr) 346a091d823SDavid Xu { 347a091d823SDavid Xu int ret; 348a091d823SDavid Xu 349a091d823SDavid Xu if (attr == NULL || *attr == NULL) { 350a091d823SDavid Xu ret = EINVAL; 351a091d823SDavid Xu } else { 352a091d823SDavid Xu (*attr)->suspend = THR_CREATE_SUSPENDED; 353a091d823SDavid Xu ret = 0; 354a091d823SDavid Xu } 355a091d823SDavid Xu return(ret); 356a091d823SDavid Xu } 357a091d823SDavid Xu 358a091d823SDavid Xu __weak_reference(_pthread_attr_setdetachstate, pthread_attr_setdetachstate); 359a091d823SDavid Xu 360a091d823SDavid Xu int 361a091d823SDavid Xu _pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate) 362a091d823SDavid Xu { 363a091d823SDavid Xu int ret; 364a091d823SDavid Xu 365a091d823SDavid Xu /* Check for invalid arguments: */ 366a091d823SDavid Xu if (attr == NULL || *attr == NULL || 367a091d823SDavid Xu (detachstate != PTHREAD_CREATE_DETACHED && 368a091d823SDavid Xu detachstate != PTHREAD_CREATE_JOINABLE)) 369a091d823SDavid Xu ret = EINVAL; 370a091d823SDavid Xu else { 371a091d823SDavid Xu /* Check if detached state: */ 372a091d823SDavid Xu if (detachstate == PTHREAD_CREATE_DETACHED) 373a091d823SDavid Xu /* Set the detached flag: */ 374a091d823SDavid Xu (*attr)->flags |= PTHREAD_DETACHED; 375a091d823SDavid Xu else 376a091d823SDavid Xu /* Reset the detached flag: */ 377a091d823SDavid Xu (*attr)->flags &= ~PTHREAD_DETACHED; 378a091d823SDavid Xu ret = 0; 379a091d823SDavid Xu } 380a091d823SDavid Xu return(ret); 381a091d823SDavid Xu } 382a091d823SDavid Xu 383a091d823SDavid Xu __weak_reference(_pthread_attr_setguardsize, pthread_attr_setguardsize); 384a091d823SDavid Xu 385a091d823SDavid Xu int 386a091d823SDavid Xu _pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize) 387a091d823SDavid Xu { 388a091d823SDavid Xu int ret; 389a091d823SDavid Xu 390a091d823SDavid Xu /* Check for invalid arguments. */ 391a091d823SDavid Xu if (attr == NULL || *attr == NULL) 392a091d823SDavid Xu ret = EINVAL; 393a091d823SDavid Xu else { 394a091d823SDavid Xu /* Save the stack size. */ 395a091d823SDavid Xu (*attr)->guardsize_attr = guardsize; 396a091d823SDavid Xu ret = 0; 397a091d823SDavid Xu } 398a091d823SDavid Xu return(ret); 399a091d823SDavid Xu } 400a091d823SDavid Xu 401a091d823SDavid Xu __weak_reference(_pthread_attr_setinheritsched, pthread_attr_setinheritsched); 402a091d823SDavid Xu 403a091d823SDavid Xu int 404a091d823SDavid Xu _pthread_attr_setinheritsched(pthread_attr_t *attr, int sched_inherit) 405a091d823SDavid Xu { 406a091d823SDavid Xu int ret = 0; 407a091d823SDavid Xu 408a091d823SDavid Xu if ((attr == NULL) || (*attr == NULL)) 409a091d823SDavid Xu ret = EINVAL; 410a091d823SDavid Xu else if (sched_inherit != PTHREAD_INHERIT_SCHED && 411a091d823SDavid Xu sched_inherit != PTHREAD_EXPLICIT_SCHED) 412a091d823SDavid Xu ret = ENOTSUP; 413a091d823SDavid Xu else 414a091d823SDavid Xu (*attr)->sched_inherit = sched_inherit; 415a091d823SDavid Xu 416a091d823SDavid Xu return(ret); 417a091d823SDavid Xu } 418a091d823SDavid Xu 419a091d823SDavid Xu __weak_reference(_pthread_attr_setschedparam, pthread_attr_setschedparam); 420a091d823SDavid Xu 421a091d823SDavid Xu int 422a091d823SDavid Xu _pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param) 423a091d823SDavid Xu { 424245116caSDavid Xu int policy; 425a091d823SDavid Xu 426a091d823SDavid Xu if ((attr == NULL) || (*attr == NULL)) 427245116caSDavid Xu return (EINVAL); 428245116caSDavid Xu 429245116caSDavid Xu if (param == NULL) 430245116caSDavid Xu return (ENOTSUP); 431245116caSDavid Xu 432245116caSDavid Xu policy = (*attr)->sched_policy; 433245116caSDavid Xu 4347b4f8f03SDavid Xu if (policy == SCHED_FIFO || policy == SCHED_RR) { 435245116caSDavid Xu if (param->sched_priority < _thr_priorities[policy-1].pri_min || 436245116caSDavid Xu param->sched_priority > _thr_priorities[policy-1].pri_max) 437245116caSDavid Xu return (ENOTSUP); 4387b4f8f03SDavid Xu } else { 4397b4f8f03SDavid Xu /* 4407b4f8f03SDavid Xu * Ignore it for SCHED_OTHER now, patches for glib ports 4417b4f8f03SDavid Xu * are wrongly using M:N thread library's internal macro 4427b4f8f03SDavid Xu * THR_MIN_PRIORITY and THR_MAX_PRIORITY. 4437b4f8f03SDavid Xu */ 4447b4f8f03SDavid Xu } 445245116caSDavid Xu 446a091d823SDavid Xu (*attr)->prio = param->sched_priority; 447a091d823SDavid Xu 448245116caSDavid Xu return (0); 449a091d823SDavid Xu } 450a091d823SDavid Xu 451a091d823SDavid Xu __weak_reference(_pthread_attr_setschedpolicy, pthread_attr_setschedpolicy); 452a091d823SDavid Xu 453a091d823SDavid Xu int 454a091d823SDavid Xu _pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy) 455a091d823SDavid Xu { 456a091d823SDavid Xu int ret = 0; 457a091d823SDavid Xu 458a091d823SDavid Xu if ((attr == NULL) || (*attr == NULL)) 459a091d823SDavid Xu ret = EINVAL; 460a091d823SDavid Xu else if ((policy < SCHED_FIFO) || (policy > SCHED_RR)) { 461a091d823SDavid Xu ret = ENOTSUP; 462245116caSDavid Xu } else { 463a091d823SDavid Xu (*attr)->sched_policy = policy; 464245116caSDavid Xu (*attr)->prio = _thr_priorities[policy-1].pri_default; 465245116caSDavid Xu } 466a091d823SDavid Xu return(ret); 467a091d823SDavid Xu } 468a091d823SDavid Xu 469a091d823SDavid Xu __weak_reference(_pthread_attr_setscope, pthread_attr_setscope); 470a091d823SDavid Xu 471a091d823SDavid Xu int 472a091d823SDavid Xu _pthread_attr_setscope(pthread_attr_t *attr, int contentionscope) 473a091d823SDavid Xu { 474a091d823SDavid Xu int ret = 0; 475a091d823SDavid Xu 476a091d823SDavid Xu if ((attr == NULL) || (*attr == NULL)) { 477a091d823SDavid Xu /* Return an invalid argument: */ 478a091d823SDavid Xu ret = EINVAL; 479a091d823SDavid Xu } else if ((contentionscope != PTHREAD_SCOPE_PROCESS) && 480a091d823SDavid Xu (contentionscope != PTHREAD_SCOPE_SYSTEM)) { 481a091d823SDavid Xu ret = EINVAL; 482a091d823SDavid Xu } else if (contentionscope == PTHREAD_SCOPE_SYSTEM) { 483a091d823SDavid Xu (*attr)->flags |= contentionscope; 484a091d823SDavid Xu } else { 485a091d823SDavid Xu (*attr)->flags &= ~PTHREAD_SCOPE_SYSTEM; 486a091d823SDavid Xu } 487a091d823SDavid Xu return (ret); 488a091d823SDavid Xu } 489a091d823SDavid Xu 490a091d823SDavid Xu __weak_reference(_pthread_attr_setstack, pthread_attr_setstack); 491a091d823SDavid Xu 492a091d823SDavid Xu int 493a091d823SDavid Xu _pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, 494a091d823SDavid Xu size_t stacksize) 495a091d823SDavid Xu { 496a091d823SDavid Xu int ret; 497a091d823SDavid Xu 498a091d823SDavid Xu /* Check for invalid arguments: */ 499a091d823SDavid Xu if (attr == NULL || *attr == NULL || stackaddr == NULL 500a091d823SDavid Xu || stacksize < PTHREAD_STACK_MIN) 501a091d823SDavid Xu ret = EINVAL; 502a091d823SDavid Xu else { 503a091d823SDavid Xu /* Save the stack address and stack size */ 504a091d823SDavid Xu (*attr)->stackaddr_attr = stackaddr; 505a091d823SDavid Xu (*attr)->stacksize_attr = stacksize; 506a091d823SDavid Xu ret = 0; 507a091d823SDavid Xu } 508a091d823SDavid Xu return(ret); 509a091d823SDavid Xu } 510a091d823SDavid Xu 511a091d823SDavid Xu __weak_reference(_pthread_attr_setstackaddr, pthread_attr_setstackaddr); 512a091d823SDavid Xu 513a091d823SDavid Xu int 514a091d823SDavid Xu _pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr) 515a091d823SDavid Xu { 516a091d823SDavid Xu int ret; 517a091d823SDavid Xu 518a091d823SDavid Xu /* Check for invalid arguments: */ 519a091d823SDavid Xu if (attr == NULL || *attr == NULL || stackaddr == NULL) 520a091d823SDavid Xu ret = EINVAL; 521a091d823SDavid Xu else { 522a091d823SDavid Xu /* Save the stack address: */ 523a091d823SDavid Xu (*attr)->stackaddr_attr = stackaddr; 524a091d823SDavid Xu ret = 0; 525a091d823SDavid Xu } 526a091d823SDavid Xu return(ret); 527a091d823SDavid Xu } 528a091d823SDavid Xu 529a091d823SDavid Xu __weak_reference(_pthread_attr_setstacksize, pthread_attr_setstacksize); 530a091d823SDavid Xu 531a091d823SDavid Xu int 532a091d823SDavid Xu _pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize) 533a091d823SDavid Xu { 534a091d823SDavid Xu int ret; 535a091d823SDavid Xu 536a091d823SDavid Xu /* Check for invalid arguments: */ 537a091d823SDavid Xu if (attr == NULL || *attr == NULL || stacksize < PTHREAD_STACK_MIN) 538a091d823SDavid Xu ret = EINVAL; 539a091d823SDavid Xu else { 540a091d823SDavid Xu /* Save the stack size: */ 541a091d823SDavid Xu (*attr)->stacksize_attr = stacksize; 542a091d823SDavid Xu ret = 0; 543a091d823SDavid Xu } 544a091d823SDavid Xu return(ret); 545bb535300SJeff Roberson } 546