diff options
author | John David Anglin <dave.anglin@nrc-cnrc.gc.ca> | 2007-09-07 16:54:38 +0000 |
---|---|---|
committer | John David Anglin <danglin@gcc.gnu.org> | 2007-09-07 16:54:38 +0000 |
commit | f74eeed4436adab2c50bec4f941cb940489aed3e (patch) | |
tree | cde3f92be3a3e77776c4609fa446ca7fc6970639 /gcc/gthr-posix95.h | |
parent | 215161e20f2d87926fe0778cea032de8dee3c6bd (diff) | |
download | gcc-f74eeed4436adab2c50bec4f941cb940489aed3e.zip gcc-f74eeed4436adab2c50bec4f941cb940489aed3e.tar.gz gcc-f74eeed4436adab2c50bec4f941cb940489aed3e.tar.bz2 |
re PR target/33286 (All exception related tests fail)
PR target/33286
* gthr-posix.h (__gthread_active_p): Add implementation for hppa-hpux.
(__gthread_active,__gthread_start, __gthread_active_init): New.
* gthr-posix95.h: Likewise.
From-SVN: r128249
Diffstat (limited to 'gcc/gthr-posix95.h')
-rw-r--r-- | gcc/gthr-posix95.h | 71 |
1 files changed, 70 insertions, 1 deletions
diff --git a/gcc/gthr-posix95.h b/gcc/gthr-posix95.h index fde2645..f0d1553 100644 --- a/gcc/gthr-posix95.h +++ b/gcc/gthr-posix95.h @@ -1,6 +1,6 @@ /* Threads compatibility routines for libgcc2 and libobjc. */ /* Compile this one with gcc. */ -/* Copyright (C) 2004, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. This file is part of GCC. @@ -174,12 +174,81 @@ __gthread_active_p (void) #else /* not SUPPORTS_WEAK */ +/* Similar to Solaris, HP-UX 11 for PA-RISC provides stubs for pthread + 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 + 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. */ + +#if defined(__hppa__) && defined(__hpux__) + +#include <errno.h> + +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; + int result; + + __gthrw_(pthread_mutex_lock) (&__gthread_active_mutex); + if (__gthread_active < 0) + { + result = __gthrw_(pthread_create) (&t, NULL, __gthread_start, NULL); + if (result != ENOSYS) + { + __gthread_active = 1; + if (!result) + __gthrw_(pthread_join) (t, NULL); + } + else + __gthread_active = 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; + + /* 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 (); + __gthread_active_latest_value = __gthread_active; + } + + return __gthread_active_latest_value != 0; +} + +#else /* not hppa-hpux */ + static inline int __gthread_active_p (void) { return 1; } +#endif /* hppa-hpux */ + #endif /* SUPPORTS_WEAK */ #ifdef _LIBOBJC |