Commit 8c157f90 by John David Anglin Committed by John David Anglin

re PR boehm-gc/34544 (pthread_default_stacksize_np failed.)

	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.

From-SVN: r163461
parent 11aa2577
2010-08-22 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
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.
2010-08-22 Joseph Myers <joseph@codesourcery.com> 2010-08-22 Joseph Myers <joseph@codesourcery.com>
* Makefile.in (gccspec.o, cppspec.o): Update dependencies. * Makefile.in (gccspec.o, cppspec.o): Update dependencies.
......
...@@ -1106,6 +1106,7 @@ hppa[12]*-*-hpux11*) ...@@ -1106,6 +1106,7 @@ hppa[12]*-*-hpux11*)
else else
tmake_file="$tmake_file pa/t-slibgcc-dwarf-ver" tmake_file="$tmake_file pa/t-slibgcc-dwarf-ver"
fi fi
extra_parts="libgcc_stub.a"
case x${enable_threads} in case x${enable_threads} in
x | xyes | xposix ) x | xyes | xposix )
thread_file=posix thread_file=posix
......
...@@ -121,11 +121,16 @@ along with GCC; see the file COPYING3. If not see ...@@ -121,11 +121,16 @@ along with GCC; see the file COPYING3. If not see
#undef LIB_SPEC #undef LIB_SPEC
#define LIB_SPEC \ #define LIB_SPEC \
"%{!shared:\ "%{!shared:\
%{static|mt|pthread:%{fopenmp:%{static:-a archive_shared} -lrt\ %{fopenmp:%{static:-a archive_shared} -lrt %{static:-a archive}}\
%{static:-a archive}} -lpthread} -lc\ %{mt|pthread:-lpthread} -lc\
%{static:%{!nolibdld:-a archive_shared -ldld -a archive -lc}}}\ %{static:%{!nolibdld:-a archive_shared -ldld -a archive -lc}}}\
%{shared:%{mt|pthread:-lpthread}}" %{shared:%{mt|pthread:-lpthread}}"
/* The libgcc_stub.a library needs to come last. */
#undef LINK_GCC_C_SEQUENCE_SPEC
#define LINK_GCC_C_SEQUENCE_SPEC \
"%G %L %G %{!nostdlib:%{!nodefaultlibs:%{!shared:-lgcc_stub}}}"
#undef STARTFILE_SPEC #undef STARTFILE_SPEC
#define STARTFILE_SPEC \ #define STARTFILE_SPEC \
"%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}} \ "%{!shared:%{pg:gcrt0%O%s}%{!pg:%{p:mcrt0%O%s}%{!p:crt0%O%s}} \
......
...@@ -59,35 +59,35 @@ along with GCC; see the file COPYING3. If not see ...@@ -59,35 +59,35 @@ along with GCC; see the file COPYING3. If not see
#if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_GNU_LD) #if ((TARGET_DEFAULT | TARGET_CPU_DEFAULT) & MASK_GNU_LD)
#define LIB_SPEC \ #define LIB_SPEC \
"%{!shared:\ "%{!shared:\
%{!p:%{!pg:%{static|mt|pthread:%{fopenmp:%{static:-a shared} -lrt\ %{!p:%{!pg:%{fopenmp:%{static:-a shared} -lrt %{static:-a archive}}\
%{static:-a archive}} -lpthread} -lc\ %{mt|pthread:-lpthread} -lc\
%{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\ %{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\
%{p:%{!pg:%{static:%{!mhp-ld:-a shared}%{mhp-ld:-a archive_shared}}\ %{p:%{!pg:%{static:%{!mhp-ld:-a shared}%{mhp-ld:-a archive_shared}}\
-lprof %{static:-a archive}\ -lprof %{static:-a archive}\
%{static|mt|pthread:%{fopenmp:%{static:-a shared} -lrt\ %{fopenmp:%{static:-a shared} -lrt %{static:-a archive}}\
%{static:-a archive}} -lpthread} -lc\ %{mt|pthread:-lpthread} -lc\
%{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\ %{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\
%{pg:%{static:%{!mhp-ld:-a shared}%{mhp-ld:-a archive_shared}}\ %{pg:%{static:%{!mhp-ld:-a shared}%{mhp-ld:-a archive_shared}}\
-lgprof %{static:-a archive}\ -lgprof %{static:-a archive}\
%{static|mt|pthread:%{fopenmp:%{static:-a shared} -lrt\ %{fopenmp:%{static:-a shared} -lrt %{static:-a archive}}\
%{static:-a archive}} -lpthread} -lc\ %{mt|pthread:-lpthread} -lc\
%{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\ %{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\
%{shared:%{mt|pthread:-lpthread}}" %{shared:%{mt|pthread:-lpthread}}"
#else #else
#define LIB_SPEC \ #define LIB_SPEC \
"%{!shared:\ "%{!shared:\
%{!p:%{!pg:%{static|mt|pthread:%{fopenmp:%{static:-a shared} -lrt\ %{!p:%{!pg:%{fopenmp:%{static:-a shared} -lrt %{static:-a archive}}\
%{static:-a archive}} -lpthread} -lc\ %{mt|pthread:-lpthread} -lc\
%{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\ %{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\
%{p:%{!pg:%{static:%{mgnu-ld:-a shared}%{!mgnu-ld:-a archive_shared}}\ %{p:%{!pg:%{static:%{mgnu-ld:-a shared}%{!mgnu-ld:-a archive_shared}}\
-lprof %{static:-a archive}\ -lprof %{static:-a archive}\
%{static|mt|pthread:%{fopenmp:%{static:-a shared} -lrt\ %{fopenmp:%{static:-a shared} -lrt %{static:-a archive}}\
%{static:-a archive}} -lpthread} -lc\ %{mt|pthread:-lpthread} -lc\
%{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\ %{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\
%{pg:%{static:%{mgnu-ld:-a shared}%{!mgnu-ld:-a archive_shared}}\ %{pg:%{static:%{mgnu-ld:-a shared}%{!mgnu-ld:-a archive_shared}}\
-lgprof %{static:-a archive}\ -lgprof %{static:-a archive}\
%{static|mt|pthread:%{fopenmp:%{static:-a shared} -lrt\ %{fopenmp:%{static:-a shared} -lrt %{static:-a archive}}\
%{static:-a archive}} -lpthread} -lc\ %{mt|pthread:-lpthread} -lc\
%{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\ %{static:%{!nolibdld:-a shared -ldld -a archive -lc}}}}\
%{shared:%{mt|pthread:-lpthread}}" %{shared:%{mt|pthread:-lpthread}}"
#endif #endif
......
/* Stub functions. /* Stub functions.
Copyright (C) 2006, 2009 Free Software Foundation, Inc. Copyright (C) 2006, 2009, 2010 Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
...@@ -56,3 +56,33 @@ _Jv_RegisterClasses (void *p) ...@@ -56,3 +56,33 @@ _Jv_RegisterClasses (void *p)
{ {
} }
#endif #endif
#ifdef L_pthread_default_stacksize_np
int pthread_default_stacksize_np (unsigned long __attribute__((unused)),
unsigned long *);
int
pthread_default_stacksize_np (unsigned long new, unsigned long *old)
{
if (old)
*old = 0;
return 0;
}
#endif
#ifdef L_pthread_mutex_lock
int pthread_mutex_lock (void * __attribute__((unused)));
int
pthread_mutex_lock (void *p)
{
return 0;
}
#endif
#ifdef L_pthread_mutex_unlock
int pthread_mutex_unlock (void * __attribute__((unused)));
int
pthread_mutex_unlock (void *p)
{
return 0;
}
#endif
TARGET_LIBGCC2_CFLAGS = -fPIC -frandom-seed=fixed-seed TARGET_LIBGCC2_CFLAGS = -fPIC -frandom-seed=fixed-seed
LIB2FUNCS_EXTRA=lib2funcs.asm quadlib.c LIB2FUNCS_EXTRA=lib2funcs.asm quadlib.c
LIBGCCSTUB_OBJS = pthread_default_stacksize_np-stub.o \
pthread_mutex_lock-stub.o \
pthread_mutex_unlock-stub.o
stublib.c: $(srcdir)/config/pa/stublib.c
rm -f stublib.c
cp $(srcdir)/config/pa/stublib.c .
pthread_default_stacksize_np-stub.o: stublib.c $(GCC_PASSES)
$(GCC_FOR_TARGET) -c -O2 -DL_pthread_default_stacksize_np stublib.c \
-o pthread_default_stacksize_np-stub.o
pthread_mutex_lock-stub.o: stublib.c $(GCC_PASSES)
$(GCC_FOR_TARGET) -c -O2 -DL_pthread_mutex_lock stublib.c \
-o pthread_mutex_lock-stub.o
pthread_mutex_unlock-stub.o: stublib.c $(GCC_PASSES)
$(GCC_FOR_TARGET) -c -O2 -DL_pthread_mutex_unlock stublib.c \
-o pthread_mutex_unlock-stub.o
$(T)libgcc_stub.a: $(LIBGCCSTUB_OBJS)
-rm -rf $(T)libgcc_stub.a
$(AR) rc $(T)libgcc_stub.a $(LIBGCCSTUB_OBJS)
$(RANLIB) $(T)libgcc_stub.a
# Copyright (C) 2000, 2001, 2002, 2004, 2006, # Copyright (C) 2000, 2001, 2002, 2004, 2006,
# 2007 Free Software Foundation, Inc. # 2007, 2010 Free Software Foundation, Inc.
# #
# This file is part of GCC. # This file is part of GCC.
# #
...@@ -19,7 +19,10 @@ ...@@ -19,7 +19,10 @@
TARGET_LIBGCC2_CFLAGS = -fPIC -Dpa64=1 -DELF=1 -mlong-calls TARGET_LIBGCC2_CFLAGS = -fPIC -Dpa64=1 -DELF=1 -mlong-calls
LIB2FUNCS_EXTRA = quadlib.c LIB2FUNCS_EXTRA = quadlib.c
LIBGCCSTUB_OBJS = rfi-stub.o dfi-stub.o jvrc-stub.o cxaf-stub.o LIBGCCSTUB_OBJS = rfi-stub.o dfi-stub.o jvrc-stub.o cxaf-stub.o \
pthread_default_stacksize_np-stub.o \
pthread_mutex_lock-stub.o \
pthread_mutex_unlock-stub.o
stublib.c: $(srcdir)/config/pa/stublib.c stublib.c: $(srcdir)/config/pa/stublib.c
rm -f stublib.c rm -f stublib.c
...@@ -41,6 +44,18 @@ jvrc-stub.o: stublib.c $(GCC_PASSES) ...@@ -41,6 +44,18 @@ jvrc-stub.o: stublib.c $(GCC_PASSES)
$(GCC_FOR_TARGET) -c -O2 -DL_Jv_RegisterClasses stublib.c \ $(GCC_FOR_TARGET) -c -O2 -DL_Jv_RegisterClasses stublib.c \
-o jvrc-stub.o -o jvrc-stub.o
pthread_default_stacksize_np-stub.o: stublib.c $(GCC_PASSES)
$(GCC_FOR_TARGET) -c -O2 -DL_pthread_default_stacksize_np stublib.c \
-o pthread_default_stacksize_np-stub.o
pthread_mutex_lock-stub.o: stublib.c $(GCC_PASSES)
$(GCC_FOR_TARGET) -c -O2 -DL_pthread_mutex_lock stublib.c \
-o pthread_mutex_lock-stub.o
pthread_mutex_unlock-stub.o: stublib.c $(GCC_PASSES)
$(GCC_FOR_TARGET) -c -O2 -DL_pthread_mutex_unlock stublib.c \
-o pthread_mutex_unlock-stub.o
$(T)libgcc_stub.a: $(LIBGCCSTUB_OBJS) $(T)libgcc_stub.a: $(LIBGCCSTUB_OBJS)
-rm -rf $(T)libgcc_stub.a -rm -rf $(T)libgcc_stub.a
$(AR) rc $(T)libgcc_stub.a $(LIBGCCSTUB_OBJS) $(AR) rc $(T)libgcc_stub.a $(LIBGCCSTUB_OBJS)
......
...@@ -260,47 +260,34 @@ __gthread_active_p (void) ...@@ -260,47 +260,34 @@ __gthread_active_p (void)
calls in shared flavors of the HP-UX C library. Most of the stubs 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 have no functionality. The details are described in the "libc cumulative
patch" for each subversion of HP-UX 11. There are two special interfaces 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 library or not. However, these interfaces aren't available in early
libc versions. We also can't use pthread_once as some libc versions libpthread libraries. We also need a test that works for archive
call the init function. So, we use pthread_create to check whether it libraries. We can't use pthread_once as some libc versions call the
is possible to create a thread or not. The stub implementation returns init function. We also can't use pthread_create or pthread_attr_init
the error number ENOSYS. */ 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__) #if defined(__hppa__) && defined(__hpux__)
#include <errno.h>
static volatile int __gthread_active = -1; 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 static inline int
__gthread_active_p (void) __gthread_active_p (void)
{ {
/* Avoid reading __gthread_active twice on the main code path. */ /* Avoid reading __gthread_active twice on the main code path. */
int __gthread_active_latest_value = __gthread_active; 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)) 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; __gthread_active_latest_value = __gthread_active;
} }
......
...@@ -184,47 +184,34 @@ __gthread_active_p (void) ...@@ -184,47 +184,34 @@ __gthread_active_p (void)
calls in shared flavors of the HP-UX C library. Most of the stubs 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 have no functionality. The details are described in the "libc cumulative
patch" for each subversion of HP-UX 11. There are two special interfaces 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 library or not. However, these interfaces aren't available in early
libc versions. We also can't use pthread_once as some libc versions pthread libraries. We also need a test that works for archive
call the init function. So, we use pthread_create to check whether it libraries. We can't use pthread_once as some libc versions call the
is possible to create a thread or not. The stub implementation returns init function. We also can't use pthread_create or pthread_attr_init
the error number ENOSYS. */ 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__) #if defined(__hppa__) && defined(__hpux__)
#include <errno.h>
static volatile int __gthread_active = -1; 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 static inline int
__gthread_active_p (void) __gthread_active_p (void)
{ {
/* Avoid reading __gthread_active twice on the main code path. */ /* Avoid reading __gthread_active twice on the main code path. */
int __gthread_active_latest_value = __gthread_active; 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)) 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; __gthread_active_latest_value = __gthread_active;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment