diff options
| -rw-r--r-- | libc/misc/dirent/opendir.c | 2 | ||||
| -rw-r--r-- | libc/misc/pthread/Makefile.in | 2 | ||||
| -rw-r--r-- | libc/misc/pthread/unlock.c | 27 | ||||
| -rw-r--r-- | libc/misc/pthread/weaks.c | 44 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/bits/uClibc_mutex.h | 22 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/bits/uClibc_pthread.h | 7 | ||||
| -rw-r--r-- | libpthread/nptl/sysdeps/pthread/bits/libc-lock.h | 6 | 
7 files changed, 24 insertions, 86 deletions
| diff --git a/libc/misc/dirent/opendir.c b/libc/misc/dirent/opendir.c index 4a23ab061..66a5cc9e9 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 504aa254e..2f436ac1c 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 04de0df58..000000000 --- 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 580c3eb07..000000000 --- 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 c6094c3d2..02bcc7225 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 1d6209f5e..15aa1deed 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 3268aa5f6..52627b418 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 | 
