hotspot/src/share/vm/memory/iterator.cpp
changeset 25491 70fb742e40aa
parent 25490 59f226da8d81
child 25492 d27050bdfb04
--- a/hotspot/src/share/vm/memory/iterator.cpp	Mon Jul 07 10:12:40 2014 +0200
+++ b/hotspot/src/share/vm/memory/iterator.cpp	Mon Jul 07 12:37:11 2014 +0200
@@ -35,10 +35,6 @@
   cld->oops_do(_oop_closure, &_klass_closure, _must_claim_cld);
 }
 
-void CLDToKlassAndOopClosure::do_cld(ClassLoaderData* cld) {
-  cld->oops_do(_oop_closure, _klass_closure, _must_claim_cld);
-}
-
 void ObjectToOopClosure::do_object(oop obj) {
   obj->oop_iterate(_cl);
 }
@@ -47,20 +43,6 @@
   ShouldNotCallThis();
 }
 
-void CodeBlobToOopClosure::do_nmethod(nmethod* nm) {
-  nm->oops_do(_cl);
-  if (_fix_relocations) {
-    nm->fix_oop_relocations();
-  }
-}
-
-void CodeBlobToOopClosure::do_code_blob(CodeBlob* cb) {
-  nmethod* nm = cb->as_nmethod_or_null();
-  if (nm != NULL) {
-    do_nmethod(nm);
-  }
-}
-
 MarkingCodeBlobClosure::MarkScope::MarkScope(bool activate)
   : _active(activate)
 {
@@ -73,7 +55,32 @@
 
 void MarkingCodeBlobClosure::do_code_blob(CodeBlob* cb) {
   nmethod* nm = cb->as_nmethod_or_null();
-  if (nm != NULL && !nm->test_set_oops_do_mark()) {
-    do_nmethod(nm);
+  if (nm == NULL)  return;
+  if (!nm->test_set_oops_do_mark()) {
+    NOT_PRODUCT(if (TraceScavenge)  nm->print_on(tty, "oops_do, 1st visit\n"));
+    do_newly_marked_nmethod(nm);
+  } else {
+    NOT_PRODUCT(if (TraceScavenge)  nm->print_on(tty, "oops_do, skipped on 2nd visit\n"));
   }
 }
+
+void CodeBlobToOopClosure::do_newly_marked_nmethod(nmethod* nm) {
+  nm->oops_do(_cl, /*allow_zombie=*/ false);
+}
+
+void CodeBlobToOopClosure::do_code_blob(CodeBlob* cb) {
+  if (!_do_marking) {
+    nmethod* nm = cb->as_nmethod_or_null();
+    NOT_PRODUCT(if (TraceScavenge && Verbose && nm != NULL)  nm->print_on(tty, "oops_do, unmarked visit\n"));
+    // This assert won't work, since there are lots of mini-passes
+    // (mostly in debug mode) that co-exist with marking phases.
+    //assert(!(cb->is_nmethod() && ((nmethod*)cb)->test_oops_do_mark()), "found marked nmethod during mark-free phase");
+    if (nm != NULL) {
+      nm->oops_do(_cl);
+    }
+  } else {
+    MarkingCodeBlobClosure::do_code_blob(cb);
+  }
+}
+
+