comparison src/share/vm/classfile/systemDictionary.cpp @ 1075:a75edfd400ea

6893504: LinkageError for bootstrap duplicate class definitions. Reviewed-by: kamg, xlu
author acorn
date Wed, 11 Nov 2009 15:49:38 -0500
parents 987e948ebbc8
children 1920bd911283
comparison
equal deleted inserted replaced
1068:db0d21039f34 1075:a75edfd400ea
95 95
96 bool SystemDictionary::is_parallelCapable(Handle class_loader) { 96 bool SystemDictionary::is_parallelCapable(Handle class_loader) {
97 if (UnsyncloadClass || class_loader.is_null()) return true; 97 if (UnsyncloadClass || class_loader.is_null()) return true;
98 if (AlwaysLockClassLoader) return false; 98 if (AlwaysLockClassLoader) return false;
99 return java_lang_Class::parallelCapable(class_loader()); 99 return java_lang_Class::parallelCapable(class_loader());
100 }
101 // ----------------------------------------------------------------------------
102 // ParallelDefineClass flag does not apply to bootclass loader
103 bool SystemDictionary::is_parallelDefine(Handle class_loader) {
104 if (class_loader.is_null()) return false;
105 if (AllowParallelDefineClass && java_lang_Class::parallelCapable(class_loader())) {
106 return true;
107 }
108 return false;
100 } 109 }
101 // ---------------------------------------------------------------------------- 110 // ----------------------------------------------------------------------------
102 // Resolving of classes 111 // Resolving of classes
103 112
104 // Forwards to resolve_or_null 113 // Forwards to resolve_or_null
722 if (!class_has_been_loaded) { 731 if (!class_has_been_loaded) {
723 732
724 // Do actual loading 733 // Do actual loading
725 k = load_instance_class(name, class_loader, THREAD); 734 k = load_instance_class(name, class_loader, THREAD);
726 735
727 // For UnsyncloadClass and AllowParallelDefineClass only: 736 // For UnsyncloadClass only
728 // If they got a linkageError, check if a parallel class load succeeded. 737 // If they got a linkageError, check if a parallel class load succeeded.
729 // If it did, then for bytecode resolution the specification requires 738 // If it did, then for bytecode resolution the specification requires
730 // that we return the same result we did for the other thread, i.e. the 739 // that we return the same result we did for the other thread, i.e. the
731 // successfully loaded instanceKlass 740 // successfully loaded instanceKlass
732 // Should not get here for classloaders that support parallelism 741 // Should not get here for classloaders that support parallelism
733 // with the new cleaner mechanism 742 // with the new cleaner mechanism, even with AllowParallelDefineClass
734 // Bootstrap goes through here to allow for an extra guarantee check 743 // Bootstrap goes through here to allow for an extra guarantee check
735 if (UnsyncloadClass || (class_loader.is_null())) { 744 if (UnsyncloadClass || (class_loader.is_null())) {
736 if (k.is_null() && HAS_PENDING_EXCEPTION 745 if (k.is_null() && HAS_PENDING_EXCEPTION
737 && PENDING_EXCEPTION->is_a(SystemDictionary::linkageError_klass())) { 746 && PENDING_EXCEPTION->is_a(SystemDictionary::linkageError_klass())) {
738 MutexLocker mu(SystemDictionary_lock, THREAD); 747 MutexLocker mu(SystemDictionary_lock, THREAD);
1481 1490
1482 } 1491 }
1483 } 1492 }
1484 1493
1485 // Support parallel classloading 1494 // Support parallel classloading
1486 // Initial implementation for bootstrap classloader 1495 // All parallel class loaders, including bootstrap classloader
1487 // For custom class loaders that support parallel classloading, 1496 // lock a placeholder entry for this class/class_loader pair
1497 // to allow parallel defines of different classes for this class loader
1488 // With AllowParallelDefine flag==true, in case they do not synchronize around 1498 // With AllowParallelDefine flag==true, in case they do not synchronize around
1489 // FindLoadedClass/DefineClass, calls, we check for parallel 1499 // FindLoadedClass/DefineClass, calls, we check for parallel
1490 // loading for them, wait if a defineClass is in progress 1500 // loading for them, wait if a defineClass is in progress
1491 // and return the initial requestor's results 1501 // and return the initial requestor's results
1502 // This flag does not apply to the bootstrap classloader.
1492 // With AllowParallelDefine flag==false, call through to define_instance_class 1503 // With AllowParallelDefine flag==false, call through to define_instance_class
1493 // which will throw LinkageError: duplicate class definition. 1504 // which will throw LinkageError: duplicate class definition.
1505 // False is the requested default.
1494 // For better performance, the class loaders should synchronize 1506 // For better performance, the class loaders should synchronize
1495 // findClass(), i.e. FindLoadedClass/DefineClassIfAbsent or they 1507 // findClass(), i.e. FindLoadedClass/DefineClassIfAbsent or they
1496 // potentially waste time reading and parsing the bytestream. 1508 // potentially waste time reading and parsing the bytestream.
1497 // Note: VM callers should ensure consistency of k/class_name,class_loader 1509 // Note: VM callers should ensure consistency of k/class_name,class_loader
1498 instanceKlassHandle SystemDictionary::find_or_define_instance_class(symbolHandle class_name, Handle class_loader, instanceKlassHandle k, TRAPS) { 1510 instanceKlassHandle SystemDictionary::find_or_define_instance_class(symbolHandle class_name, Handle class_loader, instanceKlassHandle k, TRAPS) {
1509 PlaceholderEntry* probe; 1521 PlaceholderEntry* probe;
1510 1522
1511 { 1523 {
1512 MutexLocker mu(SystemDictionary_lock, THREAD); 1524 MutexLocker mu(SystemDictionary_lock, THREAD);
1513 // First check if class already defined 1525 // First check if class already defined
1514 klassOop check = find_class(d_index, d_hash, name_h, class_loader); 1526 if (UnsyncloadClass || (is_parallelDefine(class_loader))) {
1515 if (check != NULL) { 1527 klassOop check = find_class(d_index, d_hash, name_h, class_loader);
1516 return(instanceKlassHandle(THREAD, check)); 1528 if (check != NULL) {
1529 return(instanceKlassHandle(THREAD, check));
1530 }
1517 } 1531 }
1518 1532
1519 // Acquire define token for this class/classloader 1533 // Acquire define token for this class/classloader
1520 symbolHandle nullsymbolHandle; 1534 symbolHandle nullsymbolHandle;
1521 probe = placeholders()->find_and_add(p_index, p_hash, name_h, class_loader, PlaceholderTable::DEFINE_CLASS, nullsymbolHandle, THREAD); 1535 probe = placeholders()->find_and_add(p_index, p_hash, name_h, class_loader, PlaceholderTable::DEFINE_CLASS, nullsymbolHandle, THREAD);
1527 SystemDictionary_lock->wait(); 1541 SystemDictionary_lock->wait();
1528 } 1542 }
1529 // Only special cases allow parallel defines and can use other thread's results 1543 // Only special cases allow parallel defines and can use other thread's results
1530 // Other cases fall through, and may run into duplicate defines 1544 // Other cases fall through, and may run into duplicate defines
1531 // caught by finding an entry in the SystemDictionary 1545 // caught by finding an entry in the SystemDictionary
1532 if ((UnsyncloadClass || AllowParallelDefineClass) && (probe->instanceKlass() != NULL)) { 1546 if ((UnsyncloadClass || is_parallelDefine(class_loader)) && (probe->instanceKlass() != NULL)) {
1533 probe->remove_seen_thread(THREAD, PlaceholderTable::DEFINE_CLASS); 1547 probe->remove_seen_thread(THREAD, PlaceholderTable::DEFINE_CLASS);
1534 placeholders()->find_and_remove(p_index, p_hash, name_h, class_loader, THREAD); 1548 placeholders()->find_and_remove(p_index, p_hash, name_h, class_loader, THREAD);
1535 SystemDictionary_lock->notify_all(); 1549 SystemDictionary_lock->notify_all();
1536 #ifdef ASSERT 1550 #ifdef ASSERT
1537 klassOop check = find_class(d_index, d_hash, name_h, class_loader); 1551 klassOop check = find_class(d_index, d_hash, name_h, class_loader);