comparison src/share/vm/classfile/javaClasses.cpp @ 514:c81d2ef51ca3

4670071: loadClassInternal is too restrictive. Summary: VM support for deadlock fix. Library fix in 4735126. See API proposal. Reviewed-by: dholmes, blacklion
author acorn
date Mon, 05 Jan 2009 13:44:03 -0500
parents 2328d1d3f8cf
children 0fbdb4381b99
comparison
equal deleted inserted replaced
513:2328d1d3f8cf 514:c81d2ef51ca3
439 return mirror; 439 return mirror;
440 } 440 }
441 441
442 bool java_lang_Class::offsets_computed = false; 442 bool java_lang_Class::offsets_computed = false;
443 int java_lang_Class::classRedefinedCount_offset = -1; 443 int java_lang_Class::classRedefinedCount_offset = -1;
444 int java_lang_Class::parallelCapable_offset = -1;
444 445
445 void java_lang_Class::compute_offsets() { 446 void java_lang_Class::compute_offsets() {
446 assert(!offsets_computed, "offsets should be initialized only once"); 447 assert(!offsets_computed, "offsets should be initialized only once");
447 offsets_computed = true; 448 offsets_computed = true;
448 449
449 klassOop k = SystemDictionary::class_klass(); 450 klassOop k = SystemDictionary::class_klass();
450 // The classRedefinedCount field is only present starting in 1.5, 451 // The classRedefinedCount field is only present starting in 1.5,
451 // so don't go fatal. 452 // so don't go fatal.
452 compute_optional_offset(classRedefinedCount_offset, 453 compute_optional_offset(classRedefinedCount_offset,
453 k, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature()); 454 k, vmSymbols::classRedefinedCount_name(), vmSymbols::int_signature());
455
456 // The field indicating parallelCapable (parallelLockMap) is only present starting in 7,
457 klassOop k1 = SystemDictionary::classloader_klass();
458 compute_optional_offset(parallelCapable_offset,
459 k1, vmSymbols::parallelCapable_name(), vmSymbols::concurrenthashmap_signature());
460 }
461
462 // For class loader classes, parallelCapable defined
463 // based on non-null field
464 // Written to by java.lang.ClassLoader, vm only reads this field, doesn't set it
465 bool java_lang_Class::parallelCapable(oop class_loader) {
466 if (!JDK_Version::is_gte_jdk17x_version()
467 || parallelCapable_offset == -1) {
468 // Default for backward compatibility is false
469 return false;
470 }
471 return (class_loader->obj_field(parallelCapable_offset) != NULL);
454 } 472 }
455 473
456 int java_lang_Class::classRedefinedCount(oop the_class_mirror) { 474 int java_lang_Class::classRedefinedCount(oop the_class_mirror) {
457 if (!JDK_Version::is_gte_jdk15x_version() 475 if (!JDK_Version::is_gte_jdk15x_version()
458 || classRedefinedCount_offset == -1) { 476 || classRedefinedCount_offset == -1) {