8013129: Possible deadlock with Metaspace locks due to mixed usage of safepoint aware and non-safepoint aware locking

Change Metaspace::deallocate to take lock with _no_safepoint_check_flag

Reviewed-by: coleenp, jmasa, dholmes
This commit is contained in:
Mikael Gerdin 2013-04-29 13:07:27 +02:00
parent fa84ba4ba9
commit 40531b2009

View File

@ -2945,7 +2945,7 @@ void Metaspace::deallocate(MetaWord* ptr, size_t word_size, bool is_class) {
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 @@ void Metaspace::deallocate(MetaWord* ptr, size_t word_size, bool is_class) {
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.