Mercurial > hg > graal-jvmci-8
comparison src/share/vm/prims/jvmtiRedefineClasses.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 | 79c1bb8fce5d |
children | 927a311d00f9 |
comparison
equal
deleted
inserted
replaced
7988:f3ea1af9207a | 8021:8d9fc28831cc |
---|---|
152 | 152 |
153 // Set flag indicating that some invariants are no longer true. | 153 // Set flag indicating that some invariants are no longer true. |
154 // See jvmtiExport.hpp for detailed explanation. | 154 // See jvmtiExport.hpp for detailed explanation. |
155 JvmtiExport::set_has_redefined_a_class(); | 155 JvmtiExport::set_has_redefined_a_class(); |
156 | 156 |
157 #ifdef ASSERT | 157 // check_class() is optionally called for product bits, but is |
158 SystemDictionary::classes_do(check_class, thread); | 158 // always called for non-product bits. |
159 #ifdef PRODUCT | |
160 if (RC_TRACE_ENABLED(0x00004000)) { | |
161 #endif | |
162 RC_TRACE_WITH_THREAD(0x00004000, thread, ("calling check_class")); | |
163 SystemDictionary::classes_do(check_class, thread); | |
164 #ifdef PRODUCT | |
165 } | |
159 #endif | 166 #endif |
160 } | 167 } |
161 | 168 |
162 void VM_RedefineClasses::doit_epilogue() { | 169 void VM_RedefineClasses::doit_epilogue() { |
163 // Free os::malloc allocated memory. | 170 // Free os::malloc allocated memory. |
1562 RC_TRACE_WITH_THREAD(0x00080000, THREAD, | 1569 RC_TRACE_WITH_THREAD(0x00080000, THREAD, |
1563 ("%s@" INTPTR_FORMAT " old=%d, new=%d", Bytecodes::name(c), | 1570 ("%s@" INTPTR_FORMAT " old=%d, new=%d", Bytecodes::name(c), |
1564 bcp, cp_index, new_index)); | 1571 bcp, cp_index, new_index)); |
1565 // Rewriter::rewrite_method() uses put_native_u2() in this | 1572 // Rewriter::rewrite_method() uses put_native_u2() in this |
1566 // situation because it is reusing the constant pool index | 1573 // situation because it is reusing the constant pool index |
1567 // location for a native index into the constantPoolCache. | 1574 // location for a native index into the ConstantPoolCache. |
1568 // Since we are updating the constant pool index prior to | 1575 // Since we are updating the constant pool index prior to |
1569 // verification and constantPoolCache initialization, we | 1576 // verification and ConstantPoolCache initialization, we |
1570 // need to keep the new index in Java byte order. | 1577 // need to keep the new index in Java byte order. |
1571 Bytes::put_Java_u2(p, new_index); | 1578 Bytes::put_Java_u2(p, new_index); |
1572 } | 1579 } |
1573 } break; | 1580 } break; |
1574 } | 1581 } |
3369 increment_class_counter(subik, THREAD); | 3376 increment_class_counter(subik, THREAD); |
3370 } | 3377 } |
3371 } | 3378 } |
3372 } | 3379 } |
3373 | 3380 |
3374 #ifndef PRODUCT | |
3375 void VM_RedefineClasses::check_class(Klass* k_oop, | 3381 void VM_RedefineClasses::check_class(Klass* k_oop, |
3376 ClassLoaderData* initiating_loader, | 3382 ClassLoaderData* initiating_loader, |
3377 TRAPS) { | 3383 TRAPS) { |
3378 Klass *k = k_oop; | 3384 Klass *k = k_oop; |
3379 if (k->oop_is_instance()) { | 3385 if (k->oop_is_instance()) { |
3380 HandleMark hm(THREAD); | 3386 HandleMark hm(THREAD); |
3381 InstanceKlass *ik = (InstanceKlass *) k; | 3387 InstanceKlass *ik = (InstanceKlass *) k; |
3382 | 3388 bool no_old_methods = true; // be optimistic |
3383 if (ik->vtable_length() > 0) { | 3389 ResourceMark rm(THREAD); |
3384 ResourceMark rm(THREAD); | 3390 |
3385 if (!ik->vtable()->check_no_old_entries()) { | 3391 // a vtable should never contain old or obsolete methods |
3386 tty->print_cr("klassVtable::check_no_old_entries failure -- OLD method found -- class: %s", ik->signature_name()); | 3392 if (ik->vtable_length() > 0 && |
3393 !ik->vtable()->check_no_old_or_obsolete_entries()) { | |
3394 if (RC_TRACE_ENABLED(0x00004000)) { | |
3395 RC_TRACE_WITH_THREAD(0x00004000, THREAD, | |
3396 ("klassVtable::check_no_old_or_obsolete_entries failure" | |
3397 " -- OLD or OBSOLETE method found -- class: %s", | |
3398 ik->signature_name())); | |
3387 ik->vtable()->dump_vtable(); | 3399 ik->vtable()->dump_vtable(); |
3388 assert(false, "OLD method found"); | 3400 } |
3389 } | 3401 no_old_methods = false; |
3390 } | 3402 } |
3391 if (ik->itable_length() > 0) { | 3403 |
3392 ResourceMark rm(THREAD); | 3404 // an itable should never contain old or obsolete methods |
3393 if (!ik->itable()->check_no_old_entries()) { | 3405 if (ik->itable_length() > 0 && |
3394 tty->print_cr("klassItable::check_no_old_entries failure -- OLD method found -- class: %s", ik->signature_name()); | 3406 !ik->itable()->check_no_old_or_obsolete_entries()) { |
3395 assert(false, "OLD method found"); | 3407 if (RC_TRACE_ENABLED(0x00004000)) { |
3396 } | 3408 RC_TRACE_WITH_THREAD(0x00004000, THREAD, |
3397 } | 3409 ("klassItable::check_no_old_or_obsolete_entries failure" |
3398 // Check that the constant pool cache has no deleted entries. | 3410 " -- OLD or OBSOLETE method found -- class: %s", |
3411 ik->signature_name())); | |
3412 ik->itable()->dump_itable(); | |
3413 } | |
3414 no_old_methods = false; | |
3415 } | |
3416 | |
3417 // the constant pool cache should never contain old or obsolete methods | |
3399 if (ik->constants() != NULL && | 3418 if (ik->constants() != NULL && |
3400 ik->constants()->cache() != NULL && | 3419 ik->constants()->cache() != NULL && |
3401 !ik->constants()->cache()->check_no_old_entries()) { | 3420 !ik->constants()->cache()->check_no_old_or_obsolete_entries()) { |
3402 tty->print_cr("klassVtable::check_no_old_entries failure -- OLD method found -- class: %s", ik->signature_name()); | 3421 if (RC_TRACE_ENABLED(0x00004000)) { |
3403 assert(false, "OLD method found"); | 3422 RC_TRACE_WITH_THREAD(0x00004000, THREAD, |
3423 ("cp-cache::check_no_old_or_obsolete_entries failure" | |
3424 " -- OLD or OBSOLETE method found -- class: %s", | |
3425 ik->signature_name())); | |
3426 ik->constants()->cache()->dump_cache(); | |
3427 } | |
3428 no_old_methods = false; | |
3429 } | |
3430 | |
3431 if (!no_old_methods) { | |
3432 if (RC_TRACE_ENABLED(0x00004000)) { | |
3433 dump_methods(); | |
3434 } else { | |
3435 tty->print_cr("INFO: use the '-XX:TraceRedefineClasses=16384' option " | |
3436 "to see more info about the following guarantee() failure."); | |
3437 } | |
3438 guarantee(false, "OLD and/or OBSOLETE method(s) found"); | |
3404 } | 3439 } |
3405 } | 3440 } |
3406 } | 3441 } |
3407 | 3442 |
3408 void VM_RedefineClasses::dump_methods() { | 3443 void VM_RedefineClasses::dump_methods() { |
3409 int j; | 3444 int j; |
3410 tty->print_cr("_old_methods --"); | 3445 RC_TRACE(0x00004000, ("_old_methods --")); |
3411 for (j = 0; j < _old_methods->length(); ++j) { | 3446 for (j = 0; j < _old_methods->length(); ++j) { |
3412 Method* m = _old_methods->at(j); | 3447 Method* m = _old_methods->at(j); |
3413 tty->print("%4d (%5d) ", j, m->vtable_index()); | 3448 RC_TRACE_NO_CR(0x00004000, ("%4d (%5d) ", j, m->vtable_index())); |
3414 m->access_flags().print_on(tty); | 3449 m->access_flags().print_on(tty); |
3415 tty->print(" -- "); | 3450 tty->print(" -- "); |
3416 m->print_name(tty); | 3451 m->print_name(tty); |
3417 tty->cr(); | 3452 tty->cr(); |
3418 } | 3453 } |
3419 tty->print_cr("_new_methods --"); | 3454 RC_TRACE(0x00004000, ("_new_methods --")); |
3420 for (j = 0; j < _new_methods->length(); ++j) { | 3455 for (j = 0; j < _new_methods->length(); ++j) { |
3421 Method* m = _new_methods->at(j); | 3456 Method* m = _new_methods->at(j); |
3422 tty->print("%4d (%5d) ", j, m->vtable_index()); | 3457 RC_TRACE_NO_CR(0x00004000, ("%4d (%5d) ", j, m->vtable_index())); |
3423 m->access_flags().print_on(tty); | 3458 m->access_flags().print_on(tty); |
3424 tty->print(" -- "); | 3459 tty->print(" -- "); |
3425 m->print_name(tty); | 3460 m->print_name(tty); |
3426 tty->cr(); | 3461 tty->cr(); |
3427 } | 3462 } |
3428 tty->print_cr("_matching_(old/new)_methods --"); | 3463 RC_TRACE(0x00004000, ("_matching_(old/new)_methods --")); |
3429 for (j = 0; j < _matching_methods_length; ++j) { | 3464 for (j = 0; j < _matching_methods_length; ++j) { |
3430 Method* m = _matching_old_methods[j]; | 3465 Method* m = _matching_old_methods[j]; |
3431 tty->print("%4d (%5d) ", j, m->vtable_index()); | 3466 RC_TRACE_NO_CR(0x00004000, ("%4d (%5d) ", j, m->vtable_index())); |
3432 m->access_flags().print_on(tty); | 3467 m->access_flags().print_on(tty); |
3433 tty->print(" -- "); | 3468 tty->print(" -- "); |
3434 m->print_name(tty); | 3469 m->print_name(tty); |
3435 tty->cr(); | 3470 tty->cr(); |
3436 m = _matching_new_methods[j]; | 3471 m = _matching_new_methods[j]; |
3437 tty->print(" (%5d) ", m->vtable_index()); | 3472 RC_TRACE_NO_CR(0x00004000, (" (%5d) ", m->vtable_index())); |
3438 m->access_flags().print_on(tty); | 3473 m->access_flags().print_on(tty); |
3439 tty->cr(); | 3474 tty->cr(); |
3440 } | 3475 } |
3441 tty->print_cr("_deleted_methods --"); | 3476 RC_TRACE(0x00004000, ("_deleted_methods --")); |
3442 for (j = 0; j < _deleted_methods_length; ++j) { | 3477 for (j = 0; j < _deleted_methods_length; ++j) { |
3443 Method* m = _deleted_methods[j]; | 3478 Method* m = _deleted_methods[j]; |
3444 tty->print("%4d (%5d) ", j, m->vtable_index()); | 3479 RC_TRACE_NO_CR(0x00004000, ("%4d (%5d) ", j, m->vtable_index())); |
3445 m->access_flags().print_on(tty); | 3480 m->access_flags().print_on(tty); |
3446 tty->print(" -- "); | 3481 tty->print(" -- "); |
3447 m->print_name(tty); | 3482 m->print_name(tty); |
3448 tty->cr(); | 3483 tty->cr(); |
3449 } | 3484 } |
3450 tty->print_cr("_added_methods --"); | 3485 RC_TRACE(0x00004000, ("_added_methods --")); |
3451 for (j = 0; j < _added_methods_length; ++j) { | 3486 for (j = 0; j < _added_methods_length; ++j) { |
3452 Method* m = _added_methods[j]; | 3487 Method* m = _added_methods[j]; |
3453 tty->print("%4d (%5d) ", j, m->vtable_index()); | 3488 RC_TRACE_NO_CR(0x00004000, ("%4d (%5d) ", j, m->vtable_index())); |
3454 m->access_flags().print_on(tty); | 3489 m->access_flags().print_on(tty); |
3455 tty->print(" -- "); | 3490 tty->print(" -- "); |
3456 m->print_name(tty); | 3491 m->print_name(tty); |
3457 tty->cr(); | 3492 tty->cr(); |
3458 } | 3493 } |
3459 } | 3494 } |
3460 #endif |