Fri, 24 May 2013 17:36:12 -0700
8013945: CMS fatal error: must own lock MemberNameTable_lock
Summary: The "delete mnt" needs to grab MemberNameTable_lock if !SafepointSynchronize::is_at_safepoint()
Reviewed-by: sla, mgerdin, dholmes, jmasa
Contributed-by: serguei.spitsyn@oracle.com
src/share/vm/oops/instanceKlass.cpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/oops/instanceKlass.cpp Fri May 24 10:21:12 2013 -0700 1.2 +++ b/src/share/vm/oops/instanceKlass.cpp Fri May 24 17:36:12 2013 -0700 1.3 @@ -2320,10 +2320,15 @@ 1.4 FreeHeap(jmeths); 1.5 } 1.6 1.7 - MemberNameTable* mnt = member_names(); 1.8 - if (mnt != NULL) { 1.9 - delete mnt; 1.10 - set_member_names(NULL); 1.11 + // Deallocate MemberNameTable 1.12 + { 1.13 + Mutex* lock_or_null = SafepointSynchronize::is_at_safepoint() ? NULL : MemberNameTable_lock; 1.14 + MutexLockerEx ml(lock_or_null, Mutex::_no_safepoint_check_flag); 1.15 + MemberNameTable* mnt = member_names(); 1.16 + if (mnt != NULL) { 1.17 + delete mnt; 1.18 + set_member_names(NULL); 1.19 + } 1.20 } 1.21 1.22 int* indices = methods_cached_itable_indices_acquire();