Request for reviews (S): 7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed

Christian Thalinger christian.thalinger at
Mon Sep 10 14:18:57 PDT 2012
29 lines changed: 13 ins; 10 del; 6 mod; 2239 unchg

7196242: vm/mlvm/indy/stress/java/loopsAndThreads crashed

The current code in ConstantPoolCacheEntry::set_method_handle_common uses 
a CAS to find out who's the winning thread in the race about linking an 
invokehandle/invokedynamic call site.  The winning thread does the linking 
while the other threads are waiting in a loop until the winning thread 
finishes.  The waiting threads enter the Patching_lock and call os::yield 
to give the winning thread more CPU time.

Unfortunately the implementation of os::yield on Solaris uses the 
Threads_lock and we hit this assert:

#  fatal error: acquiring lock Threads_lock/15 out of order with lock Patching_lock/1 -- possible deadlock

Even worse, the CAS might fail spuriously and we don't have a winning 
thread because we don't loop around the CAS.  This may lead to hangs.


More information about the hotspot-dev mailing list