From 270d9d472952a8923fa8a6d9d830fea77f4b838f Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 28 Dec 2002 10:24:40 +0000 Subject: Update. * inet/herrno.c (__h_errno_location): Remove. * inet/Makefile (routines): Add herrno-loc. * resolv/res_libc.c (__res_state): Remove. * resolv/Makefile (routines): Add res-state. * sysdeps/generic/herrno-loc.c: New file. * sysdeps/generic/res-state.c: New file. 2002-12-27 Jakub Jelinek --- ChangeLog | 9 ++++++ inet/Makefile | 2 +- inet/herrno.c | 8 ----- linuxthreads/ChangeLog | 43 ++++++++++++++++++++++++++ linuxthreads/Makefile | 2 +- linuxthreads/Versions | 2 +- linuxthreads/alloca_cutoff.c | 35 +++++++++++++++++++++ linuxthreads/descr.h | 10 +++++- linuxthreads/internals.h | 30 ++++++++++++++++++ linuxthreads/libc-cancellation.c | 30 +++--------------- linuxthreads/no-tsd.c | 46 ---------------------------- linuxthreads/pt-system.c | 5 +-- linuxthreads/pthread.c | 5 +++ linuxthreads/specific.c | 24 ++++----------- linuxthreads/sysdeps/pthread/bits/libc-tsd.h | 40 +++++++++--------------- linuxthreads/sysdeps/pthread/errno-loc.c | 44 ++++++++++++++++++++++++++ linuxthreads/sysdeps/pthread/herrno-loc.c | 41 +++++++++++++++++++++++++ linuxthreads/sysdeps/pthread/res-state.c | 43 ++++++++++++++++++++++++++ linuxthreads/tst-cancel-wrappers.sh | 5 ++- nptl/ChangeLog | 6 ++++ nptl/pt-system.c | 8 +---- nptl/tst-cancel-wrappers.sh | 3 +- resolv/Makefile | 2 +- resolv/res_libc.c | 11 ------- sysdeps/generic/herrno-loc.c | 33 ++++++++++++++++++++ sysdeps/generic/res-state.c | 35 +++++++++++++++++++++ 26 files changed, 371 insertions(+), 151 deletions(-) create mode 100644 linuxthreads/alloca_cutoff.c delete mode 100644 linuxthreads/no-tsd.c create mode 100644 linuxthreads/sysdeps/pthread/errno-loc.c create mode 100644 linuxthreads/sysdeps/pthread/herrno-loc.c create mode 100644 linuxthreads/sysdeps/pthread/res-state.c create mode 100644 sysdeps/generic/herrno-loc.c create mode 100644 sysdeps/generic/res-state.c diff --git a/ChangeLog b/ChangeLog index a8babd4de6..82577f6e4e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2002-12-27 Jakub Jelinek + + * inet/herrno.c (__h_errno_location): Remove. + * inet/Makefile (routines): Add herrno-loc. + * resolv/res_libc.c (__res_state): Remove. + * resolv/Makefile (routines): Add res-state. + * sysdeps/generic/herrno-loc.c: New file. + * sysdeps/generic/res-state.c: New file. + 2002-12-27 Jakub Jelinek * sysdeps/unix/sysv/linux/i386/sysdep.h (I386_USE_SYSENTER): diff --git a/inet/Makefile b/inet/Makefile index be588d78b0..3706d9811e 100644 --- a/inet/Makefile +++ b/inet/Makefile @@ -30,7 +30,7 @@ distribute := netgroup.h routines := htonl htons \ inet_lnaof inet_mkadr \ - inet_netof inet_ntoa inet_net herrno \ + inet_netof inet_ntoa inet_net herrno herrno-loc \ gethstbyad gethstbyad_r gethstbynm gethstbynm2 gethstbynm2_r \ gethstbynm_r gethstent gethstent_r \ getnetbyad getnetbyad_r getnetbynm getnetent getnetent_r \ diff --git a/inet/herrno.c b/inet/herrno.c index b85d75be53..bd23eb7a8e 100644 --- a/inet/herrno.c +++ b/inet/herrno.c @@ -42,11 +42,3 @@ compat_symbol (libc, h_errno, h_errno, GLIBC_2_0); compat_symbol (libc, _h_errno, _h_errno, GLIBC_2_0); # endif #endif - -/* When threaded, h_errno may be a per-thread variable. */ -int * -weak_const_function -__h_errno_location (void) -{ - return &h_errno; -} diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 7dccb8c79a..3c50230de0 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,5 +1,48 @@ 2002-12-27 Jakub Jelinek + * sysdeps/pthread/bits/libc-tsd.h: Include linuxthreads/descr.h + and bits/libc-lock.h. + (__libc_internal_tsd_get, __libc_internal_tsd_set, + __libc_internal_tsd_address): Remove. + (__pthread_internal_tsd_address, __pthread_internal_tsd_get, + __pthread_internal_tsd_set): New weak_externs. + (__libc_tsd_address, __libc_tsd_get, __libc_tsd_set): Define + using __libc_maybe_call2. + (__libc_tsd_key_t): Move to ... + * descr.h (__libc_tsd_key_t): ...here. + Remove bits/libc-tsd.h include. + * sysdeps/pthread/errno-loc.c: New file. + * sysdeps/pthread/herrno-loc.c: New file. + * sysdeps/pthread/res-state.c: New file. + * libc-cancellation.c (THREAD_GETMEM, THREAD_SETMEM): Remove. + (__libc_enable_asynccancel, __libc_disable_asynccancel): Use + thread_self unconditionally. Use LIBC_THREAD_[SG]ETMEM instead + of THREAD_[SG]ETMEM. + * specific.c (libc_internal_tsd_set): Renamed to... + __pthread_internal_tsd_set. Remove static. + (libc_internal_tsd_get): Renamed to... + __pthread_internal_tsd_get. Remove static. + (libc_internal_tsd_address): Renamed to... + __pthread_internal_tsd_address. Remove static. + (__libc_internal_tsd_set, __libc_internal_tsd_get, + __libc_internal_tsd_address, __libc_alloca_cutoff): Remove. + * internals.h [!NOT_IN_libc] (LIBC_THREAD_GETMEM, LIBC_THREAD_SETMEM): + Define. + (__pthread_internal_tsd_set, __pthread_internal_tsd_get, + __pthread_internal_tsd_address): New prototypes. + (struct pthread_functions): Add + ptr_pthread_internal_tsd_([sg]et|address) fields. + [!NOT_IN_libc && !FLOATING_STACKS] (thread_self): Define. + * pthread.c (pthread_functions) [!USE_TLS && !HAVE___THREAD]: + Initialize ptr_pthread_internal_tsd_([sg]et|address) fields. + * Versions (libpthread): Remove __libc_alloca_cutoff@GLIBC_PRIVATE. + * alloca_cutoff.c: New file. + * no-tsd.c: Removed. + * Makefile (routines): Remove no-tsd. Add alloca_cutoff. + * pt-system.c (system): Remove cancellation handling. + * tst-cancel-wrappers.sh: Allow pt-system.o* to not use the + cancellation routines. + * sysdeps/i386/tls.h: Include dl-sysdep.h and stdint.h. (tcbhead_t): Add sysinfo field. (SYSINFO_OFFSET, INIT_SYSINFO): Define. diff --git a/linuxthreads/Makefile b/linuxthreads/Makefile index 6425108389..a86aae7d53 100644 --- a/linuxthreads/Makefile +++ b/linuxthreads/Makefile @@ -28,7 +28,7 @@ headers := pthread.h semaphore.h distribute := internals.h queue.h restart.h spinlock.h smp.h tst-signal.sh \ tst-cancel-wrappers.sh libc-tsd.c -routines := forward no-tsd libc-cancellation libc_pthread_init +routines := forward alloca_cutoff libc-cancellation libc_pthread_init shared-only-routines = forward extra-libs := libpthread diff --git a/linuxthreads/Versions b/linuxthreads/Versions index fea2e368d8..bf7fda222c 100644 --- a/linuxthreads/Versions +++ b/linuxthreads/Versions @@ -161,7 +161,7 @@ libpthread { GLIBC_PRIVATE { # Internal libc interface to libpthread __libc_internal_tsd_get; __libc_internal_tsd_set; - __libc_internal_tsd_address; __libc_alloca_cutoff; + __libc_internal_tsd_address; __pthread_kill_other_threads_np; } } diff --git a/linuxthreads/alloca_cutoff.c b/linuxthreads/alloca_cutoff.c new file mode 100644 index 0000000000..ac5ec3a194 --- /dev/null +++ b/linuxthreads/alloca_cutoff.c @@ -0,0 +1,35 @@ +/* Determine whether block of given size can be allocated on the stack or not. + Copyright (C) 2002 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 + modify it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include + +int +__libc_alloca_cutoff (size_t size) +{ + if (! SINGLE_THREAD_P) + { + pthread_descr self = thread_self (); + return size <= LIBC_THREAD_GETMEM (self, p_alloca_cutoff); + } + + return size <= __MAX_ALLOCA_CUTOFF; +} diff --git a/linuxthreads/descr.h b/linuxthreads/descr.h index 74ef25e1f4..d266ffb126 100644 --- a/linuxthreads/descr.h +++ b/linuxthreads/descr.h @@ -23,8 +23,16 @@ #include #include #include -#include /* for _LIBC_TSD_KEY_N */ +/* Fast thread-specific data internal to libc. */ +enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0, + _LIBC_TSD_KEY_DL_ERROR, + _LIBC_TSD_KEY_RPC_VARS, + _LIBC_TSD_KEY_LOCALE, + _LIBC_TSD_KEY_CTYPE_B, + _LIBC_TSD_KEY_CTYPE_TOLOWER, + _LIBC_TSD_KEY_CTYPE_TOUPPER, + _LIBC_TSD_KEY_N }; /* The type of thread descriptors */ typedef struct _pthread_descr_struct *pthread_descr; diff --git a/linuxthreads/internals.h b/linuxthreads/internals.h index 3e10304c2f..68ad6c72d5 100644 --- a/linuxthreads/internals.h +++ b/linuxthreads/internals.h @@ -43,6 +43,17 @@ # define THREAD_SETMEM_NC(descr, member, value) descr->member = (value) #endif +#ifndef NOT_IN_libc +# ifdef FLOATING_STACKS +# define LIBC_THREAD_GETMEM(descr, member) THREAD_GETMEM (descr, member) +# define LIBC_THREAD_SETMEM(descr, member, value) \ + THREAD_SETMEM (descr, member, value) +# else +# define LIBC_THREAD_GETMEM(descr, member) descr->member +# define LIBC_THREAD_SETMEM(descr, member, value) descr->member = (value) +# endif +#endif + typedef void (*destr_function)(void *); struct pthread_key_struct { @@ -430,6 +441,11 @@ extern void __linuxthreads_reap_event (void); /* This function is called to initialize the pthread library. */ extern void __pthread_initialize (void); +/* TSD. */ +extern int __pthread_internal_tsd_set (int key, const void * pointer); +extern void * __pthread_internal_tsd_get (int key); +extern void ** __attribute__ ((__const__)) + __pthread_internal_tsd_address (int key); /* Sighandler wrappers. */ extern void __pthread_sighandler(int signo, SIGCONTEXT ctx); @@ -504,10 +520,24 @@ struct pthread_functions int (*ptr_pthread_setcanceltype) (int, int *); void (*ptr_pthread_do_exit) (void *retval, char *currentframe); pthread_descr (*ptr_pthread_thread_self) (void); + int (*ptr_pthread_internal_tsd_set) (int key, const void * pointer); + void * (*ptr_pthread_internal_tsd_get) (int key); + void ** __attribute__ ((__const__)) + (*ptr_pthread_internal_tsd_address) (int key); }; /* Variable in libc.so. */ extern struct pthread_functions __libc_pthread_functions attribute_hidden; extern int * __libc_pthread_init (const struct pthread_functions *functions); +#if !defined NOT_IN_libc && !defined FLOATING_STACKS +# ifdef SHARED +# define thread_self() \ + (*__libc_pthread_functions.ptr_pthread_thread_self) () +# else +weak_extern (__pthread_thread_self) +# define thread_self() __pthread_thread_self () +# endif +#endif + #endif /* internals.h */ diff --git a/linuxthreads/libc-cancellation.c b/linuxthreads/libc-cancellation.c index 01972a2557..18feddbf3a 100644 --- a/linuxthreads/libc-cancellation.c +++ b/linuxthreads/libc-cancellation.c @@ -34,13 +34,6 @@ weak_extern (__pthread_thread_self) int __libc_multiple_threads attribute_hidden; -# ifndef FLOATING_STACKS -# undef THREAD_GETMEM -# undef THREAD_SETMEM -# define THREAD_GETMEM(descr, member) descr->member -# define THREAD_SETMEM(descr, member, value) descr->member = (value) -# endif - /* The next two functions are similar to pthread_setcanceltype() but more specialized for the use in the cancelable functions like write(). They do not need to check parameters etc. */ @@ -48,18 +41,11 @@ int attribute_hidden __libc_enable_asynccancel (void) { -#ifdef FLOATING_STACKS pthread_descr self = thread_self(); -#else - pthread_descr self = __libc_maybe_call2 (pthread_thread_self, (), NULL); - - if (self == NULL) - return PTHREAD_CANCEL_DEFERRED; -#endif - int oldtype = THREAD_GETMEM(self, p_canceltype); - THREAD_SETMEM(self, p_canceltype, PTHREAD_CANCEL_ASYNCHRONOUS); - if (__builtin_expect (THREAD_GETMEM(self, p_canceled), 0) && - THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) + int oldtype = LIBC_THREAD_GETMEM(self, p_canceltype); + LIBC_THREAD_SETMEM(self, p_canceltype, PTHREAD_CANCEL_ASYNCHRONOUS); + if (__builtin_expect (LIBC_THREAD_GETMEM(self, p_canceled), 0) && + LIBC_THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) __libc_maybe_call2 (pthread_do_exit, (PTHREAD_CANCELED, CURRENT_STACK_FRAME), 0); return oldtype; @@ -69,14 +55,8 @@ void internal_function attribute_hidden __libc_disable_asynccancel (int oldtype) { -#ifdef FLOATING_STACKS pthread_descr self = thread_self(); -#else - pthread_descr self = __libc_maybe_call2 (pthread_thread_self, (), NULL); - - if (self != NULL) -#endif - THREAD_SETMEM(self, p_canceltype, oldtype); + LIBC_THREAD_SETMEM(self, p_canceltype, oldtype); } #endif diff --git a/linuxthreads/no-tsd.c b/linuxthreads/no-tsd.c deleted file mode 100644 index c1cc3adc0f..0000000000 --- a/linuxthreads/no-tsd.c +++ /dev/null @@ -1,46 +0,0 @@ -/* libc-internal interface for thread-specific data. - Copyright (C) 1998,99,2002 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 - modify it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include /* for __const */ -#include -#include - -#if !(USE_TLS && HAVE___THREAD) - -/* This file provides uinitialized (common) definitions for the - hooks used internally by libc to access thread-specific data. - - When -lpthread is used, it provides initialized definitions for these - variables (in specific.c), which override these uninitialized definitions. - - If -lpthread is not used, these uninitialized variables default to zero, - which the __libc_tsd_* macros check for. */ - -void *(*__libc_internal_tsd_get) (enum __libc_tsd_key_t); -int (*__libc_internal_tsd_set) (enum __libc_tsd_key_t, - __const void *); -void **(*__libc_internal_tsd_address) (enum __libc_tsd_key_t) - __THROW __attribute__ ((__const__)); - -#endif /* !(USE_TLS && HAVE___THREAD) */ - -int __libc_alloca_cutoff (size_t size) -{ - return size <= __MAX_ALLOCA_CUTOFF; -} diff --git a/linuxthreads/pt-system.c b/linuxthreads/pt-system.c index bc5098adc0..3a5f46c4f8 100644 --- a/linuxthreads/pt-system.c +++ b/linuxthreads/pt-system.c @@ -25,8 +25,5 @@ int system (const char *line) { - int oldtype = LIBC_CANCEL_ASYNC (); - int result = __libc_system (line); - LIBC_CANCEL_RESET (oldtype); - return result; + return __libc_system (line); } diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c index b194fcacea..6bd9de9081 100644 --- a/linuxthreads/pthread.c +++ b/linuxthreads/pthread.c @@ -233,6 +233,11 @@ extern void __libc_setup_tls (size_t tcbsize, size_t tcbalign); #ifdef SHARED static struct pthread_functions pthread_functions = { +#if !(USE_TLS && HAVE___THREAD) + .ptr_pthread_internal_tsd_set = __pthread_internal_tsd_set, + .ptr_pthread_internal_tsd_get = __pthread_internal_tsd_get, + .ptr_pthread_internal_tsd_address = __pthread_internal_tsd_address, +#endif .ptr_pthread_attr_destroy = __pthread_attr_destroy, #if SHLIB_COMPAT(libpthread, GLIBC_2_0, GLIBC_2_1) .ptr_pthread_attr_init_2_0 = __pthread_attr_init_2_0, diff --git a/linuxthreads/specific.c b/linuxthreads/specific.c index 17e62e82b7..0956ed1983 100644 --- a/linuxthreads/specific.c +++ b/linuxthreads/specific.c @@ -208,40 +208,28 @@ void __pthread_destroy_specifics() /* Thread-specific data for libc. */ -static int -libc_internal_tsd_set(enum __libc_tsd_key_t key, const void * pointer) +int +__pthread_internal_tsd_set (int key, const void * pointer) { pthread_descr self = thread_self(); THREAD_SETMEM_NC(self, p_libc_specific[key], (void *) pointer); return 0; } -int (*__libc_internal_tsd_set)(enum __libc_tsd_key_t key, const void * pointer) - = libc_internal_tsd_set; -static void * -libc_internal_tsd_get(enum __libc_tsd_key_t key) +void * +__pthread_internal_tsd_get (int key) { pthread_descr self = thread_self(); return THREAD_GETMEM_NC(self, p_libc_specific[key]); } -void * (*__libc_internal_tsd_get)(enum __libc_tsd_key_t key) - = libc_internal_tsd_get; -static void ** __attribute__ ((__const__)) -libc_internal_tsd_address (enum __libc_tsd_key_t key) +void ** __attribute__ ((__const__)) +__pthread_internal_tsd_address (int key) { pthread_descr self = thread_self(); return &self->p_libc_specific[key]; } -void **(*const __libc_internal_tsd_address) (enum __libc_tsd_key_t key) - __THROW __attribute__ ((__const__)) = libc_internal_tsd_address; #endif - -int __libc_alloca_cutoff (size_t size) -{ - pthread_descr self = thread_self(); - return size <= THREAD_GETMEM_NC(self, p_alloca_cutoff); -} diff --git a/linuxthreads/sysdeps/pthread/bits/libc-tsd.h b/linuxthreads/sysdeps/pthread/bits/libc-tsd.h index e37faf6ba4..04cf7c1a6c 100644 --- a/linuxthreads/sysdeps/pthread/bits/libc-tsd.h +++ b/linuxthreads/sysdeps/pthread/bits/libc-tsd.h @@ -20,16 +20,7 @@ #ifndef _BITS_LIBC_TSD_H #define _BITS_LIBC_TSD_H 1 -/* Fast thread-specific data internal to libc. */ -enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0, - _LIBC_TSD_KEY_DL_ERROR, - _LIBC_TSD_KEY_RPC_VARS, - _LIBC_TSD_KEY_LOCALE, - _LIBC_TSD_KEY_CTYPE_B, - _LIBC_TSD_KEY_CTYPE_TOLOWER, - _LIBC_TSD_KEY_CTYPE_TOUPPER, - _LIBC_TSD_KEY_N }; - +#include #include #if USE_TLS && HAVE___THREAD @@ -39,26 +30,25 @@ enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0, #else -extern void *(*__libc_internal_tsd_get) (enum __libc_tsd_key_t) __THROW; -extern int (*__libc_internal_tsd_set) (enum __libc_tsd_key_t, - __const void *) __THROW; -extern void **(*const __libc_internal_tsd_address) (enum __libc_tsd_key_t) - __THROW __attribute__ ((__const__)); +# include -#define __libc_tsd_address(KEY) \ - (__libc_internal_tsd_address != NULL \ - ? __libc_internal_tsd_address (_LIBC_TSD_KEY_##KEY) \ - : &__libc_tsd_##KEY##_data) +# ifndef SHARED +weak_extern (__pthread_internal_tsd_address) +weak_extern (__pthread_internal_tsd_get) +weak_extern (__pthread_internal_tsd_set) +# endif #define __libc_tsd_define(CLASS, KEY) CLASS void *__libc_tsd_##KEY##_data; +#define __libc_tsd_address(KEY) \ + __libc_maybe_call2 (pthread_internal_tsd_address, \ + (_LIBC_TSD_KEY_##KEY), &__libc_tsd_##KEY##_data) #define __libc_tsd_get(KEY) \ - (__libc_internal_tsd_get != NULL \ - ? __libc_internal_tsd_get (_LIBC_TSD_KEY_##KEY) \ - : __libc_tsd_##KEY##_data) + __libc_maybe_call2 (pthread_internal_tsd_get, \ + (_LIBC_TSD_KEY_##KEY), __libc_tsd_##KEY##_data) #define __libc_tsd_set(KEY, VALUE) \ - (__libc_internal_tsd_set != NULL \ - ? __libc_internal_tsd_set (_LIBC_TSD_KEY_##KEY, (VALUE)) \ - : ((__libc_tsd_##KEY##_data = (VALUE)), 0)) + __libc_maybe_call2 (pthread_internal_tsd_set, \ + (_LIBC_TSD_KEY_##KEY, (VALUE)), \ + (__libc_tsd_##KEY##_data = (VALUE), 0)) #endif diff --git a/linuxthreads/sysdeps/pthread/errno-loc.c b/linuxthreads/sysdeps/pthread/errno-loc.c new file mode 100644 index 0000000000..e79a7cf814 --- /dev/null +++ b/linuxthreads/sysdeps/pthread/errno-loc.c @@ -0,0 +1,44 @@ +/* MT support function to get address of `errno' variable, linuxthreads + version. + Copyright (C) 1996, 1998, 2002 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include + +#if ! USE___THREAD +#undef errno +extern int errno; +#endif + +int * +#if ! USE___THREAD +weak_const_function +#endif +__errno_location (void) +{ +#if ! USE___THREAD && !defined NOT_IN_libc + if (! SINGLE_THREAD_P) + { + pthread_descr self = thread_self(); + return LIBC_THREAD_GETMEM (self, p_errnop); + } +#endif + return &errno; +} diff --git a/linuxthreads/sysdeps/pthread/herrno-loc.c b/linuxthreads/sysdeps/pthread/herrno-loc.c new file mode 100644 index 0000000000..ead9a16065 --- /dev/null +++ b/linuxthreads/sysdeps/pthread/herrno-loc.c @@ -0,0 +1,41 @@ +/* Copyright (C) 1996, 97, 98, 2002 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include + +#if ! USE___THREAD +# undef h_errno +extern int h_errno; +#endif + +/* When threaded, h_errno may be a per-thread variable. */ +int * +weak_const_function +__h_errno_location (void) +{ +#if ! USE___THREAD + if (! SINGLE_THREAD_P) + { + pthread_descr self = thread_self(); + return LIBC_THREAD_GETMEM (self, p_h_errnop); + } +#endif + return &h_errno; +} diff --git a/linuxthreads/sysdeps/pthread/res-state.c b/linuxthreads/sysdeps/pthread/res-state.c new file mode 100644 index 0000000000..90fe41c80b --- /dev/null +++ b/linuxthreads/sysdeps/pthread/res-state.c @@ -0,0 +1,43 @@ +/* Copyright (C) 1996, 97, 98, 2002 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include +#include + +#if ! USE___THREAD +# undef _res +extern struct __res_state _res; +#endif + +/* When threaded, _res may be a per-thread variable. */ +struct __res_state * +#if ! USE___THREAD +weak_const_function +#endif +__res_state (void) +{ +#if ! USE___THREAD + if (! SINGLE_THREAD_P) + { + pthread_descr self = thread_self(); + return LIBC_THREAD_GETMEM (self, p_resp); + } +#endif + return &_res; +} diff --git a/linuxthreads/tst-cancel-wrappers.sh b/linuxthreads/tst-cancel-wrappers.sh index 14c42dfb8b..364b4729dc 100644 --- a/linuxthreads/tst-cancel-wrappers.sh +++ b/linuxthreads/tst-cancel-wrappers.sh @@ -69,7 +69,10 @@ C["__xpg_sigpause"]=1 { # signals.c in linuxthreads does the cancellation checks not using # *_{enable,disable}_asynccancel. - if ((!seen_enable || !seen_disable) && !(object ~ /^signals.o/)) + # Similarly pt-system.o* is allowed to call __libc_system directly. + if ((!seen_enable || !seen_disable) + && !(object ~ /^signals.o/) + && !(object ~ /^pt-system.o/)) { printf "in '$1'(%s) %s'\''s cancellation missing\n", object, seen ret = 1 diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 3288bcc7cf..24c2fb64fb 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,9 @@ +2002-12-27 Jakub Jelinek + + * pt-system.c (system): Remove cancellation handling. + * tst-cancel-wrappers.sh: Allow pt-system.o* to not use the + cancellation routines. + 2002-12-28 Ulrich Drepper * descr.h: Include . diff --git a/nptl/pt-system.c b/nptl/pt-system.c index e98f04c413..f638a6ae32 100644 --- a/nptl/pt-system.c +++ b/nptl/pt-system.c @@ -26,11 +26,5 @@ int system (const char *line) { - int oldtype = CANCEL_ASYNC (); - - int result = __libc_system (line); - - CANCEL_RESET (oldtype); - - return result; + return __libc_system (line); } diff --git a/nptl/tst-cancel-wrappers.sh b/nptl/tst-cancel-wrappers.sh index 39ded2e743..54c5e0f23a 100644 --- a/nptl/tst-cancel-wrappers.sh +++ b/nptl/tst-cancel-wrappers.sh @@ -67,7 +67,8 @@ C["__xpg_sigpause"]=1 /:$/ { if (seen) { - if (!seen_enable || !seen_disable) + # pt-system.o* in NPTL calls __libc_system directly. + if ((!seen_enable || !seen_disable) && !(object ~ /^pt-system.o/)) { printf "in '$1'(%s) %s'\''s cancellation missing\n", object, seen ret = 1 diff --git a/resolv/Makefile b/resolv/Makefile index f79100bd5a..c3b66052de 100644 --- a/resolv/Makefile +++ b/resolv/Makefile @@ -29,7 +29,7 @@ distribute := ../conf/portability.h mapv4v6addr.h mapv4v6hostent.h \ Banner res_hconf.h res_debug.h README gai_misc.h ga_test.c routines := herror inet_addr inet_ntop inet_pton nsap_addr res_init \ - res_hconf res_libc + res_hconf res_libc res-state tests = tst-aton diff --git a/resolv/res_libc.c b/resolv/res_libc.c index 7c4fd7a119..4f67a31785 100644 --- a/resolv/res_libc.c +++ b/resolv/res_libc.c @@ -41,17 +41,6 @@ struct __res_state _res; compat_symbol (libc, _res, _res, GLIBC_2_0); # endif #endif - -/* This function is used to access the resolver state in - single-threaded programs. */ -struct __res_state * -#if ! USE___THREAD -weak_const_function -#endif -__res_state (void) -{ - return &_res; -} /* The following bit is copied from res_data.c (where it is #ifdef'ed diff --git a/sysdeps/generic/herrno-loc.c b/sysdeps/generic/herrno-loc.c new file mode 100644 index 0000000000..deb1676dbc --- /dev/null +++ b/sysdeps/generic/herrno-loc.c @@ -0,0 +1,33 @@ +/* Copyright (C) 1996, 97, 98, 2002 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include + +#if ! USE___THREAD +# undef h_errno +extern int h_errno; +#endif + +/* When threaded, h_errno may be a per-thread variable. */ +int * +weak_const_function +__h_errno_location (void) +{ + return &h_errno; +} diff --git a/sysdeps/generic/res-state.c b/sysdeps/generic/res-state.c new file mode 100644 index 0000000000..ec9951e82f --- /dev/null +++ b/sysdeps/generic/res-state.c @@ -0,0 +1,35 @@ +/* Copyright (C) 1996, 97, 98, 2002 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include +#include + +#if ! USE___THREAD +# undef _res +extern struct __res_state _res; +#endif + +/* When threaded, _res may be a per-thread variable. */ +struct __res_state * +#if ! USE___THREAD +weak_const_function +#endif +__res_state (void) +{ + return &_res; +} -- cgit v1.2.3