From e8783fd53d5d673eab4500d2cac82601f2f802e0 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Sat, 22 Feb 2003 00:55:36 +0000 Subject: * malloc/Versions (GLIBC_PRIVATE): Add __libc_thread_freeres. * malloc/thread-freeres.c: New file. * malloc/Makefile (aux): Add it. * sunrpc/Versions (GLIBC_PRIVATE): Removed. * sunrpc/rpc_thread.c (__rpc_thread_destroy): Put in special section "__libc_thread_freeres_fn" and add to __libc_thread_subfreeres set. * sysdeps/unix/sysv/linux/i386/geteuid.c (__geteuid): Typo fix. * sysdeps/unix/sysv/linux/i386/getgid.c (__getgid): Typo fix. 2003-02-21 Roland McGrath * sysdeps/mach/hurd/opendir.c (__opendir): Use O_NONBLOCK in open. * iconvdata/Makefile (tests): Add bug-iconv3 only if [$(have-thread-library) = yes]. --- ChangeLog | 19 +++++++++++++++++++ iconvdata/Makefile | 5 ++++- linuxthreads/ChangeLog | 5 +++++ linuxthreads/cancel.c | 10 ++-------- malloc/Makefile | 4 ++-- malloc/Versions | 3 +++ malloc/thread-freeres.c | 30 ++++++++++++++++++++++++++++++ sunrpc/Versions | 4 ---- sunrpc/rpc_thread.c | 3 ++- sysdeps/mach/hurd/opendir.c | 13 +++++++++---- 10 files changed, 76 insertions(+), 20 deletions(-) create mode 100644 malloc/thread-freeres.c diff --git a/ChangeLog b/ChangeLog index 0614f0e0ae..a10cc32201 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2003-02-21 Roland McGrath + + * malloc/Versions (GLIBC_PRIVATE): Add __libc_thread_freeres. + * malloc/thread-freeres.c: New file. + * malloc/Makefile (aux): Add it. + * sunrpc/Versions (GLIBC_PRIVATE): Removed. + * sunrpc/rpc_thread.c (__rpc_thread_destroy): Put in special section + "__libc_thread_freeres_fn" and add to __libc_thread_subfreeres set. + + * sysdeps/unix/sysv/linux/i386/geteuid.c (__geteuid): Typo fix. + * sysdeps/unix/sysv/linux/i386/getgid.c (__getgid): Typo fix. + +2003-02-21 Roland McGrath + + * sysdeps/mach/hurd/opendir.c (__opendir): Use O_NONBLOCK in open. + + * iconvdata/Makefile (tests): Add bug-iconv3 only if + [$(have-thread-library) = yes]. + 2003-02-21 Ulrich Drepper * sysdeps/unix/sysv/linux/bits/signum.h (__SIGRTMAX): Define as _NSIG. diff --git a/iconvdata/Makefile b/iconvdata/Makefile index c85ffcbcd7..16fcfec198 100644 --- a/iconvdata/Makefile +++ b/iconvdata/Makefile @@ -58,7 +58,10 @@ modules.so := $(addsuffix .so, $(modules)) include ../Makeconfig ifeq (yes,$(build-shared)) -tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv3 +tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 +ifeq ($(have-thread-library),yes) +tests += bug-iconv3 +endif test-srcs := tst-table-from tst-table-to endif diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index bcd5ea1b00..adfaaa8f0e 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,8 @@ +2003-02-21 Roland McGrath + + * cancel.c (__pthread_perform_cleanup): Call __libc_thread_freeres + instead of __rpc_thread_destroy. + 2003-02-21 Jakub Jelinek * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S (__vfork): Call diff --git a/linuxthreads/cancel.c b/linuxthreads/cancel.c index 838f55d8b2..d8053ca899 100644 --- a/linuxthreads/cancel.c +++ b/linuxthreads/cancel.c @@ -15,7 +15,7 @@ /* Thread cancellation */ #include -#include +#include #include "pthread.h" #include "internals.h" #include "spinlock.h" @@ -230,11 +230,5 @@ void __pthread_perform_cleanup(char *currentframe) } /* And the TSD which needs special help. */ -#if !(USE_TLS && HAVE___THREAD) - if (THREAD_GETMEM(self, p_libc_specific[_LIBC_TSD_KEY_RPC_VARS]) != NULL) - __rpc_thread_destroy (); -#else - if (__libc_tsd_get (RPC_VARS) != NULL) - __rpc_thread_destroy (); -#endif + __libc_thread_freeres (); } diff --git a/malloc/Makefile b/malloc/Makefile index 78855c0f0d..6c04518b39 100644 --- a/malloc/Makefile +++ b/malloc/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1991-1999, 2000, 2001, 2002 Free Software Foundation, Inc. +# Copyright (C) 1991-1999,2000,2001,2002,2003 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 @@ -52,7 +52,7 @@ libmemusage-inhibit-o = $(filter-out .os,$(object-suffixes)) extra-objs = mcheck-init.o libmcheck.a # Include the cleanup handler. -aux := set-freeres +aux := set-freeres thread-freeres include ../Makeconfig diff --git a/malloc/Versions b/malloc/Versions index bef99d31dc..0c578f95b6 100644 --- a/malloc/Versions +++ b/malloc/Versions @@ -58,5 +58,8 @@ libc { GLIBC_PRIVATE { # Internal startup hook for libpthread. __libc_malloc_pthread_startup; + + # Internal destructor hook for libpthread. + __libc_thread_freeres; } } diff --git a/malloc/thread-freeres.c b/malloc/thread-freeres.c new file mode 100644 index 0000000000..75d3014d6e --- /dev/null +++ b/malloc/thread-freeres.c @@ -0,0 +1,30 @@ +/* Free resources stored in thread-local variables on thread exit. + Copyright (C) 2003 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 + +DEFINE_HOOK (__libc_thread_subfreeres, (void)); + +void __attribute__ ((section ("__libc_thread_freeres_fn"))) +__libc_thread_freeres (void) +{ + RUN_HOOK (__libc_thread_subfreeres, ()); +} diff --git a/sunrpc/Versions b/sunrpc/Versions index d86d40a10b..b800172e08 100644 --- a/sunrpc/Versions +++ b/sunrpc/Versions @@ -113,8 +113,4 @@ libc { __rpc_thread_svc_fdset; __rpc_thread_createerr; __rpc_thread_svc_pollfd; __rpc_thread_svc_max_pollfd; } - GLIBC_PRIVATE { - # needed by libpthread. - __rpc_thread_destroy; __libc_tsd_RPC_VARS; - } } diff --git a/sunrpc/rpc_thread.c b/sunrpc/rpc_thread.c index df48c31a8f..9a3d4dbd0c 100644 --- a/sunrpc/rpc_thread.c +++ b/sunrpc/rpc_thread.c @@ -15,7 +15,7 @@ __libc_tsd_define (, RPC_VARS) /* * Task-variable destructor */ -void +void __attribute__ ((section ("__libc_thread_freeres_fn"))) __rpc_thread_destroy (void) { struct rpc_thread_variables *tvp = __libc_tsd_get (RPC_VARS); @@ -32,6 +32,7 @@ __rpc_thread_destroy (void) free (tvp); } } +text_set_element (__libc_thread_subfreeres, __rpc_thread_destroy); /* diff --git a/sysdeps/mach/hurd/opendir.c b/sysdeps/mach/hurd/opendir.c index 587b608107..a1ff947f06 100644 --- a/sysdeps/mach/hurd/opendir.c +++ b/sysdeps/mach/hurd/opendir.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993,94,95,96,97,98,2001 Free Software Foundation, Inc. +/* Copyright (C) 1993,94,95,96,97,98,2001,2003 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 @@ -50,17 +50,22 @@ __opendir (const char *name) { /* Append trailing slash to directory name to force ENOTDIR - if it's not a directory. */ + if it's not a directory. + + We open using the O_NONBLOCK flag so that a nondirectory with + blocking behavior (FIFO or device) gets ENOTDIR immediately + rather than waiting for the special file's open wakeup predicate. */ + size_t len = strlen (name); if (name[len - 1] == '/') - fd = __open (name, O_RDONLY); + fd = __open (name, O_RDONLY | O_NONBLOCK); else { char n[len + 2]; memcpy (n, name, len); n[len] = '/'; n[len + 1] = '\0'; - fd = __open (n, O_RDONLY); + fd = __open (n, O_RDONLY | O_NONBLOCK); } } if (fd < 0) -- cgit 1.4.1