src/share/vm/memory/iterator.cpp

Print this page

        

*** 33,50 **** --- 33,68 ---- void CLDToOopClosure::do_cld(ClassLoaderData* cld) { 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); } void VoidClosure::do_void() { 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) { if (_active) nmethod::oops_do_marking_prologue(); }
*** 53,86 **** if (_active) nmethod::oops_do_marking_epilogue(); } void MarkingCodeBlobClosure::do_code_blob(CodeBlob* cb) { nmethod* nm = cb->as_nmethod_or_null(); ! 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); - } - } - - --- 71,79 ---- if (_active) nmethod::oops_do_marking_epilogue(); } 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); } }