33 #include "oops/compressedOops.inline.hpp" 34 #include "oops/oop.inline.hpp" 35 #include "utilities/align.hpp" 36 #include "utilities/stack.inline.hpp" 37 38 inline void MarkSweep::mark_object(oop obj) { 39 // some marks may contain information we need to preserve so we store them away 40 // and overwrite the mark. We'll restore it at the end of markSweep. 41 markWord mark = obj->mark_raw(); 42 obj->set_mark_raw(markWord::prototype().set_marked()); 43 44 if (obj->mark_must_be_preserved(mark)) { 45 preserve_mark(obj, mark); 46 } 47 } 48 49 template <class T> inline void MarkSweep::mark_and_push(T* p) { 50 T heap_oop = RawAccess<>::oop_load(p); 51 if (!CompressedOops::is_null(heap_oop)) { 52 oop obj = CompressedOops::decode_not_null(heap_oop); 53 if (!obj->mark_raw().is_marked()) { 54 mark_object(obj); 55 _marking_stack.push(obj); 56 } 57 } 58 } 59 60 inline void MarkSweep::follow_klass(Klass* klass) { 61 oop op = klass->class_loader_data()->holder_no_keepalive(); 62 MarkSweep::mark_and_push(&op); 63 } 64 65 inline void MarkSweep::follow_cld(ClassLoaderData* cld) { 66 MarkSweep::follow_cld_closure.do_cld(cld); 67 } 68 69 template <typename T> 70 inline void MarkAndPushClosure::do_oop_work(T* p) { MarkSweep::mark_and_push(p); } 71 inline void MarkAndPushClosure::do_oop(oop* p) { do_oop_work(p); } 72 inline void MarkAndPushClosure::do_oop(narrowOop* p) { do_oop_work(p); } | 33 #include "oops/compressedOops.inline.hpp" 34 #include "oops/oop.inline.hpp" 35 #include "utilities/align.hpp" 36 #include "utilities/stack.inline.hpp" 37 38 inline void MarkSweep::mark_object(oop obj) { 39 // some marks may contain information we need to preserve so we store them away 40 // and overwrite the mark. We'll restore it at the end of markSweep. 41 markWord mark = obj->mark_raw(); 42 obj->set_mark_raw(markWord::prototype().set_marked()); 43 44 if (obj->mark_must_be_preserved(mark)) { 45 preserve_mark(obj, mark); 46 } 47 } 48 49 template <class T> inline void MarkSweep::mark_and_push(T* p) { 50 T heap_oop = RawAccess<>::oop_load(p); 51 if (!CompressedOops::is_null(heap_oop)) { 52 oop obj = CompressedOops::decode_not_null(heap_oop); 53 assert_object_is_in_heap(p, obj); 54 55 if (!obj->mark_raw().is_marked()) { 56 mark_object(obj); 57 _marking_stack.push(obj); 58 } 59 } 60 } 61 62 inline void MarkSweep::follow_klass(Klass* klass) { 63 oop op = klass->class_loader_data()->holder_no_keepalive(); 64 MarkSweep::mark_and_push(&op); 65 } 66 67 inline void MarkSweep::follow_cld(ClassLoaderData* cld) { 68 MarkSweep::follow_cld_closure.do_cld(cld); 69 } 70 71 template <typename T> 72 inline void MarkAndPushClosure::do_oop_work(T* p) { MarkSweep::mark_and_push(p); } 73 inline void MarkAndPushClosure::do_oop(oop* p) { do_oop_work(p); } 74 inline void MarkAndPushClosure::do_oop(narrowOop* p) { do_oop_work(p); } |