3368 // RedefineClasses() support for previous versions: |
3368 // RedefineClasses() support for previous versions: |
3369 int InstanceKlass::_previous_version_count = 0; |
3369 int InstanceKlass::_previous_version_count = 0; |
3370 |
3370 |
3371 // Purge previous versions before adding new previous versions of the class. |
3371 // Purge previous versions before adding new previous versions of the class. |
3372 void InstanceKlass::purge_previous_versions(InstanceKlass* ik) { |
3372 void InstanceKlass::purge_previous_versions(InstanceKlass* ik) { |
3373 assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint"); |
|
3374 if (ik->previous_versions() != NULL) { |
3373 if (ik->previous_versions() != NULL) { |
3375 // This klass has previous versions so see what we can cleanup |
3374 // This klass has previous versions so see what we can cleanup |
3376 // while it is safe to do so. |
3375 // while it is safe to do so. |
3377 |
3376 |
3378 int deleted_count = 0; // leave debugging breadcrumbs |
3377 int deleted_count = 0; // leave debugging breadcrumbs |
3397 if (!pvcp->on_stack()) { |
3396 if (!pvcp->on_stack()) { |
3398 // If the constant pool isn't on stack, none of the methods |
3397 // If the constant pool isn't on stack, none of the methods |
3399 // are executing. Unlink this previous_version. |
3398 // are executing. Unlink this previous_version. |
3400 // The previous version InstanceKlass is on the ClassLoaderData deallocate list |
3399 // The previous version InstanceKlass is on the ClassLoaderData deallocate list |
3401 // so will be deallocated during the next phase of class unloading. |
3400 // so will be deallocated during the next phase of class unloading. |
3402 // |
3401 log_trace(redefine, class, iklass, purge)("previous version " INTPTR_FORMAT " is dead", p2i(pv_node)); |
3403 // Update count for class unloading. |
|
3404 _previous_version_count--; |
|
3405 log_trace(redefine, class, iklass, purge) |
|
3406 ("previous version " INTPTR_FORMAT " is dead. previous_version_count = %d", |
|
3407 p2i(pv_node), _previous_version_count); |
|
3408 // For debugging purposes. |
3402 // For debugging purposes. |
3409 pv_node->set_is_scratch_class(); |
3403 pv_node->set_is_scratch_class(); |
3410 pv_node->class_loader_data()->add_to_deallocate_list(pv_node); |
3404 pv_node->class_loader_data()->add_to_deallocate_list(pv_node); |
3411 pv_node = pv_node->previous_versions(); |
3405 pv_node = pv_node->previous_versions(); |
3412 last->link_previous_versions(pv_node); |
3406 last->link_previous_versions(pv_node); |
3517 // also used to clean MethodData links to redefined methods that are no longer running. |
3511 // also used to clean MethodData links to redefined methods that are no longer running. |
3518 void InstanceKlass::add_previous_version(instanceKlassHandle scratch_class, |
3512 void InstanceKlass::add_previous_version(instanceKlassHandle scratch_class, |
3519 int emcp_method_count) { |
3513 int emcp_method_count) { |
3520 assert(Thread::current()->is_VM_thread(), |
3514 assert(Thread::current()->is_VM_thread(), |
3521 "only VMThread can add previous versions"); |
3515 "only VMThread can add previous versions"); |
3522 assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint"); |
|
3523 |
3516 |
3524 ResourceMark rm; |
3517 ResourceMark rm; |
3525 log_trace(redefine, class, iklass, add) |
3518 log_trace(redefine, class, iklass, add) |
3526 ("adding previous version ref for %s, EMCP_cnt=%d", scratch_class->external_name(), emcp_method_count); |
3519 ("adding previous version ref for %s, EMCP_cnt=%d", scratch_class->external_name(), emcp_method_count); |
3527 |
3520 |
3541 if (!cp_ref->on_stack()) { |
3534 if (!cp_ref->on_stack()) { |
3542 log_trace(redefine, class, iklass, add)("scratch class not added; no methods are running"); |
3535 log_trace(redefine, class, iklass, add)("scratch class not added; no methods are running"); |
3543 // For debugging purposes. |
3536 // For debugging purposes. |
3544 scratch_class->set_is_scratch_class(); |
3537 scratch_class->set_is_scratch_class(); |
3545 scratch_class->class_loader_data()->add_to_deallocate_list(scratch_class()); |
3538 scratch_class->class_loader_data()->add_to_deallocate_list(scratch_class()); |
|
3539 // Update count for class unloading. |
|
3540 _previous_version_count--; |
3546 return; |
3541 return; |
3547 } |
3542 } |
3548 |
3543 |
3549 if (emcp_method_count != 0) { |
3544 if (emcp_method_count != 0) { |
3550 // At least one method is still running, check for EMCP methods |
3545 // At least one method is still running, check for EMCP methods |
3568 } |
3563 } |
3569 } |
3564 } |
3570 } |
3565 } |
3571 |
3566 |
3572 // Add previous version if any methods are still running. |
3567 // Add previous version if any methods are still running. |
3573 // Update count for class unloading. |
3568 log_trace(redefine, class, iklass, add)("scratch class added; one of its methods is on_stack"); |
3574 _previous_version_count++; |
|
3575 log_trace(redefine, class, iklass, add) |
|
3576 ("scratch class added; one of its methods is on_stack. previous_version_count = %d", |
|
3577 _previous_version_count); |
|
3578 assert(scratch_class->previous_versions() == NULL, "shouldn't have a previous version"); |
3569 assert(scratch_class->previous_versions() == NULL, "shouldn't have a previous version"); |
3579 scratch_class->link_previous_versions(previous_versions()); |
3570 scratch_class->link_previous_versions(previous_versions()); |
3580 link_previous_versions(scratch_class()); |
3571 link_previous_versions(scratch_class()); |
|
3572 // Update count for class unloading. |
|
3573 _previous_version_count++; |
3581 } // end add_previous_version() |
3574 } // end add_previous_version() |
3582 |
3575 |
3583 #endif // INCLUDE_JVMTI |
3576 #endif // INCLUDE_JVMTI |
3584 |
3577 |
3585 Method* InstanceKlass::method_with_idnum(int idnum) { |
3578 Method* InstanceKlass::method_with_idnum(int idnum) { |