From fe03f41db8c8a25ca63d36fc9c53c7097007116c Mon Sep 17 00:00:00 2001 From: Aleksey Shipilev Date: Thu, 9 Oct 2014 16:41:28 +0400 Subject: [PATCH] 8059924: com/sun/management/DiagnosticCommandMBean/DcmdMBeanPermissionsTest.java: assert(Universe::verify_in_progress() || !SafepointSynchronize::is_at_safepoint()) failed: invariant Revive the hashcode installation in Verifier Reviewed-by: kamg, lfoltan --- hotspot/src/share/vm/classfile/verifier.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/hotspot/src/share/vm/classfile/verifier.cpp b/hotspot/src/share/vm/classfile/verifier.cpp index 877eebd0e0b..fdf76139752 100644 --- a/hotspot/src/share/vm/classfile/verifier.cpp +++ b/hotspot/src/share/vm/classfile/verifier.cpp @@ -98,6 +98,19 @@ bool Verifier::verify(instanceKlassHandle klass, Verifier::Mode mode, bool shoul HandleMark hm; ResourceMark rm(THREAD); + // Eagerly allocate the identity hash code for a klass. This is a fallout + // from 6320749 and 8059924: hash code generator is not supposed to be called + // during the safepoint, but it allows to sneak the hashcode in during + // verification. Without this eager hashcode generation, we may end up + // installing the hashcode during some other operation, which may be at + // safepoint -- blowing up the checks. It was previously done as the side + // effect (sic!) for external_name(), but instead of doing that, we opt to + // explicitly push the hashcode in here. This is signify the following block + // is IMPORTANT: + if (klass->java_mirror() != NULL) { + klass->java_mirror()->identity_hash(); + } + if (!is_eligible_for_verification(klass, should_verify_class)) { return true; }