aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--elf/soinit.c8
-rw-r--r--linuxthreads/ChangeLog9
-rw-r--r--linuxthreads/Versions3
-rw-r--r--linuxthreads/pthread.c25
-rw-r--r--linuxthreads/sysdeps/i386/i686/pt-machine.h3
-rw-r--r--linuxthreads_db/ChangeLog7
-rw-r--r--sysdeps/i386/i486/atomicity.h8
8 files changed, 58 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index e5c2bb47d4..b068b8f65e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2000-04-27 Ulrich Drepper <drepper@redhat.com>
+
+ * elf/soinit.c (__libc_global_ctors): Call __pthread_initialize_minimal
+ if this function is available.
+
+ * sysdeps/i386/i486/atomicity.h (exchange_and_add): Use uint32_t for
+ all values.
+
2000-04-27 Jakub Jelinek <jakub@redhat.com>
* nss/getXXbyYY_r.c: Fix a typo in __old_getxxbyyy_r versioning.
@@ -44,7 +52,7 @@
2000-04-27 Andreas Jaeger <aj@suse.de>
* intl/libintl.h: Fix typo, reported by Bruno Haible
- <clisp.cons.org>.
+ <haible@clisp.cons.org>.
2000-04-25 Ulrich Drepper <drepper@redhat.com>
diff --git a/elf/soinit.c b/elf/soinit.c
index 1dee73c3be..7db054e4d4 100644
--- a/elf/soinit.c
+++ b/elf/soinit.c
@@ -40,6 +40,9 @@ extern void __deregister_frame (const void *);
# endif
#endif
+/* We have to initialize the thread library at least if bit. */
+extern void __pthread_initialize_minimal (void) __attribute__ ((weak));
+
/* This function will be called from _init in init-first.c. */
void
__libc_global_ctors (void)
@@ -48,6 +51,11 @@ __libc_global_ctors (void)
run_hooks (__CTOR_LIST__);
#ifdef HAVE_DWARF2_UNWIND_INFO
# ifdef HAVE_DWARF2_UNWIND_INFO_STATIC
+ /* Initialize the thread library at least a bit since the libgcc functions
+ are using thread functions if these are available. */
+ if (__pthread_initialize_minimal)
+ __pthread_initialize_minimal ();
+
{
static struct object ob;
__register_frame_info (__EH_FRAME_BEGIN__, &ob);
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog
index 8161323b4d..ccc38ebd71 100644
--- a/linuxthreads/ChangeLog
+++ b/linuxthreads/ChangeLog
@@ -1,3 +1,12 @@
+2000-04-27 Ulrich Drepper <drepper@redhat.com>
+
+ * Versions [libpthread] (GLIBC_2.2): Add __pthread_initialize_minimal.
+ * pthread.c (__pthread_initialize_minimal): New function. Perform
+ minimal initialization.
+ (pthread_initialize): Remove this code here.
+ * sysdeps/i386/i686/pt-machine.h: Include "../useldt.h" again. We
+ are working around the problem in glibc.
+
2000-04-25 Ulrich Drepper <drepper@redhat.com>
* sysdeps/i386/i686/pt-machine.h: Do not use "../useldt.h" for
diff --git a/linuxthreads/Versions b/linuxthreads/Versions
index e8f7f4e30c..327e62ea0c 100644
--- a/linuxthreads/Versions
+++ b/linuxthreads/Versions
@@ -138,5 +138,8 @@ libpthread {
# Extensions.
pthread_yield;
+
+ # New internal function.
+ __pthread_initialize_minimal;
}
}
diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c
index 737042002a..a78e0c92de 100644
--- a/linuxthreads/pthread.c
+++ b/linuxthreads/pthread.c
@@ -310,6 +310,23 @@ static void pthread_initialize(void) __attribute__((constructor));
extern void *__dso_handle __attribute__ ((weak));
+
+/* Do some minimal initialization which has to be done during the
+ startup of the C library. */
+void
+__pthread_initialize_minimal(void)
+{
+ /* The errno/h_errno variable of the main thread are the global ones. */
+ __pthread_initial_thread.p_errnop = &_errno;
+ __pthread_initial_thread.p_h_errnop = &_h_errno;
+ /* If we have special thread_self processing, initialize that for the
+ main thread now. */
+#ifdef INIT_THREAD_SELF
+ INIT_THREAD_SELF(&__pthread_initial_thread, 0);
+#endif
+}
+
+
static void pthread_initialize(void)
{
struct sigaction sa;
@@ -330,14 +347,6 @@ static void pthread_initialize(void)
(char *)(((long)CURRENT_STACK_FRAME - 2 * STACK_SIZE) & ~(STACK_SIZE - 1));
/* Update the descriptor for the initial thread. */
__pthread_initial_thread.p_pid = __getpid();
- /* If we have special thread_self processing, initialize that for the
- main thread now. */
-#ifdef INIT_THREAD_SELF
- INIT_THREAD_SELF(&__pthread_initial_thread, 0);
-#endif
- /* The errno/h_errno variable of the main thread are the global ones. */
- __pthread_initial_thread.p_errnop = &_errno;
- __pthread_initial_thread.p_h_errnop = &_h_errno;
/* Play with the stack size limit to make sure that no stack ever grows
beyond STACK_SIZE minus one page (to act as a guard page). */
getrlimit(RLIMIT_STACK, &limit);
diff --git a/linuxthreads/sysdeps/i386/i686/pt-machine.h b/linuxthreads/sysdeps/i386/i686/pt-machine.h
index 4e7832b66a..68e7871a62 100644
--- a/linuxthreads/sysdeps/i386/i686/pt-machine.h
+++ b/linuxthreads/sysdeps/i386/i686/pt-machine.h
@@ -63,5 +63,4 @@ __compare_and_swap (long int *p, long int oldval, long int newval)
}
-/* Use the LDT implementation only if the kernel is fixed. */
-//#include "../useldt.h"
+#include "../useldt.h"
diff --git a/linuxthreads_db/ChangeLog b/linuxthreads_db/ChangeLog
index 9d0286a531..3fc5b6ebd9 100644
--- a/linuxthreads_db/ChangeLog
+++ b/linuxthreads_db/ChangeLog
@@ -1,3 +1,10 @@
+2000-04-24 Mark Kettenis <kettenis@gnu.org>
+
+ * td_thr_get_info.c (td_thr_get_info): Set ti_state to
+ TD_THR_ACTIVE instead of TD_THR_RUN. If the thread is no longer
+ running but is still joinable, set it to TD_THR_ZOMBIE. Otherwise
+ set it to TD_THR_UNKNOWN.
+
2000-02-25 Andreas Jaeger <aj@suse.de>
* td_ta_thr_iter.c: Include <alloca.h> for prototype declaration.
diff --git a/sysdeps/i386/i486/atomicity.h b/sysdeps/i386/i486/atomicity.h
index da4137abe1..b30363d707 100644
--- a/sysdeps/i386/i486/atomicity.h
+++ b/sysdeps/i386/i486/atomicity.h
@@ -1,5 +1,5 @@
/* Low-level functions for atomic operations. ix86 version, x >= 4.
- Copyright (C) 1997 Free Software Foundation, Inc.
+ Copyright (C) 1997, 2000 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -23,11 +23,11 @@
#include <inttypes.h>
-static inline int
+static inline uint32_t
__attribute__ ((unused))
-exchange_and_add (volatile uint32_t *mem, int val)
+exchange_and_add (volatile uint32_t *mem, uint32_t val)
{
- register int result;
+ register uint32_t result;
__asm__ __volatile__ ("lock; xaddl %0,%2"
: "=r" (result) : "0" (val), "m" (*mem) : "memory");
return result;