Supporting pthreads in libjava on Tru64 UNIX

Rainer Orth ro@TechFak.Uni-Bielefeld.DE
Fri Jul 4 17:20:00 GMT 2003


I've been working to support --enable-threads=posix on Tru64 UNIX.  To
support gthr.h clients (like libstdc++-v3 or libobjc), I could dust off an
old patch of mine (to be posted separately), but libjava proves to be more
tricky:

While compilation went fine (apart from a compile failure on V4.0F, already
fixed), test results were horrible.  I got many additional execution
failures, like this:

V4.0F:

Stack overflow: pid 17865, proc calls, addr 0x140129d18, pc 0x30000e2814c

or (V5.1):

Yellow Zone stack overflow, thread 2

To make things worse, especially V5.1 behaviour was completely erratic:
some tests work fine most of the time when run manually, but fail once in a
while, while others work most of the time.  Investigating some tests under
gdb let them pass.

After some poking around, I found that boehm-gc is the culprit: if one
disables GC with GC_DONT_GC=1 in the environment, the tests run fine.

Looking into boehm-gc in the gcc tree, I found that (although some Tru64
UNIX pthread support was present) it is not currently enabled.  I worked on
this for some time until I got the thing to compile, but gctest hangs in a
tight loop.  So I choose to look for the latest release version and found
that gc6.2 has just been released a few days ago and already contains Tru64
UNIX pthread support.

It looks like now is a good time to import that into our tree.  Any takers
or suggestions for this?

While compiling and testing gc6.2 with cc worked fine, I ran into a few
problems when trying gcc:

* Initially compilation failed due to redefinitions of pthread_create and
  friends.  It turns out that <pthread.h> doesn't detect that recent
  versions of gcc support #pragma extern_prefix and resort to macro games.
  The patch below uses the underlying (mangled) names when it detects that
  this is the case.  When pthread_support.c #undefs its wrappers, we must
  reinstantiate the mangled names instead.  The proper solution is to
  fixinclude the header to avoid this.  This is stuff for a separate patch.

* The __GNUC__ GC_test_and_set definition in include/private/gc_locks.h
  doesn't compile on Tru64 UNIX since that (ECOFF) platform doesn't support
  the (ELF) .section and .previous directives.  Wrapping them in __ELF__
  allows the stuff to compile.

Unfortunately, this isn't right since now gctest hangs in a tight loop in
GC_test_and_set.  I have no idea how to fix this (or why those section
changing games are necessary in the first place).  Any advice how to
proceed? 

	Rainer

-----------------------------------------------------------------------------
Rainer Orth, Faculty of Technology, Bielefeld University


===================================================================
RCS file: include/RCS/gc_pthread_redirects.h,v
retrieving revision 1.1
diff -up -r1.1 include/gc_pthread_redirects.h
--- include/gc_pthread_redirects.h	2003/05/29 15:50:10	1.1
+++ include/gc_pthread_redirects.h	2003/07/04 16:07:36
@@ -58,13 +58,20 @@
   int GC_pthread_join(pthread_t thread, void **retval);
   int GC_pthread_detach(pthread_t thread);
 
+#ifdef _PTHREAD_USE_PTDNAM_
 # define pthread_create GC_pthread_create
-#ifndef GC_DARWIN_THREADS
-# define pthread_sigmask GC_pthread_sigmask
-#endif
 # define pthread_join GC_pthread_join
 # define pthread_detach GC_pthread_detach
+#else
+/* Tru64 UNIX <pthread.h> mangles the names of some POSIX thread functions, so
+   use them directly.  */
+# define __pthread_create GC_pthread_create
+# define __pthread_join GC_pthread_join
+# define __pthread_detach GC_pthread_detach
+#endif
+
 #ifndef GC_DARWIN_THREADS
+# define pthread_sigmask GC_pthread_sigmask
 # define dlopen GC_dlopen
 #endif
 
===================================================================
RCS file: include/private/RCS/gc_locks.h,v
retrieving revision 1.1
diff -up -r1.1 include/private/gc_locks.h
--- include/private/gc_locks.h	2003/05/31 00:54:20	1.1
+++ include/private/gc_locks.h	2003/07/04 16:17:31
@@ -182,9 +182,13 @@
                              "       beq %0,3f\n"
                              "       mb\n"
                              "2:\n"
+#       ifdef __ELF__
                              ".section .text2,\"ax\"\n"
+#       endif
                              "3:     br 1b\n"
+#       ifdef __ELF__
                              ".previous"
+#       endif
                              :"=&r" (temp), "=m" (*addr), "=&r" (oldvalue)
                              :"Ir" (1), "m" (*addr)
 			     :"memory");
===================================================================
RCS file: RCS/pthread_support.c,v
retrieving revision 1.1
diff -up -r1.1 pthread_support.c
--- pthread_support.c	2003/06/18 23:10:38	1.1
+++ pthread_support.c	2003/07/04 16:07:55
@@ -139,6 +139,12 @@
 #   endif
 #   undef pthread_join
 #   undef pthread_detach
+#   ifndef _PTHREAD_USE_PTDNAM_
+/* Restore the original mangled names on Tru64 UNIX.  */
+#     define pthread_create __pthread_create
+#     define pthread_join __pthread_join
+#     define pthread_detach __pthread_detach
+#   endif
 #endif
 
 void GC_thr_init();



More information about the Java mailing list