From: John David Anglin Date: Fri, 11 Feb 2011 03:00:53 +0000 (+0000) Subject: backport: re PR boehm-gc/34544 (pthread_default_stacksize_np failed.) X-Git-Tag: releases/gcc-4.4.6~131 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ed87c64e7e20c5fcdf85a577d7104b1ae5a0b8f2;p=thirdparty%2Fgcc.git backport: re PR boehm-gc/34544 (pthread_default_stacksize_np failed.) Backport from mainline: 2011-02-07 John David Anglin * config/pa/pa64-hpux.h (LIB_SPEC): In static links, link against shared libc if not linking against libpthread. * config/pa/pa-hpux11.h (LIB_SPEC): Likewise. 2010-08-22 John David Anglin PR boehm-gc/34544 * gthr-posix.h (__gthread_active_init): Delete. (__gthread_active_p): Do activity check here. Don't include errno.h on hppa-hpux. Update comment. * gthr-posix95.h (__gthread_active_init): Delete. (__gthread_active_p): Do activity check here. Don't include errno.h on hppa-hpux. Update comment. From-SVN: r170042 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c59b37427ff9..a9de418d518a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,22 @@ +2011-02-10 John David Anglin + + Backport from mainline: + 2011-02-07 John David Anglin + + * config/pa/pa64-hpux.h (LIB_SPEC): In static links, link against + shared libc if not linking against libpthread. + * config/pa/pa-hpux11.h (LIB_SPEC): Likewise. + + 2010-08-22 John David Anglin + + PR boehm-gc/34544 + * gthr-posix.h (__gthread_active_init): Delete. + (__gthread_active_p): Do activity check here. + Don't include errno.h on hppa-hpux. Update comment. + * gthr-posix95.h (__gthread_active_init): Delete. + (__gthread_active_p): Do activity check here. + Don't include errno.h on hppa-hpux. Update comment. + 2011-01-31 Nathan Froyd Backport from mainline: diff --git a/gcc/config/pa/pa-hpux11.h b/gcc/config/pa/pa-hpux11.h index 8dd01d2563d6..77a899eabd50 100644 --- a/gcc/config/pa/pa-hpux11.h +++ b/gcc/config/pa/pa-hpux11.h @@ -116,16 +116,17 @@ along with GCC; see the file COPYING3. If not see -z %{mlinker-opt:-O} %{!shared:-u main -u __gcc_plt_call}\ %{static:-a archive} %{shared:-b}" -/* HP-UX 11 has posix threads. HP libc contains pthread stubs so that - non-threaded applications can be linked with a thread-safe libc - without a subsequent loss of performance. For more details, see - . */ +/* HP-UX 11 has posix threads. HP's shared libc contains pthread stubs + so that non-threaded applications can be linked with a thread-safe + libc without a subsequent loss of performance. For more details, + see . */ #undef LIB_SPEC #define LIB_SPEC \ "%{!shared:\ - %{static|mt|pthread:%{fopenmp:%{static:-a archive_shared} -lrt\ - %{static:-a archive}} -lpthread} -lc\ - %{static:%{!nolibdld:-a archive_shared -ldld -a archive -lc}}}\ + %{fopenmp:%{static:-a archive_shared} -lrt %{static:-a archive}}\ + %{mt|pthread:-lpthread} -lc\ + %{static:%{!nolibdld:-a archive_shared -ldld -a archive -lc}\ + %{!mt:%{!pthread:-a shared -lc -a archive}}}}\ %{shared:%{mt|pthread:-lpthread}}" #undef STARTFILE_SPEC diff --git a/gcc/config/pa/pa64-hpux.h b/gcc/config/pa/pa64-hpux.h index 16f5a3e4b092..155ce486b600 100644 --- a/gcc/config/pa/pa64-hpux.h +++ b/gcc/config/pa/pa64-hpux.h @@ -57,36 +57,42 @@ along with GCC; see the file COPYING3. If not see #if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_GNU_LD) #define LIB_SPEC \ "%{!shared:\ - %{!p:%{!pg:%{static|mt|pthread:%{fopenmp:%{static:-a shared} -lrt\ - %{static:-a archive}} -lpthread} -lc\ - %{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\ + %{!p:%{!pg:%{fopenmp:%{static:-a shared} -lrt %{static:-a archive}}\ + %{mt|pthread:-lpthread} -lc\ + %{static:%{!nolibdld:-a shared -ldld -a archive -lc}\ + %{!mt:%{!pthread:-a shared -lc -a archive}}}}}\ %{p:%{!pg:%{static:%{!mhp-ld:-a shared}%{mhp-ld:-a archive_shared}}\ -lprof %{static:-a archive}\ - %{static|mt|pthread:%{fopenmp:%{static:-a shared} -lrt\ - %{static:-a archive}} -lpthread} -lc\ - %{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\ + %{fopenmp:%{static:-a shared} -lrt %{static:-a archive}}\ + %{mt|pthread:-lpthread} -lc\ + %{static:%{!nolibdld:-a shared -ldld -a archive -lc}\ + %{!mt:%{!pthread:-a shared -lc -a archive}}}}}\ %{pg:%{static:%{!mhp-ld:-a shared}%{mhp-ld:-a archive_shared}}\ -lgprof %{static:-a archive}\ - %{static|mt|pthread:%{fopenmp:%{static:-a shared} -lrt\ - %{static:-a archive}} -lpthread} -lc\ - %{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\ + %{fopenmp:%{static:-a shared} -lrt %{static:-a archive}}\ + %{mt|pthread:-lpthread} -lc\ + %{static:%{!nolibdld:-a shared -ldld -a archive -lc}\ + %{!mt:%{!pthread:-a shared -lc -a archive}}}}}\ %{shared:%{mt|pthread:-lpthread}}" #else #define LIB_SPEC \ "%{!shared:\ - %{!p:%{!pg:%{static|mt|pthread:%{fopenmp:%{static:-a shared} -lrt\ - %{static:-a archive}} -lpthread} -lc\ - %{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\ + %{!p:%{!pg:%{fopenmp:%{static:-a shared} -lrt %{static:-a archive}}\ + %{mt|pthread:-lpthread} -lc\ + %{static:%{!nolibdld:-a shared -ldld -a archive -lc}\ + %{!mt:%{!pthread:-a shared -lc -a archive}}}}}\ %{p:%{!pg:%{static:%{mgnu-ld:-a shared}%{!mgnu-ld:-a archive_shared}}\ -lprof %{static:-a archive}\ - %{static|mt|pthread:%{fopenmp:%{static:-a shared} -lrt\ - %{static:-a archive}} -lpthread} -lc\ - %{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\ + %{fopenmp:%{static:-a shared} -lrt %{static:-a archive}}\ + %{mt|pthread:-lpthread} -lc\ + %{static:%{!nolibdld:-a shared -ldld -a archive -lc}\ + %{!mt:%{!pthread:-a shared -lc -a archive}}}}}\ %{pg:%{static:%{mgnu-ld:-a shared}%{!mgnu-ld:-a archive_shared}}\ -lgprof %{static:-a archive}\ - %{static|mt|pthread:%{fopenmp:%{static:-a shared} -lrt\ - %{static:-a archive}} -lpthread} -lc\ - %{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\ + %{fopenmp:%{static:-a shared} -lrt %{static:-a archive}}\ + %{mt|pthread:-lpthread} -lc\ + %{static:%{!nolibdld:-a shared -ldld -a archive -lc}\ + %{!mt:%{!pthread:-a shared -lc -a archive}}}}}\ %{shared:%{mt|pthread:-lpthread}}" #endif diff --git a/gcc/gthr-posix.h b/gcc/gthr-posix.h index 82a3c581c0a0..4264bcc0209a 100644 --- a/gcc/gthr-posix.h +++ b/gcc/gthr-posix.h @@ -250,61 +250,34 @@ __gthread_active_p (void) calls in shared flavors of the HP-UX C library. Most of the stubs have no functionality. The details are described in the "libc cumulative patch" for each subversion of HP-UX 11. There are two special interfaces - provided for checking whether an application is linked to a pthread + provided for checking whether an application is linked to a shared pthread library or not. However, these interfaces aren't available in early - libc versions. We also can't use pthread_once as some libc versions - call the init function. So, we use pthread_create to check whether it - is possible to create a thread or not. The stub implementation returns - the error number ENOSYS. */ + libpthread libraries. We also need a test that works for archive + libraries. We can't use pthread_once as some libc versions call the + init function. We also can't use pthread_create or pthread_attr_init + as these create a thread and thereby prevent changing the default stack + size. The function pthread_default_stacksize_np is available in both + the archive and shared versions of libpthread. It can be used to + determine the default pthread stack size. There is a stub in some + shared libc versions which returns a zero size if pthreads are not + active. We provide an equivalent stub to handle cases where libc + doesn't provide one. */ #if defined(__hppa__) && defined(__hpux__) -#include - static volatile int __gthread_active = -1; -static void * -__gthread_start (void *__arg __attribute__((unused))) -{ - return NULL; -} - -static void __gthread_active_init (void) __attribute__((noinline)); -static void -__gthread_active_init (void) -{ - static pthread_mutex_t __gthread_active_mutex = PTHREAD_MUTEX_INITIALIZER; - pthread_t __t; - pthread_attr_t __a; - int __result; - - __gthrw_(pthread_mutex_lock) (&__gthread_active_mutex); - if (__gthread_active < 0) - { - __gthrw_(pthread_attr_init) (&__a); - __gthrw_(pthread_attr_setdetachstate) (&__a, PTHREAD_CREATE_DETACHED); - __result = __gthrw_(pthread_create) (&__t, &__a, __gthread_start, NULL); - if (__result != ENOSYS) - __gthread_active = 1; - else - __gthread_active = 0; - __gthrw_(pthread_attr_destroy) (&__a); - } - __gthrw_(pthread_mutex_unlock) (&__gthread_active_mutex); -} - static inline int __gthread_active_p (void) { /* Avoid reading __gthread_active twice on the main code path. */ int __gthread_active_latest_value = __gthread_active; + size_t __s; - /* This test is not protected to avoid taking a lock on the main code - path so every update of __gthread_active in a threaded program must - be atomic with regard to the result of the test. */ if (__builtin_expect (__gthread_active_latest_value < 0, 0)) { - __gthread_active_init (); + pthread_default_stacksize_np (0, &__s); + __gthread_active = __s ? 1 : 0; __gthread_active_latest_value = __gthread_active; } diff --git a/gcc/gthr-posix95.h b/gcc/gthr-posix95.h index 8772c977a28b..98471d6c0596 100644 --- a/gcc/gthr-posix95.h +++ b/gcc/gthr-posix95.h @@ -184,61 +184,34 @@ __gthread_active_p (void) calls in shared flavors of the HP-UX C library. Most of the stubs have no functionality. The details are described in the "libc cumulative patch" for each subversion of HP-UX 11. There are two special interfaces - provided for checking whether an application is linked to a pthread + provided for checking whether an application is linked to a shared pthread library or not. However, these interfaces aren't available in early - libc versions. We also can't use pthread_once as some libc versions - call the init function. So, we use pthread_create to check whether it - is possible to create a thread or not. The stub implementation returns - the error number ENOSYS. */ + pthread libraries. We also need a test that works for archive + libraries. We can't use pthread_once as some libc versions call the + init function. We also can't use pthread_create or pthread_attr_init + as these create a thread and thereby prevent changing the default stack + size. The function pthread_default_stacksize_np is available in both + the archive and shared versions of libpthread. It can be used to + determine the default pthread stack size. There is a stub in some + shared libc versions which returns a zero size if pthreads are not + active. We provide an equivalent stub to handle cases where libc + doesn't provide one. */ #if defined(__hppa__) && defined(__hpux__) -#include - static volatile int __gthread_active = -1; -static void * -__gthread_start (void *arg __attribute__((unused))) -{ - return NULL; -} - -static void __gthread_active_init (void) __attribute__((noinline)); -static void -__gthread_active_init (void) -{ - static pthread_mutex_t __gthread_active_mutex = PTHREAD_MUTEX_INITIALIZER; - pthread_t t; - pthread_attr_t a; - int result; - - __gthrw_(pthread_mutex_lock) (&__gthread_active_mutex); - if (__gthread_active < 0) - { - __gthrw_(pthread_attr_init) (&a); - __gthrw_(pthread_attr_setdetachstate) (&a, PTHREAD_CREATE_DETACHED); - result = __gthrw_(pthread_create) (&t, &a, __gthread_start, NULL); - if (result != ENOSYS) - __gthread_active = 1; - else - __gthread_active = 0; - __gthrw_(pthread_attr_destroy) (&a); - } - __gthrw_(pthread_mutex_unlock) (&__gthread_active_mutex); -} - static inline int __gthread_active_p (void) { /* Avoid reading __gthread_active twice on the main code path. */ int __gthread_active_latest_value = __gthread_active; + size_t __s; - /* This test is not protected to avoid taking a lock on the main code - path so every update of __gthread_active in a threaded program must - be atomic with regard to the result of the test. */ if (__builtin_expect (__gthread_active_latest_value < 0, 0)) { - __gthread_active_init (); + pthread_default_stacksize_np (0, &__s); + __gthread_active = __s ? 1 : 0; __gthread_active_latest_value = __gthread_active; }