src/hotspot/share/ci/ciInstanceKlass.cpp
changeset 52311 274ba8fbd96d
parent 51997 9ce37fa2e179
child 52356 19c4a3eec4d7
--- a/src/hotspot/share/ci/ciInstanceKlass.cpp	Mon Oct 29 08:38:59 2018 -0400
+++ b/src/hotspot/share/ci/ciInstanceKlass.cpp	Mon Oct 29 10:21:34 2018 -0400
@@ -57,7 +57,7 @@
   AccessFlags access_flags = ik->access_flags();
   _flags = ciFlags(access_flags);
   _has_finalizer = access_flags.has_finalizer();
-  _has_subklass = ik->subklass() != NULL;
+  _has_subklass = flags().is_final() ? subklass_false : subklass_unknown;
   _init_state = ik->init_state();
   _nonstatic_field_size = ik->nonstatic_field_size();
   _has_nonstatic_fields = ik->has_nonstatic_fields();
@@ -146,9 +146,10 @@
 // ciInstanceKlass::compute_shared_has_subklass
 bool ciInstanceKlass::compute_shared_has_subklass() {
   GUARDED_VM_ENTRY(
+    MutexLocker ml(Compile_lock);
     InstanceKlass* ik = get_instanceKlass();
-    _has_subklass = ik->subklass() != NULL;
-    return _has_subklass;
+    _has_subklass = ik->subklass() != NULL ? subklass_true : subklass_false;
+    return _has_subklass == subklass_true;
   )
 }
 
@@ -374,6 +375,7 @@
   if (!is_abstract())   return NULL; // Only applies to abstract classes.
   if (!has_subklass())  return NULL; // Must have at least one subklass.
   VM_ENTRY_MARK;
+  MutexLocker ml(Compile_lock);
   InstanceKlass* ik = get_instanceKlass();
   Klass* up = ik->up_cast_abstract();
   assert(up->is_instance_klass(), "must be InstanceKlass");
@@ -388,6 +390,7 @@
 bool ciInstanceKlass::has_finalizable_subclass() {
   if (!is_loaded())     return true;
   VM_ENTRY_MARK;
+  MutexLocker ml(Compile_lock);
   return Dependencies::find_finalizable_subclass(get_instanceKlass()) != NULL;
 }
 
@@ -577,7 +580,7 @@
   if (is_shared()) {
     return is_final();  // approximately correct
   } else {
-    return !_has_subklass && (nof_implementors() == 0);
+    return !has_subklass() && (nof_implementors() == 0);
   }
 }