[git commit master] libc: remove libc weak __pthreads_* wrappers

Timo Teras timo.teras at iki.fi
Fri Apr 23 14:31:55 UTC 2010


commit: http://git.uclibc.org/uClibc/commit/?id=0eadd98d30c51d26fde4062e6b8c48f3c9b5148d
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/master

It is not possible to override for libpthread to override
the weak libc definitions. This has never worked in uclibc, and
does no longer work in glibc either (unless you use LD_DYNAMIC_WEAK).

The proper thing to do is have weak prototypes in libc, and
definitions in libpthread only. This way libc runs even if
those functions are not defined, but just needs to protect
against the NULL values (done by implementing __uclibc_maybe_call).

This fix the problems if libc is linked before libpthread or
if libpthread is pulled by a dependency library.

Signed-off-by: Timo Teras <timo.teras at iki.fi>
Signed-off-by: Austin Foxley <austinf at cetoncorp.com>
---
 libc/misc/dirent/opendir.c                       |    2 +-
 libc/misc/pthread/Makefile.in                    |    2 -
 libc/misc/pthread/unlock.c                       |   27 -------------
 libc/misc/pthread/weaks.c                        |   44 ----------------------
 libc/sysdeps/linux/common/bits/uClibc_mutex.h    |   22 ++++++++--
 libc/sysdeps/linux/common/bits/uClibc_pthread.h  |    7 ++-
 libpthread/nptl/sysdeps/pthread/bits/libc-lock.h |    6 +--
 7 files changed, 24 insertions(+), 86 deletions(-)
 delete mode 100644 libc/misc/pthread/unlock.c
 delete mode 100644 libc/misc/pthread/weaks.c

diff --git a/libc/misc/dirent/opendir.c b/libc/misc/dirent/opendir.c
index 4a23ab0..66a5cc9 100644
--- a/libc/misc/dirent/opendir.c
+++ b/libc/misc/dirent/opendir.c
@@ -35,7 +35,7 @@ static DIR *fd_to_DIR(int fd, __blksize_t size)
 		free(ptr);
 		return NULL;
 	}
-	__pthread_mutex_init(&ptr->dd_lock, NULL);
+	__UCLIBC_MUTEX_INIT_VAR(ptr->dd_lock);
 
 	return ptr;
 }
diff --git a/libc/misc/pthread/Makefile.in b/libc/misc/pthread/Makefile.in
index 504aa25..2f436ac 100644
--- a/libc/misc/pthread/Makefile.in
+++ b/libc/misc/pthread/Makefile.in
@@ -11,8 +11,6 @@ MISC_PTHREAD_DIR := $(top_srcdir)libc/misc/pthread
 MISC_PTHREAD_OUT := $(top_builddir)libc/misc/pthread
 
 libc-shared-$(UCLIBC_HAS_TLS) += $(MISC_PTHREAD_OUT)/tsd.os
-libc-$(UCLIBC_HAS_THREADS) += $(MISC_PTHREAD_OUT)/unlock.o
-libc-$(UCLIBC_HAS_THREADS) += $(MISC_PTHREAD_OUT)/weaks.o
 
 objclean-y += CLEAN_libc/misc/pthread
 
diff --git a/libc/misc/pthread/unlock.c b/libc/misc/pthread/unlock.c
deleted file mode 100644
index 04de0df..0000000
--- a/libc/misc/pthread/unlock.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/* The weak pthread functions for Linux.
-   Copyright (C) 1996, 1997, 1998 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 Library General Public License as
-   published by the Free Software Foundation; either version 2 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
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library 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 <pthread.h>
-#include <bits/uClibc_mutex.h>
-
-void attribute_hidden __uclibc_mutex_unlock (void *arg)
-{
-	pthread_mutex_t *__mutex = (pthread_mutex_t *)arg;
-	__pthread_mutex_unlock(__mutex);
-}
diff --git a/libc/misc/pthread/weaks.c b/libc/misc/pthread/weaks.c
deleted file mode 100644
index 580c3eb..0000000
--- a/libc/misc/pthread/weaks.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/* The weak pthread functions for Linux.
-   Copyright (C) 1996, 1997, 1998 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 Library General Public License as
-   published by the Free Software Foundation; either version 2 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
-   Library General Public License for more details.
-
-   You should have received a copy of the GNU Library 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 <libc-internal.h>
-
-/* Weaks for internal library use only.
- *
- * We need to define weaks here to cover all the pthread functions that
- * libc itself will use so that we aren't forced to link libc against
- * libpthread.  This file is only used in libc.a and since we have
- * weaks here, they will be automatically overridden by libpthread.a
- * if it gets linked in.
- */
-
-static int __pthread_return_0 (void) { return 0; }
-static void __pthread_return_void (void) { return; }
-
-weak_alias (__pthread_return_0, __pthread_mutex_init)
-weak_alias (__pthread_return_0, __pthread_mutex_lock)
-weak_alias (__pthread_return_0, __pthread_mutex_trylock)
-weak_alias (__pthread_return_0, __pthread_mutex_unlock)
-weak_alias (__pthread_return_void, _pthread_cleanup_push_defer)
-weak_alias (__pthread_return_void, _pthread_cleanup_pop_restore)
-#ifdef __UCLIBC_HAS_THREADS_NATIVE__
-weak_alias (__pthread_return_0, __pthread_mutexattr_init)
-weak_alias (__pthread_return_0, __pthread_mutexattr_destroy)
-weak_alias (__pthread_return_0, __pthread_mutexattr_settype)
-#endif
diff --git a/libc/sysdeps/linux/common/bits/uClibc_mutex.h b/libc/sysdeps/linux/common/bits/uClibc_mutex.h
index c6094c3..02bcc72 100644
--- a/libc/sysdeps/linux/common/bits/uClibc_mutex.h
+++ b/libc/sysdeps/linux/common/bits/uClibc_mutex.h
@@ -13,8 +13,16 @@
 #ifdef __UCLIBC_HAS_THREADS__
 
 #include <pthread.h>
+#include <bits/libc-lock.h>
 #include <bits/uClibc_pthread.h>
 
+#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
@@ -22,19 +30,23 @@
 #define __UCLIBC_MUTEX_STATIC(M,I)			static pthread_mutex_t M = I
 #define __UCLIBC_MUTEX_EXTERN(M)			extern pthread_mutex_t M
 
+#define __UCLIBC_MUTEX_INIT_VAR(M)								\
+		__uclibc_maybe_call(__pthread_mutex_init,(&(M),NULL))
+
 #define __UCLIBC_MUTEX_LOCK_CANCEL_UNSAFE(M)								\
-		__pthread_mutex_lock(&(M))
+		__uclibc_maybe_call(__pthread_mutex_lock,(&(M)))
 
 #define __UCLIBC_MUTEX_UNLOCK_CANCEL_UNSAFE(M)								\
-		__pthread_mutex_unlock(&(M))
+		__uclibc_maybe_call(__pthread_mutex_unlock,(&(M)))
 
 #define __UCLIBC_MUTEX_TRYLOCK_CANCEL_UNSAFE(M)								\
-		__pthread_mutex_trylock(&(M))
+		__uclibc_maybe_call(__pthread_mutex_trylock,(&(M)))
 
 #define __UCLIBC_MUTEX_CONDITIONAL_LOCK(M,C)								\
 	do {												\
 		struct _pthread_cleanup_buffer __infunc_pthread_cleanup_buffer;				\
-		if (C) {										\
+		int __infunc_need_locking = ((C) && (__pthread_mutex_lock != NULL));			\
+		if (__infunc_need_locking) {								\
 			_pthread_cleanup_push_defer(&__infunc_pthread_cleanup_buffer,			\
 					   (void (*) (void *))__pthread_mutex_unlock,			\
 										&(M));			\
@@ -43,7 +55,7 @@
 		((void)0)
 
 #define __UCLIBC_MUTEX_CONDITIONAL_UNLOCK(M,C)								\
-		if (C) {										\
+		if (__infunc_need_locking) {								\
 			_pthread_cleanup_pop_restore(&__infunc_pthread_cleanup_buffer,1);		\
 		}											\
 	} while (0)
diff --git a/libc/sysdeps/linux/common/bits/uClibc_pthread.h b/libc/sysdeps/linux/common/bits/uClibc_pthread.h
index 1d6209f..15aa1de 100644
--- a/libc/sysdeps/linux/common/bits/uClibc_pthread.h
+++ b/libc/sysdeps/linux/common/bits/uClibc_pthread.h
@@ -28,6 +28,9 @@
 #endif
 
 #if defined _LIBC && (defined IS_IN_libc || defined NOT_IN_libc)
+
+struct _pthread_cleanup_buffer;
+
 /* Threading functions internal to uClibc.  Make these thread functions
  * weak so that we can elide them from single-threaded processes.  */
 extern int weak_function __pthread_mutex_init (pthread_mutex_t *__mutex,
@@ -35,16 +38,14 @@ extern int weak_function __pthread_mutex_init (pthread_mutex_t *__mutex,
 extern int weak_function __pthread_mutex_destroy (pthread_mutex_t *__mutex);
 extern int weak_function __pthread_mutex_lock (pthread_mutex_t *__mutex);
 extern int weak_function __pthread_mutex_unlock (pthread_mutex_t *__mutex);
-extern void __uclibc_mutex_unlock (void *) attribute_hidden;
 extern int weak_function __pthread_mutex_trylock (pthread_mutex_t *__mutex);
-# ifndef __UCLIBC_HAS_THREADS_NATIVE__
 extern void weak_function _pthread_cleanup_push_defer (
 		struct _pthread_cleanup_buffer *__buffer,
 		void (*__routine) (void *), void *__arg);
 extern void weak_function _pthread_cleanup_pop_restore (
 		struct _pthread_cleanup_buffer *__buffer,
 		int __execute);
-# endif
+
 #endif
 
 #endif
diff --git a/libpthread/nptl/sysdeps/pthread/bits/libc-lock.h b/libpthread/nptl/sysdeps/pthread/bits/libc-lock.h
index 3268aa5..52627b4 100644
--- a/libpthread/nptl/sysdeps/pthread/bits/libc-lock.h
+++ b/libpthread/nptl/sysdeps/pthread/bits/libc-lock.h
@@ -20,6 +20,7 @@
 #ifndef _BITS_LIBC_LOCK_H
 #define _BITS_LIBC_LOCK_H 1
 
+#include <bits/initspin.h>
 #include <pthread.h>
 #define __need_NULL
 #include <stddef.h>
@@ -429,7 +430,7 @@ extern void _pthread_cleanup_pop_restore (struct _pthread_cleanup_buffer *buffer
 
 
 /* Normal cleanup handling, based on C cleanup attribute.  */
-__extern_inline void
+static inline void
 __libc_cleanup_routine (struct __pthread_cleanup_frame *f)
 {
   if (f->__do_it)
@@ -460,7 +461,6 @@ __libc_cleanup_routine (struct __pthread_cleanup_frame *f)
 #define __libc_setspecific(KEY, VALUE) \
   __libc_ptf_call (__pthread_setspecific, (KEY, VALUE), 0)
 
-
 /* Register handlers to execute before and after `fork'.  Note that the
    last parameter is NULL.  The handlers registered by the libc are
    never removed so this is OK.  */
@@ -551,10 +551,8 @@ weak_extern (__pthread_getspecific)
 weak_extern (__pthread_once)
 //weak_extern (__pthread_initialize)
 weak_extern (__pthread_atfork)
-#ifdef SHARED
 weak_extern (_pthread_cleanup_push_defer)
 weak_extern (_pthread_cleanup_pop_restore)
-#endif
 weak_extern (pthread_setcancelstate)
 # else
 #  pragma weak __pthread_mutex_init
-- 
1.6.3.3



More information about the uClibc-cvs mailing list