Mercurial > hg > graal-jvmci-8
comparison src/share/vm/oops/klassVtable.cpp @ 8021:8d9fc28831cc
7182152: Instrumentation hot swap test incorrect monitor count
Summary: Add/refine new tracing support using -XX:TraceRedefineClasses=16384.
Reviewed-by: coleenp, acorn, sspitsyn
author | dcubed |
---|---|
date | Wed, 06 Feb 2013 14:31:37 -0800 |
parents | 070d523b96a7 |
children | cd3089a56438 |
comparison
equal
deleted
inserted
replaced
7988:f3ea1af9207a | 8021:8d9fc28831cc |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
608 | 608 |
609 void klassVtable::copy_vtable_to(vtableEntry* start) { | 609 void klassVtable::copy_vtable_to(vtableEntry* start) { |
610 Copy::disjoint_words((HeapWord*)table(), (HeapWord*)start, _length * vtableEntry::size()); | 610 Copy::disjoint_words((HeapWord*)table(), (HeapWord*)start, _length * vtableEntry::size()); |
611 } | 611 } |
612 | 612 |
613 #if INCLUDE_JVMTI | |
613 void klassVtable::adjust_method_entries(Method** old_methods, Method** new_methods, | 614 void klassVtable::adjust_method_entries(Method** old_methods, Method** new_methods, |
614 int methods_length, bool * trace_name_printed) { | 615 int methods_length, bool * trace_name_printed) { |
615 // search the vtable for uses of either obsolete or EMCP methods | 616 // search the vtable for uses of either obsolete or EMCP methods |
616 for (int j = 0; j < methods_length; j++) { | 617 for (int j = 0; j < methods_length; j++) { |
617 Method* old_method = old_methods[j]; | 618 Method* old_method = old_methods[j]; |
636 // RC_TRACE macro has an embedded ResourceMark | 637 // RC_TRACE macro has an embedded ResourceMark |
637 RC_TRACE(0x00100000, ("vtable method update: %s(%s)", | 638 RC_TRACE(0x00100000, ("vtable method update: %s(%s)", |
638 new_method->name()->as_C_string(), | 639 new_method->name()->as_C_string(), |
639 new_method->signature()->as_C_string())); | 640 new_method->signature()->as_C_string())); |
640 } | 641 } |
642 // cannot 'break' here; see for-loop comment above. | |
641 } | 643 } |
642 } | 644 } |
643 } | 645 } |
644 } | 646 } |
647 | |
648 // a vtable should never contain old or obsolete methods | |
649 bool klassVtable::check_no_old_or_obsolete_entries() { | |
650 for (int i = 0; i < length(); i++) { | |
651 Method* m = unchecked_method_at(i); | |
652 if (m != NULL && | |
653 (NOT_PRODUCT(!m->is_valid() ||) m->is_old() || m->is_obsolete())) { | |
654 return false; | |
655 } | |
656 } | |
657 return true; | |
658 } | |
659 | |
660 void klassVtable::dump_vtable() { | |
661 tty->print_cr("vtable dump --"); | |
662 for (int i = 0; i < length(); i++) { | |
663 Method* m = unchecked_method_at(i); | |
664 if (m != NULL) { | |
665 tty->print(" (%5d) ", i); | |
666 m->access_flags().print_on(tty); | |
667 tty->print(" -- "); | |
668 m->print_name(tty); | |
669 tty->cr(); | |
670 } | |
671 } | |
672 } | |
673 #endif // INCLUDE_JVMTI | |
645 | 674 |
646 // CDS/RedefineClasses support - clear vtables so they can be reinitialized | 675 // CDS/RedefineClasses support - clear vtables so they can be reinitialized |
647 void klassVtable::clear_vtable() { | 676 void klassVtable::clear_vtable() { |
648 for (int i = 0; i < _length; i++) table()[i].clear(); | 677 for (int i = 0; i < _length; i++) table()[i].clear(); |
649 } | 678 } |
803 } | 832 } |
804 ime++; | 833 ime++; |
805 } | 834 } |
806 } | 835 } |
807 | 836 |
837 #if INCLUDE_JVMTI | |
808 void klassItable::adjust_method_entries(Method** old_methods, Method** new_methods, | 838 void klassItable::adjust_method_entries(Method** old_methods, Method** new_methods, |
809 int methods_length, bool * trace_name_printed) { | 839 int methods_length, bool * trace_name_printed) { |
810 // search the itable for uses of either obsolete or EMCP methods | 840 // search the itable for uses of either obsolete or EMCP methods |
811 for (int j = 0; j < methods_length; j++) { | 841 for (int j = 0; j < methods_length; j++) { |
812 Method* old_method = old_methods[j]; | 842 Method* old_method = old_methods[j]; |
831 // RC_TRACE macro has an embedded ResourceMark | 861 // RC_TRACE macro has an embedded ResourceMark |
832 RC_TRACE(0x00200000, ("itable method update: %s(%s)", | 862 RC_TRACE(0x00200000, ("itable method update: %s(%s)", |
833 new_method->name()->as_C_string(), | 863 new_method->name()->as_C_string(), |
834 new_method->signature()->as_C_string())); | 864 new_method->signature()->as_C_string())); |
835 } | 865 } |
836 // Cannot break because there might be another entry for this method | 866 // cannot 'break' here; see for-loop comment above. |
837 } | 867 } |
838 ime++; | 868 ime++; |
839 } | 869 } |
840 } | 870 } |
841 } | 871 } |
872 | |
873 // an itable should never contain old or obsolete methods | |
874 bool klassItable::check_no_old_or_obsolete_entries() { | |
875 itableMethodEntry* ime = method_entry(0); | |
876 for (int i = 0; i < _size_method_table; i++) { | |
877 Method* m = ime->method(); | |
878 if (m != NULL && | |
879 (NOT_PRODUCT(!m->is_valid() ||) m->is_old() || m->is_obsolete())) { | |
880 return false; | |
881 } | |
882 ime++; | |
883 } | |
884 return true; | |
885 } | |
886 | |
887 void klassItable::dump_itable() { | |
888 itableMethodEntry* ime = method_entry(0); | |
889 tty->print_cr("itable dump --"); | |
890 for (int i = 0; i < _size_method_table; i++) { | |
891 Method* m = ime->method(); | |
892 if (m != NULL) { | |
893 tty->print(" (%5d) ", i); | |
894 m->access_flags().print_on(tty); | |
895 tty->print(" -- "); | |
896 m->print_name(tty); | |
897 tty->cr(); | |
898 } | |
899 ime++; | |
900 } | |
901 } | |
902 #endif // INCLUDE_JVMTI | |
842 | 903 |
843 | 904 |
844 // Setup | 905 // Setup |
845 class InterfaceVisiterClosure : public StackObj { | 906 class InterfaceVisiterClosure : public StackObj { |
846 public: | 907 public: |
1124 tty->print_cr("%6d bytes filler overhead", VtableStats::filler); | 1185 tty->print_cr("%6d bytes filler overhead", VtableStats::filler); |
1125 tty->print_cr("%6d bytes for vtable entries (%d for arrays)", VtableStats::entries, VtableStats::array_entries); | 1186 tty->print_cr("%6d bytes for vtable entries (%d for arrays)", VtableStats::entries, VtableStats::array_entries); |
1126 tty->print_cr("%6d bytes total", total); | 1187 tty->print_cr("%6d bytes total", total); |
1127 } | 1188 } |
1128 | 1189 |
1129 bool klassVtable::check_no_old_entries() { | |
1130 // Check that there really is no entry | |
1131 for (int i = 0; i < length(); i++) { | |
1132 Method* m = unchecked_method_at(i); | |
1133 if (m != NULL) { | |
1134 if (!m->is_valid() || m->is_old()) { | |
1135 return false; | |
1136 } | |
1137 } | |
1138 } | |
1139 return true; | |
1140 } | |
1141 | |
1142 void klassVtable::dump_vtable() { | |
1143 tty->print_cr("vtable dump --"); | |
1144 for (int i = 0; i < length(); i++) { | |
1145 Method* m = unchecked_method_at(i); | |
1146 if (m != NULL) { | |
1147 tty->print(" (%5d) ", i); | |
1148 m->access_flags().print_on(tty); | |
1149 tty->print(" -- "); | |
1150 m->print_name(tty); | |
1151 tty->cr(); | |
1152 } | |
1153 } | |
1154 } | |
1155 | |
1156 bool klassItable::check_no_old_entries() { | |
1157 itableMethodEntry* ime = method_entry(0); | |
1158 for(int i = 0; i < _size_method_table; i++) { | |
1159 Method* m = ime->method(); | |
1160 if (m != NULL && (!m->is_valid() || m->is_old())) return false; | |
1161 ime++; | |
1162 } | |
1163 return true; | |
1164 } | |
1165 | |
1166 int klassItable::_total_classes; // Total no. of classes with itables | 1190 int klassItable::_total_classes; // Total no. of classes with itables |
1167 long klassItable::_total_size; // Total no. of bytes used for itables | 1191 long klassItable::_total_size; // Total no. of bytes used for itables |
1168 | 1192 |
1169 void klassItable::print_statistics() { | 1193 void klassItable::print_statistics() { |
1170 tty->print_cr("itable statistics:"); | 1194 tty->print_cr("itable statistics:"); |