From 3300816c38721bcddbbeb92de7fe44b90454bce6 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 27 Apr 2000 20:18:02 +0000 Subject: Update. 2000-04-27 Ulrich Drepper * 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. . --- ChangeLog | 10 +++++++++- elf/soinit.c | 8 ++++++++ linuxthreads/ChangeLog | 9 +++++++++ linuxthreads/Versions | 3 +++ linuxthreads/pthread.c | 25 +++++++++++++++++-------- linuxthreads/sysdeps/i386/i686/pt-machine.h | 3 +-- linuxthreads_db/ChangeLog | 7 +++++++ sysdeps/i386/i486/atomicity.h | 8 ++++---- 8 files changed, 58 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index e5c2bb4..b068b8f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2000-04-27 Ulrich Drepper + + * 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 * nss/getXXbyYY_r.c: Fix a typo in __old_getxxbyyy_r versioning. @@ -44,7 +52,7 @@ 2000-04-27 Andreas Jaeger * intl/libintl.h: Fix typo, reported by Bruno Haible - . + . 2000-04-25 Ulrich Drepper diff --git a/elf/soinit.c b/elf/soinit.c index 1dee73c..7db054e 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 8161323..ccc38eb 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,12 @@ +2000-04-27 Ulrich Drepper + + * 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 * sysdeps/i386/i686/pt-machine.h: Do not use "../useldt.h" for diff --git a/linuxthreads/Versions b/linuxthreads/Versions index e8f7f4e..327e62e 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 7370420..a78e0c9 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 4e7832b..68e7871 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 9d0286a..3fc5b6e 100644 --- a/linuxthreads_db/ChangeLog +++ b/linuxthreads_db/ChangeLog @@ -1,3 +1,10 @@ +2000-04-24 Mark Kettenis + + * 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 * td_ta_thr_iter.c: Include for prototype declaration. diff --git a/sysdeps/i386/i486/atomicity.h b/sysdeps/i386/i486/atomicity.h index da4137a..b30363d 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 -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; -- cgit v1.1