review request for 6791815

Xiaobin Lu Xiaobin.Lu at Sun.COM
Mon Jan 12 15:44:46 PST 2009


6791815:  Fix for 6471657 can cause deadlock on non-Solaris platforms 
when initializing direct buffer support

Webrev: http://webrev.invokedynamic.info/xiaobin.lu/6791815/webrev/

Details:

When mutiple threads call NewDirectByteBuffer using JNI, deadlock could 
occur when thread A triggers the safepoint and thread B is busy waiting 
for thread A to get finished. However, the current implementation 
transfers thread B's state to be in VM state due to the fact that 
os::yield_all call could result into a os::sleep call on Solaris. The 
side effect of put thread B's state to be in VM state is that the 
VMThread will wait for thread B to finish before putting all Java 
threads to sleep. However, thread B is waiting for thread A to finish 
and thread A is waiting for the VMThread to return. Hence, a deadlock 
occurs.

The fix suggested by Tom is to put the ThreadInVMfromNative statement 
inside the loop so that there is a Window that thread B could change 
back its state to native and as a result, the VMThread could proceed to 
bring all the threads to safepoint. This is based on the fact that 
VMThread doesn't stop threads in native, the state check only occurs 
during the state transition.

I've tried hard to come up a local test to reproduce the problem, but 
without much luck. I have contacted the reporter so that I can give him 
the VM to verify that the problem has been fixed. I am pretty sure it 
has, but just to be safe.

Thanks,
-Xiaobin




More information about the hotspot-dev mailing list