hotspot/src/share/vm/classfile/systemDictionary.cpp
changeset 43948 26f3c55e246e
parent 42876 ff8ff9dcccec
child 46327 91576389a517
equal deleted inserted replaced
43947:a52ee13998f3 43948:26f3c55e246e
  1150 
  1150 
  1151   assert(k.not_null(), "no klass created");
  1151   assert(k.not_null(), "no klass created");
  1152   Symbol* h_name = k->name();
  1152   Symbol* h_name = k->name();
  1153   assert(class_name == NULL || class_name == h_name, "name mismatch");
  1153   assert(class_name == NULL || class_name == h_name, "name mismatch");
  1154 
  1154 
  1155   bool define_succeeded = false;
       
  1156   // Add class just loaded
  1155   // Add class just loaded
  1157   // If a class loader supports parallel classloading handle parallel define requests
  1156   // If a class loader supports parallel classloading handle parallel define requests
  1158   // find_or_define_instance_class may return a different InstanceKlass
  1157   // find_or_define_instance_class may return a different InstanceKlass
  1159   if (is_parallelCapable(class_loader)) {
  1158   if (is_parallelCapable(class_loader)) {
  1160     instanceKlassHandle defined_k = find_or_define_instance_class(h_name, class_loader, k, CHECK_NULL);
  1159     instanceKlassHandle defined_k = find_or_define_instance_class(h_name, class_loader, k, THREAD);
  1161     if (k() == defined_k()) {
  1160     if (!HAS_PENDING_EXCEPTION && defined_k() != k()) {
  1162       // we have won over other concurrent threads (if any) that are
  1161       // If a parallel capable class loader already defined this class, register 'k' for cleanup.
  1163       // competing to define the same class.
  1162       assert(defined_k.not_null(), "Should have a klass if there's no exception");
  1164       define_succeeded = true;
  1163       loader_data->add_to_deallocate_list(k());
  1165     }
  1164       k = defined_k;
  1166     k = defined_k;
  1165     }
  1167   } else {
  1166   } else {
  1168     define_instance_class(k, CHECK_NULL);
  1167     define_instance_class(k, THREAD);
  1169     define_succeeded = true;
  1168   }
       
  1169 
       
  1170   // If defining the class throws an exception register 'k' for cleanup.
       
  1171   if (HAS_PENDING_EXCEPTION) {
       
  1172     assert(k.not_null(), "Must have an instance klass here!");
       
  1173     loader_data->add_to_deallocate_list(k());
       
  1174     return NULL;
  1170   }
  1175   }
  1171 
  1176 
  1172   // Make sure we have an entry in the SystemDictionary on success
  1177   // Make sure we have an entry in the SystemDictionary on success
  1173   debug_only( {
  1178   debug_only( {
  1174     MutexLocker mu(SystemDictionary_lock, THREAD);
  1179     MutexLocker mu(SystemDictionary_lock, THREAD);
  1516     }
  1521     }
  1517 
  1522 
  1518     // find_or_define_instance_class may return a different InstanceKlass
  1523     // find_or_define_instance_class may return a different InstanceKlass
  1519     if (!k.is_null()) {
  1524     if (!k.is_null()) {
  1520       instanceKlassHandle defined_k =
  1525       instanceKlassHandle defined_k =
  1521         find_or_define_instance_class(class_name, class_loader, k, CHECK_(nh));
  1526         find_or_define_instance_class(class_name, class_loader, k, THREAD);
  1522       k = defined_k;
  1527       if (!HAS_PENDING_EXCEPTION && defined_k() != k()) {
       
  1528         // If a parallel capable class loader already defined this class, register 'k' for cleanup.
       
  1529         assert(defined_k.not_null(), "Should have a klass if there's no exception");
       
  1530         loader_data->add_to_deallocate_list(k());
       
  1531         k = defined_k;
       
  1532       } else if (HAS_PENDING_EXCEPTION) {
       
  1533         loader_data->add_to_deallocate_list(k());
       
  1534         return nh;
       
  1535       }
  1523     }
  1536     }
  1524     return k;
  1537     return k;
  1525   } else {
  1538   } else {
  1526     // Use user specified class loader to load class. Call loadClass operation on class_loader.
  1539     // Use user specified class loader to load class. Call loadClass operation on class_loader.
  1527     ResourceMark rm(THREAD);
  1540     ResourceMark rm(THREAD);