diff options
Diffstat (limited to 'linuxthreads')
-rw-r--r-- | linuxthreads/attr.c | 5 | ||||
-rw-r--r-- | linuxthreads/internals.h | 1 | ||||
-rw-r--r-- | linuxthreads/manager.c | 3 | ||||
-rw-r--r-- | linuxthreads/ptfork.c | 1 | ||||
-rw-r--r-- | linuxthreads/pthread.c | 1 | ||||
-rw-r--r-- | linuxthreads/semaphore.c | 1 | ||||
-rw-r--r-- | linuxthreads/specific.c | 1 | ||||
-rw-r--r-- | linuxthreads/spinlock.c | 1 | ||||
-rw-r--r-- | linuxthreads/sysdeps/pthread/bits/pthreadtypes.h | 119 | ||||
-rw-r--r-- | linuxthreads/sysdeps/pthread/pthread.h | 116 |
10 files changed, 145 insertions, 104 deletions
diff --git a/linuxthreads/attr.c b/linuxthreads/attr.c index d1f605810f..cdd27d6012 100644 --- a/linuxthreads/attr.c +++ b/linuxthreads/attr.c @@ -14,6 +14,7 @@ /* Handling of thread attributes */ +#include <errno.h> #include <unistd.h> #include <sys/param.h> #include "pthread.h" @@ -79,14 +80,14 @@ int pthread_attr_setschedparam(pthread_attr_t *attr, if (param->sched_priority < min_prio || param->sched_priority > max_prio) return EINVAL; - attr->schedparam = *param; + memcpy (&attr->schedparam, param, sizeof (struct sched_param)); return 0; } int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param) { - *param = attr->schedparam; + memcpy (param, &attr->schedparam, sizeof (struct sched_param)); return 0; } diff --git a/linuxthreads/internals.h b/linuxthreads/internals.h index 9d6f2fadcf..d68adeb987 100644 --- a/linuxthreads/internals.h +++ b/linuxthreads/internals.h @@ -17,6 +17,7 @@ /* Includes */ #include <bits/libc-lock.h> /* for _LIBC_TSD_KEY_N */ +#include <limits.h> #include <setjmp.h> #include <signal.h> #include <unistd.h> diff --git a/linuxthreads/manager.c b/linuxthreads/manager.c index e69abac009..7d48489f76 100644 --- a/linuxthreads/manager.c +++ b/linuxthreads/manager.c @@ -303,7 +303,8 @@ static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr, switch(attr->inheritsched) { case PTHREAD_EXPLICIT_SCHED: new_thread->p_start_args.schedpolicy = attr->schedpolicy; - new_thread->p_start_args.schedparam = attr->schedparam; + memcpy (&new_thread->p_start_args.schedparam, &attr->schedparam, + sizeof (struct sched_param)); break; case PTHREAD_INHERIT_SCHED: /* schedpolicy doesn't need to be set, only get priority */ diff --git a/linuxthreads/ptfork.c b/linuxthreads/ptfork.c index 8a7b7972a3..32b1d26d92 100644 --- a/linuxthreads/ptfork.c +++ b/linuxthreads/ptfork.c @@ -14,6 +14,7 @@ /* The "atfork" stuff */ +#include <errno.h> #include <stddef.h> #include <stdlib.h> #include <unistd.h> diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c index 4e8a9f1dd7..a7511f7eee 100644 --- a/linuxthreads/pthread.c +++ b/linuxthreads/pthread.c @@ -14,6 +14,7 @@ /* Thread creation, initialization, and basic low-level routines */ +#include <errno.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h> diff --git a/linuxthreads/semaphore.c b/linuxthreads/semaphore.c index 7ca609f6b2..6f79dc0138 100644 --- a/linuxthreads/semaphore.c +++ b/linuxthreads/semaphore.c @@ -14,6 +14,7 @@ /* Semaphores a la POSIX 1003.1b */ +#include <errno.h> #include "pthread.h" #include "semaphore.h" #include "internals.h" diff --git a/linuxthreads/specific.c b/linuxthreads/specific.c index 71f1ede541..12990f454c 100644 --- a/linuxthreads/specific.c +++ b/linuxthreads/specific.c @@ -14,6 +14,7 @@ /* Thread-specific data */ +#include <errno.h> #include <stddef.h> #include <stdlib.h> #include "pthread.h" diff --git a/linuxthreads/spinlock.c b/linuxthreads/spinlock.c index df30c35e6c..2546e2a6e0 100644 --- a/linuxthreads/spinlock.c +++ b/linuxthreads/spinlock.c @@ -14,6 +14,7 @@ /* Internal locks */ +#include <errno.h> #include <sched.h> #include <time.h> #include "pthread.h" diff --git a/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h b/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h new file mode 100644 index 0000000000..20b0bed311 --- /dev/null +++ b/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h @@ -0,0 +1,119 @@ +/* Linuxthreads - a simple clone()-based implementation of Posix */ +/* threads for Linux. */ +/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ +/* */ +/* This program is free software; you can redistribute it and/or */ +/* modify it under the terms of the GNU Library General Public License */ +/* as published by the Free Software Foundation; either version 2 */ +/* of the License, or (at your option) any later version. */ +/* */ +/* This program is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU Library General Public License for more details. */ + +#if !defined _BITS_TYPES_H && !defined _PTHREAD_H +# error "Never include <bits/pthreadtypes.h> directly; use <sys/types.h> instead." +#endif + +#ifndef _BITS_PTHREADTYPES_H +#define _BITS_PTHREADTYPES_H 1 + +#define __need_schedparam +#include <bits/sched.h> + +/* Fast locks (not abstract because mutexes and conditions aren't abstract). */ +struct _pthread_fastlock +{ + long int status; /* "Free" or "taken" or head of waiting list */ + int spinlock; /* For compare-and-swap emulation */ +}; + +/* Thread descriptors */ +typedef struct _pthread_descr_struct *_pthread_descr; + + +/* Attributes for threads. */ +typedef struct +{ + int detachstate; + int schedpolicy; + struct __sched_param schedparam; + int inheritsched; + int scope; + size_t guardsize; + int stackaddr_set; + void *stackaddr; + size_t stacksize; +} pthread_attr_t; + + +/* Conditions (not abstract because of PTHREAD_COND_INITIALIZER */ +typedef struct +{ + struct _pthread_fastlock c_lock; /* Protect against concurrent access */ + _pthread_descr c_waiting; /* Threads waiting on this condition */ +} pthread_cond_t; + + +/* Attribute for conditionally variables. */ +typedef struct +{ + int dummy; +} pthread_condattr_t; + +/* Keys for thread-specific data */ +typedef unsigned int pthread_key_t; + + +/* Mutexes (not abstract because of PTHREAD_MUTEX_INITIALIZER). */ +/* (The layout is unnatural to maintain binary compatibility + with earlier releases of LinuxThreads.) */ +typedef struct +{ + int m_reserved; /* Reserved for future use */ + int m_count; /* Depth of recursive locking */ + _pthread_descr m_owner; /* Owner thread (if recursive or errcheck) */ + int m_kind; /* Mutex kind: fast, recursive or errcheck */ + struct _pthread_fastlock m_lock; /* Underlying fast lock */ +} pthread_mutex_t; + + +/* Attribute for mutex. */ +typedef struct +{ + int mutexkind; +} pthread_mutexattr_t; + + +/* Once-only execution */ +typedef int pthread_once_t; + + +#ifdef __USE_UNIX98 +/* Read-write locks. */ +typedef struct +{ + struct _pthread_fastlock rw_lock; /* Lock to guarantee mutual exclusion */ + int rw_readers; /* Number of readers */ + _pthread_descr rw_writer; /* Identity of writer, or NULL if none */ + _pthread_descr rw_read_waiting; /* Threads waiting for reading */ + _pthread_descr rw_write_waiting; /* Threads waiting for writing */ + int rw_kind; /* Reader/Writer preference selection */ + int rw_pshared; /* Shared between processes or not */ +} pthread_rwlock_t; + + +/* Attribute for read-write locks. */ +typedef struct +{ + int lockkind; + int pshared; +} pthread_rwlockattr_t; +#endif + + +/* Thread identifiers */ +typedef unsigned long int pthread_t; + +#endif /* bits/pthreadtypes.h */ diff --git a/linuxthreads/sysdeps/pthread/pthread.h b/linuxthreads/sysdeps/pthread/pthread.h index 7e98123f43..1d402e6329 100644 --- a/linuxthreads/sysdeps/pthread/pthread.h +++ b/linuxthreads/sysdeps/pthread/pthread.h @@ -17,85 +17,34 @@ #include <features.h> -#include <errno.h> -#include <limits.h> #include <sched.h> -#include <unistd.h> +#include <time.h> #define __need_sigset_t #include <signal.h> -#define __need_timespec -#include <time.h> - -/* Linux has no ENOTSUP error code. */ -#ifndef ENOTSUP -#define ENOTSUP EOPNOTSUPP -#endif +#include <bits/pthreadtypes.h> __BEGIN_DECLS -/*** Types ***/ - -/* Thread identifiers */ -typedef unsigned long int pthread_t; - -/* Thread descriptors */ -typedef struct _pthread_descr_struct *_pthread_descr; - -/* Fast locks (not abstract because mutexes and conditions aren't abstract). */ -struct _pthread_fastlock -{ - long int status; /* "Free" or "taken" or head of waiting list */ - int spinlock; /* For compare-and-swap emulation */ -}; - -/* Mutexes (not abstract because of PTHREAD_MUTEX_INITIALIZER). */ -/* (The layout is unnatural to maintain binary compatibility - with earlier releases of LinuxThreads.) */ - -typedef struct -{ - int m_reserved; /* Reserved for future use */ - int m_count; /* Depth of recursive locking */ - _pthread_descr m_owner; /* Owner thread (if recursive or errcheck) */ - int m_kind; /* Mutex kind: fast, recursive or errcheck */ - struct _pthread_fastlock m_lock; /* Underlying fast lock */ -} pthread_mutex_t; +/* Initializers. */ #define PTHREAD_MUTEX_INITIALIZER \ {0, 0, 0, PTHREAD_MUTEX_FAST_NP, {0, 0}} -#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \ +#ifdef __USE_GNU +# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \ {0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, {0, 0}} - -/* Conditions (not abstract because of PTHREAD_COND_INITIALIZER */ -typedef struct -{ - struct _pthread_fastlock c_lock; /* Protect against concurrent access */ - _pthread_descr c_waiting; /* Threads waiting on this condition */ -} pthread_cond_t; +#endif #define PTHREAD_COND_INITIALIZER {{0, 0}, 0} #ifdef __USE_UNIX98 -/* Read-write locks. */ -typedef struct -{ - struct _pthread_fastlock rw_lock; /* Lock to guarantee mutual exclusion */ - int rw_readers; /* Number of readers */ - _pthread_descr rw_writer; /* Identity of writer, or NULL if none */ - _pthread_descr rw_read_waiting; /* Threads waiting for reading */ - _pthread_descr rw_write_waiting; /* Threads waiting for writing */ - int rw_kind; /* Reader/Writer preference selection */ - int rw_pshared; /* Shared between processes or not */ -} pthread_rwlock_t; - # define PTHREAD_RWLOCK_INITIALIZER \ { {0, 0}, 0, NULL, NULL, NULL, \ PTHREAD_RWLOCK_DEFAULT_NP, PTHREAD_PROCESS_PRIVATE } #endif -/* Attributes */ +/* Values for attributes. */ enum { @@ -121,19 +70,6 @@ enum #define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_PROCESS }; -typedef struct -{ - int detachstate; - int schedpolicy; - struct sched_param schedparam; - int inheritsched; - int scope; - size_t guardsize; - int stackaddr_set; - void *stackaddr; - size_t stacksize; -} pthread_attr_t; - enum { PTHREAD_MUTEX_FAST_NP, @@ -148,46 +84,22 @@ enum #endif }; -typedef struct -{ - int mutexkind; -} pthread_mutexattr_t; - -typedef struct -{ - int dummy; -} pthread_condattr_t; - -#ifdef __USE_UNIX98 enum { PTHREAD_PROCESS_PRIVATE, -# define PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE +#define PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_SHARED -# define PTHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED +#define PTHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED }; +#ifdef __USE_UNIX98 enum { PTHREAD_RWLOCK_PREFER_READER_NP, PTHREAD_RWLOCK_PREFER_WRITER_NP, PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_WRITER_NP }; - -typedef struct -{ - int lockkind; - int pshared; -} pthread_rwlockattr_t; -#endif - -/* Keys for thread-specific data */ - -typedef unsigned int pthread_key_t; - -/* Once-only execution */ - -typedef int pthread_once_t; +#endif /* Unix98 */ #define PTHREAD_ONCE_INIT 0 @@ -592,7 +504,8 @@ extern void _pthread_cleanup_pop __P ((struct _pthread_cleanup_buffer *__buffer, /* Install a cleanup handler as pthread_cleanup_push does, but also saves the current cancellation type and set it to deferred cancellation. */ -#define pthread_cleanup_push_defer_np(routine,arg) \ +#ifdef __USE_GNU +# define pthread_cleanup_push_defer_np(routine,arg) \ { struct _pthread_cleanup_buffer _buffer; \ _pthread_cleanup_push_defer (&_buffer, (routine), (arg)); @@ -604,11 +517,12 @@ extern void _pthread_cleanup_push_defer __P ((struct _pthread_cleanup_buffer *__ restores the cancellation type that was in effect when the matching pthread_cleanup_push_defer was called. */ -#define pthread_cleanup_pop_restore_np(execute) \ +# define pthread_cleanup_pop_restore_np(execute) \ _pthread_cleanup_pop_restore (&_buffer, (execute)); } extern void _pthread_cleanup_pop_restore __P ((struct _pthread_cleanup_buffer *__buffer, int __execute)); +#endif /* Functions for handling signals. */ |