JDK 1.5.0: application crash with multiple threads

Arne H. Juul arnej at pvv.ntnu.no
Wed May 11 02:19:28 PDT 2005

On Fri, Apr 08, 2005 at 10:22:31AM -0400, Brian Clapper wrote:
> I have a multithreaded application that is crashing under JDK 1.5.0 when
> using multiple threads. Works fine (and has worked fine for quite some
> time) with JDK 1.4.2.

I've spent some days tracing down this problem, and found this fix:

diff -ru jdk15.orig/hotspot/src/os/bsd/vm/os_bsd.inline.hpp jdk15/hotspot/src/os/bsd/vm/os_bsd.inline.hpp
--- jdk15.orig/hotspot/src/os/bsd/vm/os_bsd.inline.hpp	Wed May 11 10:59:36 2005
+++ jdk15/hotspot/src/os/bsd/vm/os_bsd.inline.hpp	Wed May 11 08:03:59 2005
@@ -29,10 +29,9 @@

  inline bool os::allocate_stack_guard_pages() {
    assert(uses_stack_guard_pages(), "sanity check");
-// XXXBSD: ??
-//  return thr_main();
-//  return pthread_main_np();
-  return true;
+  // since FreeBSD 4 uses malloc() for allocating the thread stack
+  // there is no need to do anything extra to allocate the guard pages
+  return false;

What happens is this:

When a thread is started the stack is allocated via malloc(),
and then the bottom is the stack is again "allocated" via
commit_memory() and protected via guard_memory().  When the
thread is done it is "freed" via uncommit_memory() which mmaps
the memory with PROT_NONE, and then it is free()d as well.
Soon, when malloc() is used (for something else) it returns
a pointer into this region and when that pointer is used SIGBUS
happens.  The only reason this works in the java14 port is
that uncommit_memory() doesn't do what it is supposed to there.

Arne H Juul                       Mail:  arnej at europe.yahoo-inc.com
Release engineer                  Web:   http://www.yahoo.com/
Yahoo Norway                      Phone: +47 7320 1219
Prinsensgate 49, 7013 Trondheim   Fax:   +47 7320 1201

More information about the freebsd-java mailing list