33 |
33 |
34 void CLDToOopClosure::do_cld(ClassLoaderData* cld) { |
34 void CLDToOopClosure::do_cld(ClassLoaderData* cld) { |
35 cld->oops_do(_oop_closure, &_klass_closure, _must_claim_cld); |
35 cld->oops_do(_oop_closure, &_klass_closure, _must_claim_cld); |
36 } |
36 } |
37 |
37 |
|
38 void CLDToKlassAndOopClosure::do_cld(ClassLoaderData* cld) { |
|
39 cld->oops_do(_oop_closure, _klass_closure, _must_claim_cld); |
|
40 } |
|
41 |
38 void ObjectToOopClosure::do_object(oop obj) { |
42 void ObjectToOopClosure::do_object(oop obj) { |
39 obj->oop_iterate(_cl); |
43 obj->oop_iterate(_cl); |
40 } |
44 } |
41 |
45 |
42 void VoidClosure::do_void() { |
46 void VoidClosure::do_void() { |
43 ShouldNotCallThis(); |
47 ShouldNotCallThis(); |
|
48 } |
|
49 |
|
50 void CodeBlobToOopClosure::do_nmethod(nmethod* nm) { |
|
51 nm->oops_do(_cl); |
|
52 if (_fix_relocations) { |
|
53 nm->fix_oop_relocations(); |
|
54 } |
|
55 } |
|
56 |
|
57 void CodeBlobToOopClosure::do_code_blob(CodeBlob* cb) { |
|
58 nmethod* nm = cb->as_nmethod_or_null(); |
|
59 if (nm != NULL) { |
|
60 do_nmethod(nm); |
|
61 } |
44 } |
62 } |
45 |
63 |
46 MarkingCodeBlobClosure::MarkScope::MarkScope(bool activate) |
64 MarkingCodeBlobClosure::MarkScope::MarkScope(bool activate) |
47 : _active(activate) |
65 : _active(activate) |
48 { |
66 { |
53 if (_active) nmethod::oops_do_marking_epilogue(); |
71 if (_active) nmethod::oops_do_marking_epilogue(); |
54 } |
72 } |
55 |
73 |
56 void MarkingCodeBlobClosure::do_code_blob(CodeBlob* cb) { |
74 void MarkingCodeBlobClosure::do_code_blob(CodeBlob* cb) { |
57 nmethod* nm = cb->as_nmethod_or_null(); |
75 nmethod* nm = cb->as_nmethod_or_null(); |
58 if (nm == NULL) return; |
76 if (nm != NULL && !nm->test_set_oops_do_mark()) { |
59 if (!nm->test_set_oops_do_mark()) { |
77 do_nmethod(nm); |
60 NOT_PRODUCT(if (TraceScavenge) nm->print_on(tty, "oops_do, 1st visit\n")); |
|
61 do_newly_marked_nmethod(nm); |
|
62 } else { |
|
63 NOT_PRODUCT(if (TraceScavenge) nm->print_on(tty, "oops_do, skipped on 2nd visit\n")); |
|
64 } |
78 } |
65 } |
79 } |
66 |
|
67 void CodeBlobToOopClosure::do_newly_marked_nmethod(nmethod* nm) { |
|
68 nm->oops_do(_cl, /*allow_zombie=*/ false); |
|
69 } |
|
70 |
|
71 void CodeBlobToOopClosure::do_code_blob(CodeBlob* cb) { |
|
72 if (!_do_marking) { |
|
73 nmethod* nm = cb->as_nmethod_or_null(); |
|
74 NOT_PRODUCT(if (TraceScavenge && Verbose && nm != NULL) nm->print_on(tty, "oops_do, unmarked visit\n")); |
|
75 // This assert won't work, since there are lots of mini-passes |
|
76 // (mostly in debug mode) that co-exist with marking phases. |
|
77 //assert(!(cb->is_nmethod() && ((nmethod*)cb)->test_oops_do_mark()), "found marked nmethod during mark-free phase"); |
|
78 if (nm != NULL) { |
|
79 nm->oops_do(_cl); |
|
80 } |
|
81 } else { |
|
82 MarkingCodeBlobClosure::do_code_blob(cb); |
|
83 } |
|
84 } |
|
85 |
|
86 |
|