From 279c728ee62e53eb055227695bc6fafb31a3a5f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Ter=C3=A4s?= Date: Thu, 22 Apr 2010 11:06:41 +0000 Subject: nptl: fix libc internal, dynamically enabled locking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Final iteration to fix libc internal locking if libpthread is pulled in by dlopen call (directly or indirectly). We cannot really use the weak symbol trick for shared build, since the symbols won't get refreshed if libpthread is pulled in dynamically. In glibc, they have #ifdef SHARED magic to either use pthread_functions table, or weaks. But as we shared object files with both builds, this does not sounds good either. The reintroduces the libc weaks.c, but uses them now only with static build. For dynamic build, we still use the symbols with same name, but provide weaks in forward.c so they end up dereferencing the pthread_functions table indirectly if we are not linked to libpthread. Mutex initialization is hard coded as inline, as it needs to happen even if libpthread is not initially loaded. Signed-off-by: Timo Teräs Signed-off-by: Austin Foxley --- libc/sysdeps/linux/common/bits/uClibc_mutex.h | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) (limited to 'libc/sysdeps') diff --git a/libc/sysdeps/linux/common/bits/uClibc_mutex.h b/libc/sysdeps/linux/common/bits/uClibc_mutex.h index 6d004bb74..3e3d0066a 100644 --- a/libc/sysdeps/linux/common/bits/uClibc_mutex.h +++ b/libc/sysdeps/linux/common/bits/uClibc_mutex.h @@ -15,13 +15,6 @@ #include #include -#define __uclibc_maybe_call(FUNC, ARGS) \ - (__extension__ ({ \ - __typeof (FUNC) *_fn = (FUNC); \ - if (_fn != NULL) { (*_fn) ARGS; } \ - })) - - #define __UCLIBC_MUTEX_TYPE pthread_mutex_t #define __UCLIBC_MUTEX(M) pthread_mutex_t M @@ -30,21 +23,21 @@ #define __UCLIBC_MUTEX_EXTERN(M) extern pthread_mutex_t M #define __UCLIBC_MUTEX_INIT_VAR(M) \ - __uclibc_maybe_call(__pthread_mutex_init,(&(M),NULL)) + ((M) = (pthread_mutex_t) PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) #define __UCLIBC_MUTEX_LOCK_CANCEL_UNSAFE(M) \ - __uclibc_maybe_call(__pthread_mutex_lock,(&(M))) + __pthread_mutex_lock(&(M)) #define __UCLIBC_MUTEX_UNLOCK_CANCEL_UNSAFE(M) \ - __uclibc_maybe_call(__pthread_mutex_unlock,(&(M))) + __pthread_mutex_unlock(&(M)) #define __UCLIBC_MUTEX_TRYLOCK_CANCEL_UNSAFE(M) \ - __uclibc_maybe_call(__pthread_mutex_trylock,(&(M))) + __pthread_mutex_trylock,(&(M)) #define __UCLIBC_MUTEX_CONDITIONAL_LOCK(M,C) \ do { \ struct _pthread_cleanup_buffer __infunc_pthread_cleanup_buffer; \ - int __infunc_need_locking = ((C) && (__pthread_mutex_lock != NULL)); \ + int __infunc_need_locking = (C); \ if (__infunc_need_locking) { \ _pthread_cleanup_push_defer(&__infunc_pthread_cleanup_buffer, \ (void (*) (void *))__pthread_mutex_unlock, \ -- cgit v1.2.3