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); |