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 |