hotspot/src/share/vm/oops/instanceKlass.cpp
changeset 40909 0bb3d95b9577
parent 40894 7d17619c0140
child 40927 59f3c8a69541
equal deleted inserted replaced
40906:bd1ac56ce258 40909:0bb3d95b9577
  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) {