src/share/vm/memory/metaspace.cpp

Print this page
rev 4526 : 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:

*** 2943,2953 **** 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()); if (word_size < TreeChunk<Metablock, FreeList>::min_size()) { // Dark matter. Too small for dictionary. #ifdef ASSERT Copy::fill_to_words((HeapWord*)ptr, word_size, 0xf5f5f5f5); #endif --- 2943,2953 ---- 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 ! 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 Copy::fill_to_words((HeapWord*)ptr, word_size, 0xf5f5f5f5); #endif
*** 2957,2967 **** class_vsm()->deallocate(ptr, word_size); } else { vsm()->deallocate(ptr, word_size); } } else { ! MutexLocker ml(vsm()->lock()); if (word_size < TreeChunk<Metablock, FreeList>::min_size()) { // Dark matter. Too small for dictionary. #ifdef ASSERT Copy::fill_to_words((HeapWord*)ptr, word_size, 0xf5f5f5f5); --- 2957,2967 ---- class_vsm()->deallocate(ptr, word_size); } else { vsm()->deallocate(ptr, word_size); } } else { ! 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 Copy::fill_to_words((HeapWord*)ptr, word_size, 0xf5f5f5f5);