diff options
author | julian <julian@FreeBSD.org> | 1996-08-20 08:22:01 +0000 |
---|---|---|
committer | julian <julian@FreeBSD.org> | 1996-08-20 08:22:01 +0000 |
commit | 7350d1d3b2ec940c89a2b20f9d09985d9fd9e9d7 (patch) | |
tree | b14348030d1048f8628b798374a8a061a990aae3 /include | |
parent | 60125bd1a9e42a8b02f15396ba886b417c95bbc1 (diff) | |
download | FreeBSD-src-7350d1d3b2ec940c89a2b20f9d09985d9fd9e9d7.zip FreeBSD-src-7350d1d3b2ec940c89a2b20f9d09985d9fd9e9d7.tar.gz |
Submitted by: John Birrell <cimaxp1!jb@werple.net.au>
Here are the diffs for libc_r to get it one step closer to P1003.1c
These make most of the thread/mutex/condvar structures opaque to the
user. There are three functions which have been renamed with _np
suffixes because they are extensions to P1003.1c (I did them for JAVA,
which needs to suspend/resume threads and also start threads suspended).
I've created a new header (pthread_np.h) for the non-POSIX stuff.
The egrep tags stuff in /usr/src/lib/libc_r/Makefile that I uncommented
doesn't work. I think its best to delete it. I don't think libc_r needs
tags anyway, 'cause most of the source is in libc which does have tags.
also:
Here's the first batch of man pages for the thread functions.
The diff to /usr/src/lib/libc_r/Makefile removes some stuff that was
inherited from /usr/src/lib/libc/Makefile that should only be done with
libc.
also:
I should have sent this diff with the pthread(3) man page.
It allows people to type
make -DWANT_LIBC_R world
to get libc_r built with the rest of the world. I put this in the
pthread(3) man page. The default is still not to build libc_r.
also:
The diff attached adds a pthread(3) man page to /usr/src/share/man/man3.
The idea is that without libc_r installed, this man page will give people
enough info to know that they have to build libc_r.
Diffstat (limited to 'include')
-rw-r--r-- | include/Makefile | 10 | ||||
-rw-r--r-- | include/pthread.h | 327 | ||||
-rw-r--r-- | include/pthread_np.h | 47 |
3 files changed, 193 insertions, 191 deletions
diff --git a/include/Makefile b/include/Makefile index a1582c6..7f2a99b 100644 --- a/include/Makefile +++ b/include/Makefile @@ -1,5 +1,5 @@ # From: @(#)Makefile 8.2 (Berkeley) 1/4/94 -# $Id: Makefile,v 1.38 1996/07/09 15:48:20 ache Exp $ +# $Id: Makefile,v 1.39 1996/08/04 22:34:23 wosch Exp $ # # Doing a make install builds /usr/include # @@ -13,10 +13,10 @@ SUBDIR= rpcsvc FILES= a.out.h ar.h assert.h bitstring.h ctype.h db.h dirent.h disktab.h \ err.h f2c.h fnmatch.h fstab.h fts.h glob.h grp.h strhash.h histedit.h \ kvm.h limits.h link.h locale.h malloc.h memory.h mpool.h ndbm.h \ - netdb.h nl_types.h nlist.h paths.h pthread.h pwd.h ranlib.h regex.h \ - regexp.h resolv.h rune.h runetype.h setjmp.h sgtty.h signal.h \ - stab.h stddef.h stdio.h stdlib.h string.h strings.h struct.h \ - sysexits.h tar.h time.h timers.h ttyent.h unistd.h utime.h \ + netdb.h nl_types.h nlist.h paths.h pthread.h pthread_np.h pwd.h \ + ranlib.h regex.h regexp.h resolv.h rune.h runetype.h setjmp.h sgtty.h \ + signal.h stab.h stddef.h stdio.h stdlib.h string.h strings.h \ + struct.h sysexits.h tar.h time.h timers.h ttyent.h unistd.h utime.h \ utmp.h vis.h .if defined(WANT_CSRG_LIBM) FILES+= math.h diff --git a/include/pthread.h b/include/pthread.h index 5665609..cbaeb3e 100644 --- a/include/pthread.h +++ b/include/pthread.h @@ -40,141 +40,77 @@ #include <sys/cdefs.h> #include <sys/types.h> #include <sys/time.h> +#include <sys/signal.h> +#include <limits.h> /* - * Forward thread structure definition. This is opaque to the user. + * Run-time invariant values: */ -struct pthread; - -/* - * Queue definitions. - */ -struct pthread_queue { - struct pthread *q_next; - struct pthread *q_last; - void *q_data; -}; - -/* - * Static queue initialization values. - */ -#define PTHREAD_QUEUE_INITIALIZER { NULL, NULL, NULL } - -/* - * Mutex definitions. - */ -enum pthread_mutextype { - MUTEX_TYPE_FAST = 1, - MUTEX_TYPE_COUNTING_FAST = 2, /* Recursive */ - MUTEX_TYPE_MAX -}; - -union pthread_mutex_data { - void *m_ptr; - int m_count; -}; - -struct pthread_mutex { - enum pthread_mutextype m_type; - struct pthread_queue m_queue; - struct pthread *m_owner; - union pthread_mutex_data m_data; - long m_flags; -}; - -/* - * Flags for mutexes. - */ -#define MUTEX_FLAGS_PRIVATE 0x01 -#define MUTEX_FLAGS_INITED 0x02 -#define MUTEX_FLAGS_BUSY 0x04 - -/* - * Static mutex initialization values. - */ -#define PTHREAD_MUTEX_INITIALIZER \ - { MUTEX_TYPE_FAST, PTHREAD_QUEUE_INITIALIZER, \ - NULL, { NULL }, MUTEX_FLAGS_INITED } - -struct pthread_mutex_attr { - enum pthread_mutextype m_type; - long m_flags; -}; - -/* - * Condition variable definitions. - */ -enum pthread_cond_type { - COND_TYPE_FAST, - COND_TYPE_MAX -}; - -struct pthread_cond { - enum pthread_cond_type c_type; - struct pthread_queue c_queue; - void *c_data; - long c_flags; -}; - -struct pthread_cond_attr { - enum pthread_cond_type c_type; - long c_flags; -}; +#define PTHREAD_DESTRUCTOR_ITERATIONS 4 +#define PTHREAD_KEYS_MAX 256 +#define PTHREAD_STACK_MIN 1024 +#define PTHREAD_THREADS_MAX ULONG_MAX /* - * Flags for condition variables. + * Compile time symbolic constants for portability specifications: + * + * Note that those commented out are not currently supported by the + * implementation. */ -#define COND_FLAGS_PRIVATE 0x01 -#define COND_FLAGS_INITED 0x02 -#define COND_FLAGS_BUSY 0x04 +#define _POSIX_THREADS +#define _POSIX_THREAD_ATTR_STACKADDR +#define _POSIX_THREAD_ATTR_STACKSIZE +#define _POSIX_THREAD_PRIORITY_SCHEDULING +/* #define _POSIX_THREAD_PRIO_INHERIT */ +/* #define _POSIX_THREAD_PRIO_PROTECT */ +/* #define _POSIX_THREAD_PROCESS_SHARED */ +#define _POSIX_THREAD_SAFE_FUNCTIONS /* - * Static cond initialization values. + * Forward structure definitions. + * + * These are mostly opaque to the user. */ -#define PTHREAD_COND_INITIALIZER \ - { COND_TYPE_FAST, PTHREAD_QUEUE_INITIALIZER, NULL, COND_FLAGS_INITED } +struct pthread; +struct pthread_attr; +struct pthread_cond; +struct pthread_cond_attr; +struct pthread_mutex; +struct pthread_mutex_attr; +struct pthread_once; +struct sched_param; /* - * Cleanup definitions. + * Primitive system data type definitions required by P1003.1c. + * + * Note that P1003.1c specifies that there are no defined comparison + * or assignment operators for the types pthread_attr_t, pthread_cond_t, + * pthread_condattr_t, pthread_mutex_t, pthread_mutexattr_t. */ -struct pthread_cleanup { - struct pthread_cleanup *next; - void (*routine) (); - void *routine_arg; -}; +typedef struct pthread *pthread_t; +typedef struct pthread_attr *pthread_attr_t; +typedef struct pthread_mutex *pthread_mutex_t; +typedef struct pthread_mutex_attr *pthread_mutexattr_t; +typedef struct pthread_cond *pthread_cond_t; +typedef struct pthread_cond_attr *pthread_condattr_t; +typedef int pthread_key_t; +typedef struct pthread_once pthread_once_t; /* - * Scheduling definitions. + * Additional type definitions: + * + * Note that P1003.1c reserves the prefixes pthread_ and PTHREAD_ for + * use in header symbols. */ -enum schedparam_policy { - SCHED_RR, - SCHED_IO, - SCHED_FIFO, - SCHED_OTHER -}; - -struct pthread_attr { - enum schedparam_policy schedparam_policy; - int prio; - int suspend; - int flags; - void *arg_attr; - void (*cleanup_attr) (); - void *stackaddr_attr; - size_t stacksize_attr; -}; - -struct sched_param { - int prio; - void *no_data; -}; +typedef void *pthread_addr_t; +typedef void *(*pthread_startroutine_t) (void *); /* * Once definitions. */ struct pthread_once { - int state; - struct pthread_mutex mutex; + int state; + pthread_mutex_t mutex; }; /* @@ -186,21 +122,7 @@ struct pthread_once { /* * Static once initialization values. */ -#define PTHREAD_ONCE_INIT { PTHREAD_NEEDS_INIT, PTHREAD_MUTEX_INITIALIZER } - -/* - * Type definitions. - */ -typedef int pthread_key_t; -typedef struct pthread *pthread_t; -typedef struct pthread_attr pthread_attr_t; -typedef struct pthread_cond pthread_cond_t; -typedef struct pthread_cond_attr pthread_condattr_t; -typedef struct pthread_mutex pthread_mutex_t; -typedef struct pthread_mutex_attr pthread_mutexattr_t; -typedef struct pthread_once pthread_once_t; -typedef void *pthread_addr_t; -typedef void *(*pthread_startroutine_t) (void *); +#define PTHREAD_ONCE_INIT { PTHREAD_NEEDS_INIT, NULL } /* * Default attribute arguments. @@ -215,62 +137,95 @@ typedef void *(*pthread_startroutine_t) (void *); * Thread function prototype definitions: */ __BEGIN_DECLS -int pthread_create __P((pthread_t *, const pthread_attr_t *, - void *(*start_routine) (void *), void *)); -void pthread_exit __P((void *)); -pthread_t pthread_self __P((void)); -int pthread_equal __P((pthread_t, pthread_t)); -int pthread_getprio __P((pthread_t)); -int pthread_setprio __P((pthread_t, int)); -int pthread_join __P((pthread_t, void **)); -int pthread_detach __P((pthread_t *)); -int pthread_resume __P((pthread_t)); -int pthread_suspend __P((pthread_t)); -void pthread_yield __P((void)); -int pthread_setschedparam __P((pthread_t pthread, int policy, - struct sched_param * param)); -int pthread_getschedparam __P((pthread_t pthread, int *policy, - struct sched_param * param)); -int pthread_kill __P((struct pthread *, int)); -int pthread_cleanup_push __P((void (*routine) (void *), void *routine_arg)); -void pthread_cleanup_pop __P((int execute)); -int pthread_cond_init __P((pthread_cond_t *, const pthread_condattr_t *)); -int pthread_cond_timedwait __P((pthread_cond_t *, pthread_mutex_t *, - const struct timespec * abstime)); -int pthread_cond_wait __P((pthread_cond_t *, pthread_mutex_t *)); -int pthread_cond_signal __P((pthread_cond_t *)); -int pthread_cond_broadcast __P((pthread_cond_t *)); -int pthread_cond_destroy __P((pthread_cond_t *)); -int pthread_mutex_init __P((pthread_mutex_t *, const pthread_mutexattr_t *)); -int pthread_mutex_lock __P((pthread_mutex_t *)); -int pthread_mutex_unlock __P((pthread_mutex_t *)); -int pthread_mutex_trylock __P((pthread_mutex_t *)); -int pthread_mutex_destroy __P((pthread_mutex_t *)); -int pthread_attr_init __P((pthread_attr_t *)); -int pthread_attr_destroy __P((pthread_attr_t *)); -int pthread_attr_setstacksize __P((pthread_attr_t *, size_t)); -int pthread_attr_getstacksize __P((pthread_attr_t *, size_t *)); -int pthread_attr_setstackaddr __P((pthread_attr_t *, void *)); -int pthread_attr_getstackaddr __P((pthread_attr_t *, void **)); -int pthread_attr_setdetachstate __P((pthread_attr_t *, int)); -int pthread_attr_getdetachstate __P((pthread_attr_t *, int *)); -int pthread_attr_setscope __P((pthread_attr_t *, int)); -int pthread_attr_getscope __P((pthread_attr_t *, int *)); -int pthread_attr_setinheritsched __P((pthread_attr_t *, int)); -int pthread_attr_getinheritsched __P((pthread_attr_t *, int *)); -int pthread_attr_setschedpolicy __P((pthread_attr_t *, int)); -int pthread_attr_getschedpolicy __P((pthread_attr_t *, int *)); -int pthread_attr_setschedparam __P((pthread_attr_t *, struct sched_param *)); -int pthread_attr_getschedparam __P((pthread_attr_t *, struct sched_param *)); -int pthread_attr_setfloatstate __P((pthread_attr_t *, int)); -int pthread_attr_getfloatstate __P((pthread_attr_t *, int *)); -int pthread_attr_setcleanup __P((pthread_attr_t *, void (*routine) (void *), void *)); -int pthread_attr_setcreatesuspend __P((pthread_attr_t *)); -int pthread_once __P((pthread_once_t *, void (*init_routine) (void))); -int pthread_keycreate __P((pthread_key_t *, void (*routine) (void *))); -int pthread_setspecific __P((pthread_key_t, const void *)); -int pthread_getspecific __P((pthread_key_t, void **)); -int pthread_key_delete __P((pthread_key_t)); +int pthread_attr_destroy __P((pthread_attr_t *)); +int pthread_attr_getinheritsched __P((pthread_attr_t *, int *)); +int pthread_attr_getschedparam __P((pthread_attr_t *, + struct sched_param *)); +int pthread_attr_getschedpolicy __P((pthread_attr_t *, int *)); +int pthread_attr_getscope __P((pthread_attr_t *, int *)); +int pthread_attr_getstacksize __P((pthread_attr_t *, size_t *)); +int pthread_attr_getstackaddr __P((pthread_attr_t *, void **)); +int pthread_attr_getdetachstate __P((pthread_attr_t *, int *)); +int pthread_attr_init __P((pthread_attr_t *)); +int pthread_attr_setinheritsched __P((pthread_attr_t *, int)); +int pthread_attr_setschedparam __P((pthread_attr_t *, + struct sched_param *)); +int pthread_attr_setschedpolicy __P((pthread_attr_t *, int)); +int pthread_attr_setscope __P((pthread_attr_t *, int)); +int pthread_attr_setstacksize __P((pthread_attr_t *, size_t)); +int pthread_attr_setstackaddr __P((pthread_attr_t *, void *)); +int pthread_attr_setdetachstate __P((pthread_attr_t *, int)); +void pthread_cleanup_pop __P((int execute)); +int pthread_cleanup_push __P((void (*routine) (void *), + void *routine_arg)); +int pthread_condattr_destroy __P((pthread_condattr_t *attr)); +int pthread_condattr_init __P((pthread_condattr_t *attr)); +int pthread_condattr_getpshared __P((pthread_condattr_t *attr, + int *pshared)); +int pthread_condattr_setpshared __P((pthread_condattr_t *attr, + int pshared)); +int pthread_cond_broadcast __P((pthread_cond_t *)); +int pthread_cond_destroy __P((pthread_cond_t *)); +int pthread_cond_init __P((pthread_cond_t *, + const pthread_condattr_t *)); +int pthread_cond_signal __P((pthread_cond_t *)); +int pthread_cond_timedwait __P((pthread_cond_t *, + pthread_mutex_t *, const struct timespec * abstime)); +int pthread_cond_wait __P((pthread_cond_t *, pthread_mutex_t *)); +int pthread_create __P((pthread_t *, const pthread_attr_t *, + void *(*start_routine) (void *), void *)); +int pthread_detach __P((pthread_t *)); +int pthread_equal __P((pthread_t, pthread_t)); +void pthread_exit __P((void *)); +int pthread_getspecific __P((pthread_key_t, void **)); +int pthread_join __P((pthread_t, void **)); +int pthread_key_create __P((pthread_key_t *, + void (*routine) (void *))); +int pthread_key_delete __P((pthread_key_t)); +int pthread_kill __P((struct pthread *, int)); +int pthread_mutexattr_destroy __P((pthread_mutexattr_t *)); +int pthread_mutexattr_getprioceiling __P((pthread_mutexattr_t *, + int *prioceiling)); +int pthread_mutexattr_getprotocol __P((pthread_mutexattr_t *, + int *protocol)); +int pthread_mutexattr_getpshared __P((pthread_mutexattr_t *, + int *pshared)); +int pthread_mutexattr_init __P((pthread_mutexattr_t *)); +int pthread_mutexattr_setprioceiling __P((pthread_mutexattr_t *, + int prioceiling)); +int pthread_mutexattr_setprotocol __P((pthread_mutexattr_t *, + int protocol)); +int pthread_mutexattr_setpshared __P((pthread_mutexattr_t *, + int pshared)); +int pthread_mutex_destroy __P((pthread_mutex_t *)); +int pthread_mutex_getprioceiling __P((pthread_mutex_t *)); +int pthread_mutex_init __P((pthread_mutex_t *, + const pthread_mutexattr_t *)); +int pthread_mutex_lock __P((pthread_mutex_t *)); +int pthread_mutex_setprioceiling __P((pthread_mutex_t *)); +int pthread_mutex_trylock __P((pthread_mutex_t *)); +int pthread_mutex_unlock __P((pthread_mutex_t *)); +int pthread_once __P((pthread_once_t *, + void (*init_routine) (void))); +pthread_t pthread_self __P((void)); +int pthread_setcancelstate __P((int, int *)); +int pthread_setcanceltype __P((int, int *)); +int pthread_setspecific __P((pthread_key_t, const void *)); +int pthread_sigmask __P((int, const sigset_t *, sigset_t *)); +int pthread_testcancel __P((void)); + + +int pthread_getprio __P((pthread_t)); +int pthread_setprio __P((pthread_t, int)); +void pthread_yield __P((void)); +int pthread_setschedparam __P((pthread_t pthread, int policy, + struct sched_param * param)); +int pthread_getschedparam __P((pthread_t pthread, int *policy, + struct sched_param * param)); +int pthread_attr_setfloatstate __P((pthread_attr_t *, int)); +int pthread_attr_getfloatstate __P((pthread_attr_t *, int *)); +int pthread_attr_setcleanup __P((pthread_attr_t *, + void (*routine) (void *), void *)); __END_DECLS #endif diff --git a/include/pthread_np.h b/include/pthread_np.h new file mode 100644 index 0000000..80e6a85 --- /dev/null +++ b/include/pthread_np.h @@ -0,0 +1,47 @@ +/* + * Copyright (c) 1996 John Birrell <jb@cimlogic.com.au>. + * All rights reserved. + * + * 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 John Birrell. + * 4. Neither the name of the author nor the names of any co-contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL 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 REGENTS 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. + * + */ +#ifndef _PTHREAD_NP_H_ +#define _PTHREAD_NP_H_ + +/* + * Non-POSIX thread function prototype definitions: + */ +__BEGIN_DECLS +int pthread_attr_setcreatesuspend_np __P((pthread_attr_t *)); +int pthread_multi_np __P((void)); +int pthread_resume_np __P((pthread_t)); +int pthread_single_np __P((void)); +int pthread_suspend_np __P((pthread_t)); +__END_DECLS + +#endif |