diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index bcdf530343f..4a974401d68 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,10 @@ +2012-02-07 Jonathan Wakely + + PR libstdc++/51296 + PR libstdc++/51906 + * gthr-posix.h: Allow static initializer macros to be disabled. + (__gthrw_pthread_cond_init): Define weak reference unconditionally. + 2012-02-05 Chung-Lin Tang * config.host (mips64*-*-linux*, mipsisa64*-*-linux*, mips*-*-linux*): diff --git a/libgcc/gthr-posix.h b/libgcc/gthr-posix.h index 46054f6a7c2..a935e929184 100644 --- a/libgcc/gthr-posix.h +++ b/libgcc/gthr-posix.h @@ -74,6 +74,20 @@ typedef struct timespec __gthread_time_t; #define __GTHREAD_COND_INIT PTHREAD_COND_INITIALIZER #define __GTHREAD_TIME_INIT {0,0} +#ifdef _GTHREAD_USE_MUTEX_INIT_FUNC +# undef __GTHREAD_MUTEX_INIT +# define __GTHREAD_MUTEX_INIT_FUNCTION __gthread_mutex_init_function +#endif +#ifdef _GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC +# undef __GTHREAD_RECURSIVE_MUTEX_INIT +# undef __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION +# define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function +#endif +#ifdef _GTHREAD_USE_COND_INIT_FUNC +# undef __GTHREAD_COND_INIT +# define __GTHREAD_COND_INIT_FUNCTION __gthread_cond_init_function +#endif + #if SUPPORTS_WEAK && GTHREAD_USE_WEAK # ifndef __gthrw_pragma # define __gthrw_pragma(pragma) @@ -116,6 +130,7 @@ __gthrw3(pthread_mutex_unlock) __gthrw3(pthread_mutex_init) __gthrw3(pthread_mutex_destroy) +__gthrw3(pthread_cond_init) __gthrw3(pthread_cond_broadcast) __gthrw3(pthread_cond_signal) __gthrw3(pthread_cond_wait) @@ -145,6 +160,7 @@ __gthrw(pthread_mutex_unlock) __gthrw(pthread_mutex_init) __gthrw(pthread_mutex_destroy) +__gthrw(pthread_cond_init) __gthrw(pthread_cond_broadcast) __gthrw(pthread_cond_signal) __gthrw(pthread_cond_wait) @@ -162,10 +178,8 @@ __gthrw(pthread_mutexattr_destroy) #if defined(_LIBOBJC) || defined(_LIBOBJC_WEAK) /* Objective-C. */ #if defined(__osf__) && defined(_PTHREAD_USE_MANGLED_NAMES_) -__gthrw3(pthread_cond_init) __gthrw3(pthread_exit) #else -__gthrw(pthread_cond_init) __gthrw(pthread_exit) #endif /* __osf__ && _PTHREAD_USE_MANGLED_NAMES_ */ #ifdef _POSIX_PRIORITY_SCHEDULING @@ -730,6 +744,15 @@ __gthread_setspecific (__gthread_key_t __key, const void *__ptr) return __gthrw_(pthread_setspecific) (__key, __ptr); } +#ifdef _GTHREAD_USE_MUTEX_INIT_FUNC +static inline void +__gthread_mutex_init_function (__gthread_mutex_t *__mutex) +{ + if (__gthread_active_p ()) + __gthrw_(pthread_mutex_init) (__mutex, NULL); +} +#endif + static inline int __gthread_mutex_destroy (__gthread_mutex_t *__mutex) { @@ -778,7 +801,8 @@ __gthread_mutex_unlock (__gthread_mutex_t *__mutex) return 0; } -#ifndef PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP +#if !defined( PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP) \ + || defined(_GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC) static inline int __gthread_recursive_mutex_init_function (__gthread_recursive_mutex_t *__mutex) { @@ -828,6 +852,15 @@ __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) return __gthread_mutex_unlock (__mutex); } +#ifdef _GTHREAD_USE_COND_INIT_FUNC +static inline void +__gthread_cond_init_function (__gthread_cond_t *__cond) +{ + if (__gthread_active_p ()) + __gthrw_(pthread_cond_init) (__cond, NULL); +} +#endif + static inline int __gthread_cond_broadcast (__gthread_cond_t *__cond) { diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 434fd986832..b708ae0d82d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2012-02-07 Jonathan Wakely + + PR libstdc++/51296 + * include/std/mutex (__mutex_base::~__mutex_base): Declare noexcept. + * src/c++11/condition_variable.cc (condition_variable): Use macro for + initializer function. + + PR libstdc++/51906 + * config/os/bsd/darwin/os_defines.h: Disable static initializer for + recursive mutexes. + 2012-02-06 Jonathan Wakely PR libstdc++/52128 diff --git a/libstdc++-v3/config/os/bsd/darwin/os_defines.h b/libstdc++-v3/config/os/bsd/darwin/os_defines.h index ccefeafa731..421478d82d4 100644 --- a/libstdc++-v3/config/os/bsd/darwin/os_defines.h +++ b/libstdc++-v3/config/os/bsd/darwin/os_defines.h @@ -39,4 +39,7 @@ // -flat_namespace to work around the way that it doesn't. #define _GLIBCXX_WEAK_DEFINITION __attribute__ ((weak)) +// Static initializer macro is buggy in darwin, see libstdc++/51906 +#define _GTHREAD_USE_RECURSIVE_MUTEX_INIT_FUNC + #endif diff --git a/libstdc++-v3/include/std/mutex b/libstdc++-v3/include/std/mutex index 69e26e6de84..a7ebace2c88 100644 --- a/libstdc++-v3/include/std/mutex +++ b/libstdc++-v3/include/std/mutex @@ -71,7 +71,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __GTHREAD_MUTEX_INIT_FUNCTION(&_M_mutex); } - ~__mutex_base() { __gthread_mutex_destroy(&_M_mutex); } + ~__mutex_base() noexcept { __gthread_mutex_destroy(&_M_mutex); } #endif __mutex_base(const __mutex_base&) = delete; diff --git a/libstdc++-v3/src/c++11/condition_variable.cc b/libstdc++-v3/src/c++11/condition_variable.cc index 400fcf3546a..9cd07637ecd 100644 --- a/libstdc++-v3/src/c++11/condition_variable.cc +++ b/libstdc++-v3/src/c++11/condition_variable.cc @@ -36,10 +36,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #else condition_variable::condition_variable() noexcept { - int __e = __gthread_cond_init(&_M_cond, 0); - - if (__e) - __throw_system_error(__e); + __GTHREAD_COND_INIT_FUNCTION(&_M_cond); } condition_variable::~condition_variable() noexcept