comparison src/share/vm/oops/instanceKlass.cpp @ 5998:49036505ab5f

7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass. Summary: Change implementor to embedded instanceKlass field. Reviewed-by: sspitsyn, minqi, coleenp
author jiangli
date Thu, 29 Mar 2012 22:18:56 -0400
parents 6522ad563f99
children 8bafad97cd26
comparison
equal deleted inserted replaced
5970:0698f5ef5535 5998:49036505ab5f
565 ObjectLocker ol(this_oop, THREAD); 565 ObjectLocker ol(this_oop, THREAD);
566 this_oop->set_init_state(state); 566 this_oop->set_init_state(state);
567 ol.notify_all(CHECK); 567 ol.notify_all(CHECK);
568 } 568 }
569 569
570 // The embedded _implementor field can only record one implementor.
571 // When there are more than one implementors, the _implementor field
572 // is set to the interface klassOop itself. Following are the possible
573 // values for the _implementor field:
574 // NULL - no implementor
575 // implementor klassOop - one implementor
576 // self - more than one implementor
577 //
578 // The _implementor field only exists for interfaces.
570 void instanceKlass::add_implementor(klassOop k) { 579 void instanceKlass::add_implementor(klassOop k) {
571 assert(Compile_lock->owned_by_self(), ""); 580 assert(Compile_lock->owned_by_self(), "");
581 assert(is_interface(), "not interface");
572 // Filter out my subinterfaces. 582 // Filter out my subinterfaces.
573 // (Note: Interfaces are never on the subklass list.) 583 // (Note: Interfaces are never on the subklass list.)
574 if (instanceKlass::cast(k)->is_interface()) return; 584 if (instanceKlass::cast(k)->is_interface()) return;
575 585
576 // Filter out subclasses whose supers already implement me. 586 // Filter out subclasses whose supers already implement me.
581 // We only need to check one immediate superclass, since the 591 // We only need to check one immediate superclass, since the
582 // implements_interface query looks at transitive_interfaces. 592 // implements_interface query looks at transitive_interfaces.
583 // Any supers of the super have the same (or fewer) transitive_interfaces. 593 // Any supers of the super have the same (or fewer) transitive_interfaces.
584 return; 594 return;
585 595
586 // Update number of implementors 596 klassOop ik = implementor();
587 int i = _nof_implementors++; 597 if (ik == NULL) {
588 598 set_implementor(k);
589 // Record this implementor, if there are not too many already 599 } else if (ik != this->as_klassOop()) {
590 if (i < implementors_limit) { 600 // There is already an implementor. Use itself as an indicator of
591 assert(_implementors[i] == NULL, "should be exactly one implementor"); 601 // more than one implementors.
592 oop_store_without_check((oop*)&_implementors[i], k); 602 set_implementor(this->as_klassOop());
593 } else if (i == implementors_limit) {
594 // clear out the list on first overflow
595 for (int i2 = 0; i2 < implementors_limit; i2++)
596 oop_store_without_check((oop*)&_implementors[i2], NULL);
597 } 603 }
598 604
599 // The implementor also implements the transitive_interfaces 605 // The implementor also implements the transitive_interfaces
600 for (int index = 0; index < local_interfaces()->length(); index++) { 606 for (int index = 0; index < local_interfaces()->length(); index++) {
601 instanceKlass::cast(klassOop(local_interfaces()->obj_at(index)))->add_implementor(k); 607 instanceKlass::cast(klassOop(local_interfaces()->obj_at(index)))->add_implementor(k);
602 } 608 }
603 } 609 }
604 610
605 void instanceKlass::init_implementor() { 611 void instanceKlass::init_implementor() {
606 for (int i = 0; i < implementors_limit; i++) 612 if (is_interface()) {
607 oop_store_without_check((oop*)&_implementors[i], NULL); 613 set_implementor(NULL);
608 _nof_implementors = 0; 614 }
609 } 615 }
610 616
611 617
612 void instanceKlass::process_interfaces(Thread *thread) { 618 void instanceKlass::process_interfaces(Thread *thread) {
613 // link this class into the implementors list of every interface it implements 619 // link this class into the implementors list of every interface it implements
1847 // Subklass and sibling links are handled by Klass::follow_weak_klass_links 1853 // Subklass and sibling links are handled by Klass::follow_weak_klass_links
1848 1854
1849 void instanceKlass::follow_weak_klass_links( 1855 void instanceKlass::follow_weak_klass_links(
1850 BoolObjectClosure* is_alive, OopClosure* keep_alive) { 1856 BoolObjectClosure* is_alive, OopClosure* keep_alive) {
1851 assert(is_alive->do_object_b(as_klassOop()), "this oop should be live"); 1857 assert(is_alive->do_object_b(as_klassOop()), "this oop should be live");
1852 if (ClassUnloading) { 1858
1853 for (int i = 0; i < implementors_limit; i++) { 1859 if (is_interface()) {
1854 klassOop impl = _implementors[i]; 1860 if (ClassUnloading) {
1855 if (impl == NULL) break; // no more in the list 1861 klassOop impl = implementor();
1856 if (!is_alive->do_object_b(impl)) { 1862 if (impl != NULL) {
1857 // remove this guy from the list by overwriting him with the tail 1863 if (!is_alive->do_object_b(impl)) {
1858 int lasti = --_nof_implementors; 1864 // remove this guy
1859 assert(lasti >= i && lasti < implementors_limit, "just checking"); 1865 *start_of_implementor() = NULL;
1860 _implementors[i] = _implementors[lasti]; 1866 }
1861 _implementors[lasti] = NULL;
1862 --i; // rerun the loop at this index
1863 } 1867 }
1864 } 1868 } else {
1865 } else { 1869 assert(adr_implementor() != NULL, "just checking");
1866 for (int i = 0; i < implementors_limit; i++) { 1870 keep_alive->do_oop(adr_implementor());
1867 keep_alive->do_oop(&adr_implementors()[i]); 1871 }
1868 } 1872 }
1869 } 1873
1870 Klass::follow_weak_klass_links(is_alive, keep_alive); 1874 Klass::follow_weak_klass_links(is_alive, keep_alive);
1871 } 1875 }
1872 1876
1873 void instanceKlass::remove_unshareable_info() { 1877 void instanceKlass::remove_unshareable_info() {
1874 Klass::remove_unshareable_info(); 1878 Klass::remove_unshareable_info();