diff options
author | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-08-22 16:23:38 +0000 |
---|---|---|
committer | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-08-22 16:23:38 +0000 |
commit | 698b676d43c5961b2f48f46e33e8444db51f46dd (patch) | |
tree | c172392bd61f9817efc08bc65e8eeb051391b0ec /gcc/gthr-posix95.h | |
parent | 52ebbb0dbf133e9acdf7152ea119aef0ba455285 (diff) | |
download | gcc-698b676d43c5961b2f48f46e33e8444db51f46dd.tar.gz |
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.
* config.gcc (hppa[12]*-*-hpux11*): Define extra_parts.
* config/pa/pa64-hpux.h (LIB_SPEC): When -static is specified, only
add -lpthread when -mt or -pthread is specified.
* config/pa/pa-hpux11.h (LIB_SPEC): likewise.
(LINK_GCC_C_SEQUENCE_SPEC): Define.
* config/pa/t-pa-hpux11 (LIBGCCSTUB_OBJS): Define.
(stublib.c, pthread_default_stacksize_np-stub.o,
pthread_mutex_lock-stub.o, pthread_mutex_unlock-stub.o,
$(T)libgcc_stub.a): Add methods.
* config/pa/t-pa64 (LIBGCCSTUB_OBJS): Add pthread stubs.
(stublib.c, pthread_default_stacksize_np-stub.o,
pthread_mutex_lock-stub.o, pthread_mutex_unlock-stub.o): Add methods.
* config/pa/stublib.c (pthread_default_stacksize_np, pthread_mutex_lock,
pthread_mutex_unlock): New stubs.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163461 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gthr-posix95.h')
-rw-r--r-- | gcc/gthr-posix95.h | 41 |
1 files changed, 14 insertions, 27 deletions
diff --git a/gcc/gthr-posix95.h b/gcc/gthr-posix95.h index d0e0f995f1b..2b26f2da59d 100644 --- a/gcc/gthr-posix95.h +++ b/gcc/gthr-posix95.h @@ -184,47 +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 <errno.h> - static volatile int __gthread_active = -1; -static void __gthread_active_init (void) __attribute__((noinline)); -static void -__gthread_active_init (void) -{ - static pthread_mutex_t __gthread_active_mutex = PTHREAD_MUTEX_INITIALIZER; - size_t __s; - - __gthrw_(pthread_mutex_lock) (&__gthread_active_mutex); - if (__gthread_active < 0) - { - pthread_default_stacksize_np (0, &__s); - __gthread_active = __s ? 1 : 0; - } - __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; } |