+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
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 ();
}
#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
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);
+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.
/* 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
/* 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) \
/* 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
+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
/* 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;
-/* 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.
THREAD_SETMEM (self, cleanup, cbuf);
}
-
+hidden_def (__pthread_cleanup_upto)
void
/* 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. */
__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) \
__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
/* 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
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);
}
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);
}