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
This commit is contained in:
John David Anglin 2007-09-07 16:54:38 +00:00 committed by John David Anglin
parent 215161e20f
commit f74eeed443
3 changed files with 146 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2007-09-07 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
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.
2007-09-07 Roman Zippel <zippel@linux-m68k.org>
* function.h (struct function): Rename calls_unwind_init

View File

@ -211,12 +211,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

View File

@ -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