diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | elf/ldconfig.c | 4 | ||||
-rw-r--r-- | elf/rtld.c | 20 | ||||
-rw-r--r-- | linuxthreads/ChangeLog | 13 | ||||
-rw-r--r-- | linuxthreads/pthread.c | 9 | ||||
-rw-r--r-- | linuxthreads/sysdeps/pthread/bits/libc-lock.h | 18 | ||||
-rw-r--r-- | nptl/ChangeLog | 16 | ||||
-rw-r--r-- | nptl/init.c | 9 | ||||
-rw-r--r-- | nptl/pt-longjmp.c | 4 | ||||
-rw-r--r-- | nptl/pthreadP.h | 3 | ||||
-rw-r--r-- | nptl/sysdeps/pthread/bits/libc-lock.h | 22 | ||||
-rw-r--r-- | sysdeps/generic/ldsodefs.h | 6 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/fpathconf.c | 7 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/pathconf.c | 7 |
14 files changed, 128 insertions, 24 deletions
@@ -1,3 +1,17 @@ +2003-08-07 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/generic/ldsodefs.h (_rtld_global): Add + _dl_rtld_lock_recursive and _dl_rtld_unlock_recursive. + * elf/rtld.c (rtld_lock_default_lock_recursive, + rtld_lock_default_unlock_recursive): New functions. + (dl_main): Initialize _dl_rtld_lock_recursive and + _dl_rtld_unlock_recursive. + +2003-08-05 Jakub Jelinek <jakub@redhat.com> + + * elf/ldconfig.c (main): Append SLIBDIR and LIBDIR to + config_file directories instead of prepending. + 2003-08-02 Ulrich Drepper <drepper@redhat.com> * sysdeps/unix/sysv/linux/kernel-features.h: Define diff --git a/elf/ldconfig.c b/elf/ldconfig.c index b7ac488..2a24a17 100644 --- a/elf/ldconfig.c +++ b/elf/ldconfig.c @@ -1117,12 +1117,12 @@ main (int argc, char **argv) if (!opt_only_cline) { + parse_conf (config_file); + /* Always add the standard search paths. */ add_system_dir (SLIBDIR); if (strcmp (SLIBDIR, LIBDIR)) add_system_dir (LIBDIR); - - parse_conf (config_file); } search_dirs (); @@ -588,6 +588,20 @@ _dl_initial_error_catch_tsd (void) } #endif +#if defined SHARED && defined _LIBC_REENTRANT \ + && defined __rtld_lock_default_lock_recursive +static void rtld_lock_default_lock_recursive (void *lock) +{ + __rtld_lock_default_lock_recursive (lock); +} + +static void rtld_lock_default_unlock_recursive (void *lock) +{ + __rtld_lock_default_unlock_recursive (lock); +} +#endif + + static const char *library_path; /* The library search path. */ static const char *preloadlist; /* The list preloaded objects. */ static int version_info; /* Nonzero if information about @@ -626,6 +640,12 @@ dl_main (const ElfW(Phdr) *phdr, GL(dl_init_static_tls) = &_dl_nothread_init_static_tls; #endif +#if defined SHARED && defined _LIBC_REENTRANT \ + && defined __rtld_lock_default_lock_recursive + GL(dl_rtld_lock_recursive) = rtld_lock_default_lock_recursive; + GL(dl_rtld_unlock_recursive) = rtld_lock_default_unlock_recursive; +#endif + /* Process the environment variable which control the behaviour. */ process_envvars (&mode); diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog index 89568cd..54d7e42 100644 --- a/linuxthreads/ChangeLog +++ b/linuxthreads/ChangeLog @@ -1,3 +1,16 @@ +2003-08-07 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/pthread/bits/libc-lock.h [_LIBC && SHARED] + (__rtld_lock_default_lock_recursive, + __rtld_lock_default_unlock_recursive): Define. + [_LIBC && SHARED] (__rtld_lock_lock_recursive, + __rtld_lock_unlock_recursive): Define using + GL(_dl_rtld_*lock_recursive). + * pthread.c (pthread_initialize): Initialize _dl_rtld_lock_recursive + and _dl_rtld_unlock_recursive. Lock GL(_dl_load_lock) the same + number of times as GL(_dl_load_lock) using non-mt implementation was + nested. + 2003-07-31 Jakub Jelinek <jakub@redhat.com> * sysdeps/pthread/bits/typesizes.h (__SSIZE_T_TYPE): Define. diff --git a/linuxthreads/pthread.c b/linuxthreads/pthread.c index f708113..f261f8e 100644 --- a/linuxthreads/pthread.c +++ b/linuxthreads/pthread.c @@ -588,6 +588,15 @@ static void pthread_initialize(void) /* Transfer the old value from the dynamic linker's internal location. */ *__libc_dl_error_tsd () = *(*GL(dl_error_catch_tsd)) (); GL(dl_error_catch_tsd) = &__libc_dl_error_tsd; + + /* Make __rtld_lock_{,un}lock_recursive use pthread_mutex_{,un}lock, + keep the lock count from the ld.so implementation. */ + GL(dl_rtld_lock_recursive) = (void *) __pthread_mutex_lock; + GL(dl_rtld_unlock_recursive) = (void *) __pthread_mutex_unlock; + unsigned int rtld_lock_count = GL(dl_load_lock).mutex.__m_count; + GL(dl_load_lock).mutex.__m_count = 0; + while (rtld_lock_count-- > 0) + __pthread_mutex_lock (&GL(dl_load_lock).mutex); #endif #ifdef USE_TLS diff --git a/linuxthreads/sysdeps/pthread/bits/libc-lock.h b/linuxthreads/sysdeps/pthread/bits/libc-lock.h index 2697a18..c0d0deb 100644 --- a/linuxthreads/sysdeps/pthread/bits/libc-lock.h +++ b/linuxthreads/sysdeps/pthread/bits/libc-lock.h @@ -180,7 +180,6 @@ typedef pthread_key_t __libc_key_t; /* Lock the recursive named lock variable. */ #define __libc_lock_lock_recursive(NAME) __libc_lock_lock ((NAME).mutex) -#define __rtld_lock_lock_recursive(NAME) __libc_lock_lock_recursive (NAME) /* Try to lock the named lock variable. */ #define __libc_lock_trylock(NAME) \ @@ -203,8 +202,23 @@ typedef pthread_key_t __libc_key_t; /* Unlock the recursive named lock variable. */ #define __libc_lock_unlock_recursive(NAME) __libc_lock_unlock ((NAME).mutex) -#define __rtld_lock_unlock_recursive(NAME) __libc_lock_unlock_recursive (NAME) +#if defined _LIBC && defined SHARED +# define __rtld_lock_default_lock_recursive(lock) \ + ++((pthread_mutex_t *)(lock))->__m_count; + +# define __rtld_lock_default_unlock_recursive(lock) \ + --((pthread_mutex_t *)(lock))->__m_count; + +# define __rtld_lock_lock_recursive(NAME) \ + GL(dl_rtld_lock_recursive) (&(NAME).mutex) + +# define __rtld_lock_unlock_recursive(NAME) \ + GL(dl_rtld_unlock_recursive) (&(NAME).mutex) +#else +#define __rtld_lock_lock_recursive(NAME) __libc_lock_lock_recursive (NAME) +#define __rtld_lock_unlock_recursive(NAME) __libc_lock_unlock_recursive (NAME) +#endif /* Define once control variable. */ #if PTHREAD_ONCE_INIT == 0 diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 3fd2f22..dcf3815 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,19 @@ +2003-08-07 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/pthread/bits/libc-lock.h [_LIBC && SHARED] + (__rtld_lock_default_lock_recursive, + __rtld_lock_default_unlock_recursive): Define. + [_LIBC && SHARED] (__rtld_lock_lock_recursive, + __rtld_lock_unlock_recursive): Define using + GL(_dl_rtld_*lock_recursive). + * init.c (__pthread_initialize_minimal_internal): Initialize + _dl_rtld_lock_recursive and _dl_rtld_unlock_recursive. + Lock GL(_dl_load_lock) the same number of times as + GL(_dl_load_lock) using non-mt implementation was nested. + + * pthreadP.h (__pthread_cleanup_upto): Add hidden_proto. + * pt-longjmp.c (__pthread_cleanup_upto): Add hidden_def. + 2003-08-06 Jakub Jelinek <jakub@redhat.com> * tst-cancel17.c (do_test): Make len2 maximum of page size and diff --git a/nptl/init.c b/nptl/init.c index dae24f1..1f60e92 100644 --- a/nptl/init.c +++ b/nptl/init.c @@ -270,6 +270,15 @@ __pthread_initialize_minimal_internal (void) /* Transfer the old value from the dynamic linker's internal location. */ *__libc_dl_error_tsd () = *(*GL(dl_error_catch_tsd)) (); GL(dl_error_catch_tsd) = &__libc_dl_error_tsd; + + /* Make __rtld_lock_{,un}lock_recursive use pthread_mutex_{,un}lock, + keep the lock count from the ld.so implementation. */ + GL(dl_rtld_lock_recursive) = (void *) INTUSE (__pthread_mutex_lock); + GL(dl_rtld_unlock_recursive) = (void *) INTUSE (__pthread_mutex_unlock); + unsigned int rtld_lock_count = GL(dl_load_lock).mutex.__data.__count; + GL(dl_load_lock).mutex.__data.__count = 0; + while (rtld_lock_count-- > 0) + INTUSE (__pthread_mutex_lock) (&GL(dl_load_lock).mutex); #endif GL(dl_init_static_tls) = &__pthread_init_static_tls; diff --git a/nptl/pt-longjmp.c b/nptl/pt-longjmp.c index f333b8d..f217e30 100644 --- a/nptl/pt-longjmp.c +++ b/nptl/pt-longjmp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. @@ -54,7 +54,7 @@ __pthread_cleanup_upto (__jmp_buf target, char *targetframe) THREAD_SETMEM (self, cleanup, cbuf); } - +hidden_def (__pthread_cleanup_upto) void diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index b07c6da..99b3444 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -217,6 +217,9 @@ extern void __reclaim_stacks (void) attribute_hidden; /* longjmp handling. */ extern void __pthread_cleanup_upto (__jmp_buf target, char *targetframe); +#if defined NOT_IN_libc && defined IS_IN_libpthread +hidden_proto (__pthread_cleanup_upto) +#endif /* Functions with versioned interfaces. */ diff --git a/nptl/sysdeps/pthread/bits/libc-lock.h b/nptl/sysdeps/pthread/bits/libc-lock.h index 35bc21b..f7ed88d 100644 --- a/nptl/sysdeps/pthread/bits/libc-lock.h +++ b/nptl/sysdeps/pthread/bits/libc-lock.h @@ -248,9 +248,6 @@ typedef pthread_key_t __libc_key_t; __libc_maybe_call (__pthread_mutex_lock, (&(NAME).mutex), 0) #endif -#define __rtld_lock_lock_recursive(NAME) \ - __libc_maybe_call (__pthread_mutex_lock, (&(NAME).mutex), 0) - /* Try to lock the named lock variable. */ #if defined _LIBC && (!defined NOT_IN_libc || defined IS_IN_libpthread) # define __libc_lock_trylock(NAME) \ @@ -319,8 +316,25 @@ typedef pthread_key_t __libc_key_t; __libc_maybe_call (__pthread_mutex_unlock, (&(NAME)), 0) #endif -#define __rtld_lock_unlock_recursive(NAME) \ +#if defined _LIBC && defined SHARED +# define __rtld_lock_default_lock_recursive(lock) \ + ++((pthread_mutex_t *)(lock))->__data.__count; + +# define __rtld_lock_default_unlock_recursive(lock) \ + --((pthread_mutex_t *)(lock))->__data.__count; + +# define __rtld_lock_lock_recursive(NAME) \ + GL(dl_rtld_lock_recursive) (&(NAME).mutex) + +# define __rtld_lock_unlock_recursive(NAME) \ + GL(dl_rtld_unlock_recursive) (&(NAME).mutex) +#else +# define __rtld_lock_lock_recursive(NAME) \ + __libc_maybe_call (__pthread_mutex_lock, (&(NAME).mutex), 0) + +# define __rtld_lock_unlock_recursive(NAME) \ __libc_maybe_call (__pthread_mutex_unlock, (&(NAME).mutex), 0) +#endif /* Define once control variable. */ #if PTHREAD_ONCE_INIT == 0 diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index b647ea4..58dfc15 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -349,6 +349,12 @@ struct rtld_global /* Structure describing the dynamic linker itself. */ EXTERN struct link_map _dl_rtld_map; +#if defined SHARED && defined _LIBC_REENTRANT \ + && defined __rtld_lock_default_lock_recursive + EXTERN void (*_dl_rtld_lock_recursive) (void *); + EXTERN void (*_dl_rtld_unlock_recursive) (void *); +#endif + /* Keep the conditional TLS members at the end so the layout of the structure used by !USE_TLS code matches the prefix of the layout in the USE_TLS rtld. Note that `struct link_map' is conditionally diff --git a/sysdeps/unix/sysv/linux/fpathconf.c b/sysdeps/unix/sysv/linux/fpathconf.c index 8b6fbeb..c1cdb1b 100644 --- a/sysdeps/unix/sysv/linux/fpathconf.c +++ b/sysdeps/unix/sysv/linux/fpathconf.c @@ -45,13 +45,6 @@ __fpathconf (fd, name) case _PC_2_SYMLINKS: return __statfs_symlinks (__fstatfs (fd, &fsbuf), &fsbuf); - case _PC_PIPE_BUF: -#ifdef PIPE_BUF - return PIPE_BUF; -#else - return __getpagesize (); -#endif - default: return posix_fpathconf (fd, name); } diff --git a/sysdeps/unix/sysv/linux/pathconf.c b/sysdeps/unix/sysv/linux/pathconf.c index 1e06793..d415975 100644 --- a/sysdeps/unix/sysv/linux/pathconf.c +++ b/sysdeps/unix/sysv/linux/pathconf.c @@ -46,13 +46,6 @@ __pathconf (const char *file, int name) case _PC_2_SYMLINKS: return __statfs_symlinks (__statfs (file, &fsbuf), &fsbuf); - case _PC_PIPE_BUF: -#ifdef PIPE_BUF - return PIPE_BUF; -#else - return __getpagesize (); -#endif - default: return posix_pathconf (file, name); } |