summaryrefslogtreecommitdiff
path: root/boehm-gc
diff options
context:
space:
mode:
authorljrittle <ljrittle@138bc75d-0d04-0410-961f-82ee72b054a4>2001-10-17 04:55:30 +0000
committerljrittle <ljrittle@138bc75d-0d04-0410-961f-82ee72b054a4>2001-10-17 04:55:30 +0000
commitee0a3768c65ec1287ff0d09e867a8a1e84c49b94 (patch)
tree352d5ed2d7dd52515d3eb3a77cba91882a2f5400 /boehm-gc
parente1ab57f4a8a270efc90083bf6a595a8ca1f3febd (diff)
downloadgcc-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/ChangeLog12
-rw-r--r--boehm-gc/include/gc_pthread_redirects.h4
-rw-r--r--boehm-gc/include/private/gcconfig.h6
-rw-r--r--boehm-gc/linux_threads.c11
-rw-r--r--boehm-gc/tests/test.c2
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;