summary refs log tree commit diff
path: root/linuxthreads
diff options
context:
space:
mode:
Diffstat (limited to 'linuxthreads')
-rw-r--r--linuxthreads/attr.c5
-rw-r--r--linuxthreads/internals.h1
-rw-r--r--linuxthreads/manager.c3
-rw-r--r--linuxthreads/ptfork.c1
-rw-r--r--linuxthreads/pthread.c1
-rw-r--r--linuxthreads/semaphore.c1
-rw-r--r--linuxthreads/specific.c1
-rw-r--r--linuxthreads/spinlock.c1
-rw-r--r--linuxthreads/sysdeps/pthread/bits/pthreadtypes.h119
-rw-r--r--linuxthreads/sysdeps/pthread/pthread.h116
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. */