From ec2c16983989477c99455adf31893c4d26435961 Mon Sep 17 00:00:00 2001 From: nathanw Date: Fri, 18 Jul 2003 22:33:45 +0000 Subject: [PATCH] pthread.c was getting a bit unwieldly. Move pthread_attr stuff out into a new file, and put the shared private structure definition in pthread_int.h. --- lib/libpthread/Makefile | 3 +- lib/libpthread/pthread.c | 362 +------------------------------ lib/libpthread/pthread_attr.c | 397 ++++++++++++++++++++++++++++++++++ lib/libpthread/pthread_int.h | 13 +- 4 files changed, 413 insertions(+), 362 deletions(-) create mode 100644 lib/libpthread/pthread_attr.c diff --git a/lib/libpthread/Makefile b/lib/libpthread/Makefile index badde5564f7d..55ff2ad4f130 100644 --- a/lib/libpthread/Makefile +++ b/lib/libpthread/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.17 2003/06/03 21:34:00 nathanw Exp $ +# $NetBSD: Makefile,v 1.18 2003/07/18 22:33:45 nathanw Exp $ # WARNS= 2 @@ -40,6 +40,7 @@ LIB= pthread # SRCS= pthread.c SRCS+= pthread_alarms.c +SRCS+= pthread_attr.c SRCS+= pthread_barrier.c SRCS+= pthread_cancelstub.c SRCS+= pthread_cond.c diff --git a/lib/libpthread/pthread.c b/lib/libpthread/pthread.c index 96f91b764d0f..7541b6d7a423 100644 --- a/lib/libpthread/pthread.c +++ b/lib/libpthread/pthread.c @@ -1,7 +1,7 @@ -/* $NetBSD: pthread.c,v 1.24 2003/07/18 22:12:30 nathanw Exp $ */ +/* $NetBSD: pthread.c,v 1.25 2003/07/18 22:33:45 nathanw Exp $ */ /*- - * Copyright (c) 2001 The NetBSD Foundation, Inc. + * Copyright (c) 2001,2002,2003 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -37,7 +37,7 @@ */ #include -__RCSID("$NetBSD: pthread.c,v 1.24 2003/07/18 22:12:30 nathanw Exp $"); +__RCSID("$NetBSD: pthread.c,v 1.25 2003/07/18 22:33:45 nathanw Exp $"); #include #include @@ -113,15 +113,6 @@ void *pthread__static_lib_binder[] = { &pthread__nanosleeping }; -/* Private data for pthread_attr_t */ -struct pthread_attr_private { - char ptap_name[PTHREAD_MAX_NAMELEN_NP]; - void *ptap_namearg; - void *ptap_stackaddr; - size_t ptap_stacksize; - size_t ptap_guardsize; -}; - /* * This needs to be started by the library loading code, before main() * gets to run, for various things that use the state of the initial thread @@ -693,353 +684,6 @@ pthread_setname_np(pthread_t thread, const char *name, void *arg) } -static struct pthread_attr_private * -pthread__attr_init_private(pthread_attr_t *attr) -{ - struct pthread_attr_private *p; - - if ((p = attr->pta_private) != NULL) - return p; - - p = malloc(sizeof(*p)); - if (p != NULL) { - memset(p, 0, sizeof(*p)); - attr->pta_private = p; - } - return p; -} - - -int -pthread_attr_init(pthread_attr_t *attr) -{ - - attr->pta_magic = PT_ATTR_MAGIC; - attr->pta_flags = 0; - attr->pta_private = NULL; - - return 0; -} - - -int -pthread_attr_destroy(pthread_attr_t *attr) -{ - struct pthread_attr_private *p; - - if ((p = attr->pta_private) != NULL) - free(p); - - return 0; -} - - -int -pthread_attr_get_np(pthread_t thread, pthread_attr_t *attr) -{ - struct pthread_attr_private *p; - - p = pthread__attr_init_private(attr); - if (p == NULL) - return ENOMEM; - - attr->pta_flags = thread->pt_flags & - (PT_FLAG_DETACHED | PT_FLAG_SCOPE_SYSTEM | PT_FLAG_EXPLICIT_SCHED); - - p->ptap_namearg = thread->pt_name; - p->ptap_stackaddr = thread->pt_stack.ss_sp; - p->ptap_stacksize = thread->pt_stack.ss_size; - p->ptap_guardsize = (size_t)sysconf(_SC_PAGESIZE); - - return 0; -} - - -int -pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate) -{ - - if (attr->pta_flags & PT_FLAG_DETACHED) - *detachstate = PTHREAD_CREATE_DETACHED; - else - *detachstate = PTHREAD_CREATE_JOINABLE; - - return 0; -} - - -int -pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate) -{ - - switch (detachstate) { - case PTHREAD_CREATE_JOINABLE: - attr->pta_flags &= ~PT_FLAG_DETACHED; - break; - case PTHREAD_CREATE_DETACHED: - attr->pta_flags |= PT_FLAG_DETACHED; - break; - default: - return EINVAL; - } - - return 0; -} - - -int -pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guard) -{ - struct pthread_attr_private *p; - - if ((p = attr->pta_private) == NULL) - *guard = (size_t)sysconf(_SC_PAGESIZE); - else - *guard = p->ptap_guardsize; - - return 0; -} - - -int -pthread_attr_setguardsize(pthread_attr_t *attr, size_t guard) -{ - struct pthread_attr_private *p; - - p = pthread__attr_init_private(attr); - if (p == NULL) - return ENOMEM; - - p->ptap_guardsize = guard; - - return 0; -} - - -int -pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit) -{ - - if (attr->pta_flags & PT_FLAG_EXPLICIT_SCHED) - *inherit = PTHREAD_EXPLICIT_SCHED; - else - *inherit = PTHREAD_INHERIT_SCHED; - - return 0; -} - - -int -pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit) -{ - - switch (inherit) { - case PTHREAD_INHERIT_SCHED: - attr->pta_flags &= ~PT_FLAG_EXPLICIT_SCHED; - break; - case PTHREAD_EXPLICIT_SCHED: - attr->pta_flags |= PT_FLAG_EXPLICIT_SCHED; - break; - default: - return EINVAL; - } - - return 0; -} - - -int -pthread_attr_getscope(const pthread_attr_t *attr, int *scope) -{ - - if (attr->pta_flags & PT_FLAG_SCOPE_SYSTEM) - *scope = PTHREAD_SCOPE_SYSTEM; - else - *scope = PTHREAD_SCOPE_PROCESS; - - return 0; -} - - -int -pthread_attr_setscope(pthread_attr_t *attr, int scope) -{ - - switch (scope) { - case PTHREAD_SCOPE_PROCESS: - attr->pta_flags &= ~PT_FLAG_SCOPE_SYSTEM; - break; - case PTHREAD_SCOPE_SYSTEM: - attr->pta_flags |= PT_FLAG_SCOPE_SYSTEM; - break; - default: - return EINVAL; - } - - return 0; -} - - -int -pthread_attr_setschedparam(pthread_attr_t *attr, - const struct sched_param *param) -{ - - if (param == NULL) - return EINVAL; - - if (param->sched_priority != 0) - return EINVAL; - - return 0; -} - - -int -pthread_attr_getschedparam(const pthread_attr_t *attr, - struct sched_param *param) -{ - - if (param == NULL) - return EINVAL; - - param->sched_priority = 0; - - return 0; -} - - -int -pthread_attr_getstack(const pthread_attr_t *attr, void **addr, size_t *size) -{ - struct pthread_attr_private *p; - - if ((p = attr->pta_private) == NULL) { - *addr = NULL; - *size = PT_STACKSIZE; - } else { - *addr = p->ptap_stackaddr; - *size = p->ptap_stacksize; - } - - return 0; -} - - -int -pthread_attr_setstack(pthread_attr_t *attr, void *addr, size_t size) -{ - struct pthread_attr_private *p; - - p = pthread__attr_init_private(attr); - if (p == NULL) - return ENOMEM; - - p->ptap_stackaddr = addr; - p->ptap_stacksize = size; - - return 0; -} - - -int -pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *size) -{ - struct pthread_attr_private *p; - - if ((p = attr->pta_private) == NULL) - *size = PT_STACKSIZE; - else - *size = p->ptap_stacksize; - - return 0; -} - - -int -pthread_attr_setstacksize(pthread_attr_t *attr, size_t size) -{ - struct pthread_attr_private *p; - - p = pthread__attr_init_private(attr); - if (p == NULL) - return ENOMEM; - - p->ptap_stacksize = size; - - return 0; -} - - -int -pthread_attr_getstackaddr(const pthread_attr_t *attr, void **addr) -{ - struct pthread_attr_private *p; - - if ((p = attr->pta_private) == NULL) - *addr = NULL; - else - *addr = p->ptap_stackaddr; - - return 0; -} - - -int -pthread_attr_setstackaddr(pthread_attr_t *attr, void *addr) -{ - struct pthread_attr_private *p; - - p = pthread__attr_init_private(attr); - if (p == NULL) - return ENOMEM; - - p->ptap_stackaddr = addr; - - return 0; -} - - -int -pthread_attr_getname_np(const pthread_attr_t *attr, char *name, size_t len, - void **argp) -{ - struct pthread_attr_private *p; - - if ((p = attr->pta_private) == NULL) { - name[0] = '\0'; - if (argp != NULL) - *argp = NULL; - } else { - strlcpy(name, p->ptap_name, len); - if (argp != NULL) - *argp = p->ptap_namearg; - } - - return 0; -} - - -int -pthread_attr_setname_np(pthread_attr_t *attr, const char *name, void *arg) -{ - struct pthread_attr_private *p; - int namelen; - - p = pthread__attr_init_private(attr); - if (p == NULL) - return ENOMEM; - - namelen = snprintf(p->ptap_name, PTHREAD_MAX_NAMELEN_NP, name, arg); - if (namelen >= PTHREAD_MAX_NAMELEN_NP) { - p->ptap_name[0] = '\0'; - return EINVAL; - } - p->ptap_namearg = arg; - - return 0; -} - /* * XXX There should be a way for applications to use the efficent diff --git a/lib/libpthread/pthread_attr.c b/lib/libpthread/pthread_attr.c new file mode 100644 index 000000000000..62482af00c95 --- /dev/null +++ b/lib/libpthread/pthread_attr.c @@ -0,0 +1,397 @@ +/* $NetBSD: pthread_attr.c,v 1.1 2003/07/18 22:33:46 nathanw Exp $ */ + +/*- + * Copyright (c) 2001,2002,2003 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Nathan J. Williams. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +__RCSID("$NetBSD: pthread_attr.c,v 1.1 2003/07/18 22:33:46 nathanw Exp $"); + +#include +#include +#include +#include +#include + +#include "pthread.h" +#include "pthread_int.h" + + +static struct pthread_attr_private * +pthread__attr_init_private(pthread_attr_t *attr) +{ + struct pthread_attr_private *p; + + if ((p = attr->pta_private) != NULL) + return p; + + p = malloc(sizeof(*p)); + if (p != NULL) { + memset(p, 0, sizeof(*p)); + attr->pta_private = p; + } + return p; +} + + +int +pthread_attr_init(pthread_attr_t *attr) +{ + + attr->pta_magic = PT_ATTR_MAGIC; + attr->pta_flags = 0; + attr->pta_private = NULL; + + return 0; +} + + +int +pthread_attr_destroy(pthread_attr_t *attr) +{ + struct pthread_attr_private *p; + + if ((p = attr->pta_private) != NULL) + free(p); + + return 0; +} + + +int +pthread_attr_get_np(pthread_t thread, pthread_attr_t *attr) +{ + struct pthread_attr_private *p; + + p = pthread__attr_init_private(attr); + if (p == NULL) + return ENOMEM; + + attr->pta_flags = thread->pt_flags & + (PT_FLAG_DETACHED | PT_FLAG_SCOPE_SYSTEM | PT_FLAG_EXPLICIT_SCHED); + + p->ptap_namearg = thread->pt_name; + p->ptap_stackaddr = thread->pt_stack.ss_sp; + p->ptap_stacksize = thread->pt_stack.ss_size; + p->ptap_guardsize = (size_t)sysconf(_SC_PAGESIZE); + + return 0; +} + + +int +pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate) +{ + + if (attr->pta_flags & PT_FLAG_DETACHED) + *detachstate = PTHREAD_CREATE_DETACHED; + else + *detachstate = PTHREAD_CREATE_JOINABLE; + + return 0; +} + + +int +pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate) +{ + + switch (detachstate) { + case PTHREAD_CREATE_JOINABLE: + attr->pta_flags &= ~PT_FLAG_DETACHED; + break; + case PTHREAD_CREATE_DETACHED: + attr->pta_flags |= PT_FLAG_DETACHED; + break; + default: + return EINVAL; + } + + return 0; +} + + +int +pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guard) +{ + struct pthread_attr_private *p; + + if ((p = attr->pta_private) == NULL) + *guard = (size_t)sysconf(_SC_PAGESIZE); + else + *guard = p->ptap_guardsize; + + return 0; +} + + +int +pthread_attr_setguardsize(pthread_attr_t *attr, size_t guard) +{ + struct pthread_attr_private *p; + + p = pthread__attr_init_private(attr); + if (p == NULL) + return ENOMEM; + + p->ptap_guardsize = guard; + + return 0; +} + + +int +pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit) +{ + + if (attr->pta_flags & PT_FLAG_EXPLICIT_SCHED) + *inherit = PTHREAD_EXPLICIT_SCHED; + else + *inherit = PTHREAD_INHERIT_SCHED; + + return 0; +} + + +int +pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit) +{ + + switch (inherit) { + case PTHREAD_INHERIT_SCHED: + attr->pta_flags &= ~PT_FLAG_EXPLICIT_SCHED; + break; + case PTHREAD_EXPLICIT_SCHED: + attr->pta_flags |= PT_FLAG_EXPLICIT_SCHED; + break; + default: + return EINVAL; + } + + return 0; +} + + +int +pthread_attr_getscope(const pthread_attr_t *attr, int *scope) +{ + + if (attr->pta_flags & PT_FLAG_SCOPE_SYSTEM) + *scope = PTHREAD_SCOPE_SYSTEM; + else + *scope = PTHREAD_SCOPE_PROCESS; + + return 0; +} + + +int +pthread_attr_setscope(pthread_attr_t *attr, int scope) +{ + + switch (scope) { + case PTHREAD_SCOPE_PROCESS: + attr->pta_flags &= ~PT_FLAG_SCOPE_SYSTEM; + break; + case PTHREAD_SCOPE_SYSTEM: + attr->pta_flags |= PT_FLAG_SCOPE_SYSTEM; + break; + default: + return EINVAL; + } + + return 0; +} + + +int +pthread_attr_setschedparam(pthread_attr_t *attr, + const struct sched_param *param) +{ + + if (param == NULL) + return EINVAL; + + if (param->sched_priority != 0) + return EINVAL; + + return 0; +} + + +int +pthread_attr_getschedparam(const pthread_attr_t *attr, + struct sched_param *param) +{ + + if (param == NULL) + return EINVAL; + + param->sched_priority = 0; + + return 0; +} + + +int +pthread_attr_getstack(const pthread_attr_t *attr, void **addr, size_t *size) +{ + struct pthread_attr_private *p; + + if ((p = attr->pta_private) == NULL) { + *addr = NULL; + *size = PT_STACKSIZE; + } else { + *addr = p->ptap_stackaddr; + *size = p->ptap_stacksize; + } + + return 0; +} + + +int +pthread_attr_setstack(pthread_attr_t *attr, void *addr, size_t size) +{ + struct pthread_attr_private *p; + + p = pthread__attr_init_private(attr); + if (p == NULL) + return ENOMEM; + + p->ptap_stackaddr = addr; + p->ptap_stacksize = size; + + return 0; +} + + +int +pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *size) +{ + struct pthread_attr_private *p; + + if ((p = attr->pta_private) == NULL) + *size = PT_STACKSIZE; + else + *size = p->ptap_stacksize; + + return 0; +} + + +int +pthread_attr_setstacksize(pthread_attr_t *attr, size_t size) +{ + struct pthread_attr_private *p; + + p = pthread__attr_init_private(attr); + if (p == NULL) + return ENOMEM; + + p->ptap_stacksize = size; + + return 0; +} + + +int +pthread_attr_getstackaddr(const pthread_attr_t *attr, void **addr) +{ + struct pthread_attr_private *p; + + if ((p = attr->pta_private) == NULL) + *addr = NULL; + else + *addr = p->ptap_stackaddr; + + return 0; +} + + +int +pthread_attr_setstackaddr(pthread_attr_t *attr, void *addr) +{ + struct pthread_attr_private *p; + + p = pthread__attr_init_private(attr); + if (p == NULL) + return ENOMEM; + + p->ptap_stackaddr = addr; + + return 0; +} + + +int +pthread_attr_getname_np(const pthread_attr_t *attr, char *name, size_t len, + void **argp) +{ + struct pthread_attr_private *p; + + if ((p = attr->pta_private) == NULL) { + name[0] = '\0'; + if (argp != NULL) + *argp = NULL; + } else { + strlcpy(name, p->ptap_name, len); + if (argp != NULL) + *argp = p->ptap_namearg; + } + + return 0; +} + + +int +pthread_attr_setname_np(pthread_attr_t *attr, const char *name, void *arg) +{ + struct pthread_attr_private *p; + int namelen; + + p = pthread__attr_init_private(attr); + if (p == NULL) + return ENOMEM; + + namelen = snprintf(p->ptap_name, PTHREAD_MAX_NAMELEN_NP, name, arg); + if (namelen >= PTHREAD_MAX_NAMELEN_NP) { + p->ptap_name[0] = '\0'; + return EINVAL; + } + p->ptap_namearg = arg; + + return 0; +} diff --git a/lib/libpthread/pthread_int.h b/lib/libpthread/pthread_int.h index 92d29561a55b..3720af544c59 100644 --- a/lib/libpthread/pthread_int.h +++ b/lib/libpthread/pthread_int.h @@ -1,7 +1,7 @@ -/* $NetBSD: pthread_int.h,v 1.15 2003/07/17 20:52:38 nathanw Exp $ */ +/* $NetBSD: pthread_int.h,v 1.16 2003/07/18 22:33:46 nathanw Exp $ */ /*- - * Copyright (c) 2001 The NetBSD Foundation, Inc. + * Copyright (c) 2001,2002,2003 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -70,6 +70,15 @@ struct pt_alarm_t { int pta_fired; }; +/* Private data for pthread_attr_t */ +struct pthread_attr_private { + char ptap_name[PTHREAD_MAX_NAMELEN_NP]; + void *ptap_namearg; + void *ptap_stackaddr; + size_t ptap_stacksize; + size_t ptap_guardsize; +}; + struct __pthread_st { unsigned int pt_magic; /* Identifier, for debugging and for preventing recycling. */