< prev index next >

src/share/vm/oops/instanceKlass.cpp

Print this page

        

@@ -3368,11 +3368,10 @@
 // RedefineClasses() support for previous versions:
 int InstanceKlass::_previous_version_count = 0;
 
 // Purge previous versions before adding new previous versions of the class.
 void InstanceKlass::purge_previous_versions(InstanceKlass* ik) {
-  assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
   if (ik->previous_versions() != NULL) {
     // This klass has previous versions so see what we can cleanup
     // while it is safe to do so.
 
     int deleted_count = 0;    // leave debugging breadcrumbs

@@ -3397,16 +3396,11 @@
       if (!pvcp->on_stack()) {
         // If the constant pool isn't on stack, none of the methods
         // are executing.  Unlink this previous_version.
         // The previous version InstanceKlass is on the ClassLoaderData deallocate list
         // so will be deallocated during the next phase of class unloading.
-        //
-        // Update count for class unloading.
-        _previous_version_count--;
-        log_trace(redefine, class, iklass, purge)
-          ("previous version " INTPTR_FORMAT " is dead.  previous_version_count = %d",
-           p2i(pv_node), _previous_version_count);
+        log_trace(redefine, class, iklass, purge)("previous version " INTPTR_FORMAT " is dead", p2i(pv_node));
         // For debugging purposes.
         pv_node->set_is_scratch_class();
         pv_node->class_loader_data()->add_to_deallocate_list(pv_node);
         pv_node = pv_node->previous_versions();
         last->link_previous_versions(pv_node);

@@ -3517,11 +3511,10 @@
 // also used to clean MethodData links to redefined methods that are no longer running.
 void InstanceKlass::add_previous_version(instanceKlassHandle scratch_class,
                                          int emcp_method_count) {
   assert(Thread::current()->is_VM_thread(),
          "only VMThread can add previous versions");
-  assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
 
   ResourceMark rm;
   log_trace(redefine, class, iklass, add)
     ("adding previous version ref for %s, EMCP_cnt=%d", scratch_class->external_name(), emcp_method_count);
 

@@ -3541,10 +3534,12 @@
   if (!cp_ref->on_stack()) {
     log_trace(redefine, class, iklass, add)("scratch class not added; no methods are running");
     // For debugging purposes.
     scratch_class->set_is_scratch_class();
     scratch_class->class_loader_data()->add_to_deallocate_list(scratch_class());
+    // Update count for class unloading.
+    _previous_version_count--;
     return;
   }
 
   if (emcp_method_count != 0) {
     // At least one method is still running, check for EMCP methods

@@ -3568,18 +3563,16 @@
       }
     }
   }
 
   // Add previous version if any methods are still running.
-  // Update count for class unloading.
-  _previous_version_count++;
-  log_trace(redefine, class, iklass, add)
-    ("scratch class added; one of its methods is on_stack.  previous_version_count = %d",
-      _previous_version_count);
+  log_trace(redefine, class, iklass, add)("scratch class added; one of its methods is on_stack");
   assert(scratch_class->previous_versions() == NULL, "shouldn't have a previous version");
   scratch_class->link_previous_versions(previous_versions());
   link_previous_versions(scratch_class());
+  // Update count for class unloading.
+  _previous_version_count++;
 } // end add_previous_version()
 
 #endif // INCLUDE_JVMTI
 
 Method* InstanceKlass::method_with_idnum(int idnum) {
< prev index next >