8013129: Possible deadlock with Metaspace locks due to mixed usage of safepoint aware and non-safepoint aware locking
Summary: Change Metaspace::deallocate to take lock with _no_safepoint_check_flag
Reviewed-by: coleenp, jmasa, dholmes
--- a/hotspot/src/share/vm/memory/metaspace.cpp Mon Apr 29 09:31:59 2013 +0200
+++ b/hotspot/src/share/vm/memory/metaspace.cpp Mon Apr 29 13:07:27 2013 +0200
@@ -2945,7 +2945,7 @@
if (SafepointSynchronize::is_at_safepoint()) {
assert(Thread::current()->is_VM_thread(), "should be the VM thread");
// Don't take Heap_lock
- MutexLocker ml(vsm()->lock());
+ MutexLockerEx ml(vsm()->lock(), Mutex::_no_safepoint_check_flag);
if (word_size < TreeChunk<Metablock, FreeList>::min_size()) {
// Dark matter. Too small for dictionary.
#ifdef ASSERT
@@ -2959,7 +2959,7 @@
vsm()->deallocate(ptr, word_size);
}
} else {
- MutexLocker ml(vsm()->lock());
+ MutexLockerEx ml(vsm()->lock(), Mutex::_no_safepoint_check_flag);
if (word_size < TreeChunk<Metablock, FreeList>::min_size()) {
// Dark matter. Too small for dictionary.