diff options
author | ljrittle <ljrittle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-10-17 04:55:30 +0000 |
---|---|---|
committer | ljrittle <ljrittle@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-10-17 04:55:30 +0000 |
commit | ee0a3768c65ec1287ff0d09e867a8a1e84c49b94 (patch) | |
tree | 352d5ed2d7dd52515d3eb3a77cba91882a2f5400 /boehm-gc | |
parent | e1ab57f4a8a270efc90083bf6a595a8ca1f3febd (diff) | |
download | gcc-ee0a3768c65ec1287ff0d09e867a8a1e84c49b94.tar.gz |
* include/gc_pthread_redirects.h: Generalize test to use GC_PTHREADS.
* linux_threads.c (WRAP_FUNC(pthread_join)): Conditionalized on
GC_FREEBSD_THREADS, handle strange interaction between system
pthread implementation and boehm-gc signal-handler architecture.
* tests/test.c (main): Conditionalized on GC_FREEBSD_THREADS,
set stack.
* include/private/gcconfig.h (configuration keyed off FREEBSD):
Define SIG_SUSPEND, SIG_THR_RESTART. Do not define
MPROTECT_VDB when GC_FREEBSD_THREADS is defined.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46307 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'boehm-gc')
-rw-r--r-- | boehm-gc/ChangeLog | 12 | ||||
-rw-r--r-- | boehm-gc/include/gc_pthread_redirects.h | 4 | ||||
-rw-r--r-- | boehm-gc/include/private/gcconfig.h | 6 | ||||
-rw-r--r-- | boehm-gc/linux_threads.c | 11 | ||||
-rw-r--r-- | boehm-gc/tests/test.c | 2 |
5 files changed, 30 insertions, 5 deletions
diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog index ff94d2b7db1..58c5f39071e 100644 --- a/boehm-gc/ChangeLog +++ b/boehm-gc/ChangeLog @@ -1,5 +1,17 @@ 2001-10-16 Loren J. Rittle <ljrittle@acm.org> + * include/gc_pthread_redirects.h: Generalize test to use GC_PTHREADS. + * linux_threads.c (WRAP_FUNC(pthread_join)): Conditionalized on + GC_FREEBSD_THREADS, handle strange interaction between system + pthread implementation and boehm-gc signal-handler architecture. + * tests/test.c (main): Conditionalized on GC_FREEBSD_THREADS, + set stack. + * include/private/gcconfig.h (configuration keyed off FREEBSD): + Define SIG_SUSPEND, SIG_THR_RESTART. Do not define + MPROTECT_VDB when GC_FREEBSD_THREADS is defined. + +2001-10-16 Loren J. Rittle <ljrittle@acm.org> + * Makefile.am (test.o): Find tests/test.c in $(srcdir). * Makefile.in: Rebuilt. diff --git a/boehm-gc/include/gc_pthread_redirects.h b/boehm-gc/include/gc_pthread_redirects.h index ac254a86726..47284fbc97a 100644 --- a/boehm-gc/include/gc_pthread_redirects.h +++ b/boehm-gc/include/gc_pthread_redirects.h @@ -44,9 +44,7 @@ #endif /* SOLARIS_THREADS || SOLARIS_PTHREADS */ -#if !defined(GC_USE_LD_WRAP) && \ - (defined(GC_IRIX_THREADS) || defined(GC_LINUX_THREADS) \ - || defined(GC_HPUX_THREADS) || defined(GC_OSF1_THREADS)) +#if !defined(GC_USE_LD_WRAP) && defined(GC_PTHREADS) && !defined(GC_SOLARIS_PTHREADS) /* We treat these similarly. */ # include <pthread.h> # include <signal.h> diff --git a/boehm-gc/include/private/gcconfig.h b/boehm-gc/include/private/gcconfig.h index e92f2a4eb0c..4334dbd29e4 100644 --- a/boehm-gc/include/private/gcconfig.h +++ b/boehm-gc/include/private/gcconfig.h @@ -1017,7 +1017,11 @@ # endif # ifdef FREEBSD # define OS_TYPE "FREEBSD" -# define MPROTECT_VDB +# ifndef GC_FREEBSD_THREADS +# define MPROTECT_VDB +# endif +# define SIG_SUSPEND SIGUSR1 +# define SIG_THR_RESTART SIGUSR2 # define FREEBSD_STACKBOTTOM # ifdef __ELF__ # define DYNAMIC_LOADING diff --git a/boehm-gc/linux_threads.c b/boehm-gc/linux_threads.c index f52eab8c124..ccd7dc65a74 100644 --- a/boehm-gc/linux_threads.c +++ b/boehm-gc/linux_threads.c @@ -1272,6 +1272,17 @@ int WRAP_FUNC(pthread_join)(pthread_t thread, void **retval) /* cant have been recycled by pthreads. */ UNLOCK(); result = REAL_FUNC(pthread_join)(thread, retval); +# if defined (GC_FREEBSD_THREADS) + /* On FreeBSD, the wrapped pthread_join() sometimes returns (what + appears to be) a spurious EINTR which caused the test and real code + to gratuitously fail. Having looked at system pthread library source + code, I see how this return code may be generated. In one path of + code, pthread_join() just returns the errno setting of the thread + being joined. This does not match the POSIX specification or the + local man pages thus I have taken the liberty to catch this one + spurious return value properly conditionalized on GC_FREEBSD_THREADS. */ + if (result == EINTR) result = 0; +# endif if (result == 0) { LOCK(); /* Here the pthread thread id may have been recycled. */ diff --git a/boehm-gc/tests/test.c b/boehm-gc/tests/test.c index 35cb1357883..e8cc9763f44 100644 --- a/boehm-gc/tests/test.c +++ b/boehm-gc/tests/test.c @@ -1624,7 +1624,7 @@ main() } # endif /* GC_HPUX_THREADS */ pthread_attr_init(&attr); -# if defined(GC_IRIX_THREADS) +# if defined(GC_IRIX_THREADS) || defined(GC_FREEBSD_THREADS) pthread_attr_setstacksize(&attr, 1000000); # endif n_tests = 0; |