comparison src/share/vm/runtime/safepoint.cpp @ 979:87770dcf831b

6876794: 4/4 sp07t002 hangs very intermittently Summary: remove over locking by VMThread on "is thread suspended?" check Reviewed-by: dholmes, acorn, andrew
author dcubed
date Tue, 22 Sep 2009 21:12:37 -0600
parents df6caf649ff7
children 528d98fe1037
comparison
equal deleted inserted replaced
978:d72ba3205918 979:87770dcf831b
767 767
768 // Check for a thread that is suspended. Note that thread resume tries 768 // Check for a thread that is suspended. Note that thread resume tries
769 // to grab the Threads_lock which we own here, so a thread cannot be 769 // to grab the Threads_lock which we own here, so a thread cannot be
770 // resumed during safepoint synchronization. 770 // resumed during safepoint synchronization.
771 771
772 // We check with locking because another thread that has not yet 772 // We check to see if this thread is suspended without locking to
773 // synchronized may be trying to suspend this one. 773 // avoid deadlocking with a third thread that is waiting for this
774 bool is_suspended = _thread->is_any_suspended_with_lock(); 774 // thread to be suspended. The third thread can notice the safepoint
775 // that we're trying to start at the beginning of its SR_lock->wait()
776 // call. If that happens, then the third thread will block on the
777 // safepoint while still holding the underlying SR_lock. We won't be
778 // able to get the SR_lock and we'll deadlock.
779 //
780 // We don't need to grab the SR_lock here for two reasons:
781 // 1) The suspend flags are both volatile and are set with an
782 // Atomic::cmpxchg() call so we should see the suspended
783 // state right away.
784 // 2) We're being called from the safepoint polling loop; if
785 // we don't see the suspended state on this iteration, then
786 // we'll come around again.
787 //
788 bool is_suspended = _thread->is_ext_suspended();
775 if (is_suspended) { 789 if (is_suspended) {
776 roll_forward(_at_safepoint); 790 roll_forward(_at_safepoint);
777 return; 791 return;
778 } 792 }
779 793