Mercurial > hg > truffle
diff src/share/vm/gc_implementation/shared/markSweep.inline.hpp @ 113:ba764ed4b6f2
6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv
Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author | coleenp |
---|---|
date | Sun, 13 Apr 2008 17:43:42 -0400 |
parents | a61af66fc99e |
children | d1605aabd0a1 |
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/shared/markSweep.inline.hpp Fri Apr 11 09:56:35 2008 -0400 +++ b/src/share/vm/gc_implementation/shared/markSweep.inline.hpp Sun Apr 13 17:43:42 2008 -0400 @@ -22,32 +22,11 @@ * */ -inline void MarkSweep::_adjust_pointer(oop* p, bool isroot) { - oop obj = *p; - VALIDATE_MARK_SWEEP_ONLY(oop saved_new_pointer = NULL); - if (obj != NULL) { - oop new_pointer = oop(obj->mark()->decode_pointer()); - assert(new_pointer != NULL || // is forwarding ptr? - obj->mark() == markOopDesc::prototype() || // not gc marked? - (UseBiasedLocking && obj->mark()->has_bias_pattern()) || // not gc marked? - obj->is_shared(), // never forwarded? - "should contain a forwarding pointer"); - if (new_pointer != NULL) { - *p = new_pointer; - assert(Universe::heap()->is_in_reserved(new_pointer), - "should be in object space"); - VALIDATE_MARK_SWEEP_ONLY(saved_new_pointer = new_pointer); - } - } - VALIDATE_MARK_SWEEP_ONLY(track_adjusted_pointer(p, saved_new_pointer, isroot)); -} - inline void MarkSweep::mark_object(oop obj) { - #ifndef SERIALGC if (UseParallelOldGC && VerifyParallelOldWithMarkSweep) { assert(PSParallelCompact::mark_bitmap()->is_marked(obj), - "Should be marked in the marking bitmap"); + "Should be marked in the marking bitmap"); } #endif // SERIALGC @@ -60,3 +39,80 @@ preserve_mark(obj, mark); } } + +template <class T> inline void MarkSweep::follow_root(T* p) { + assert(!Universe::heap()->is_in_reserved(p), + "roots shouldn't be things within the heap"); +#ifdef VALIDATE_MARK_SWEEP + if (ValidateMarkSweep) { + guarantee(!_root_refs_stack->contains(p), "should only be in here once"); + _root_refs_stack->push(p); + } +#endif + T heap_oop = oopDesc::load_heap_oop(p); + if (!oopDesc::is_null(heap_oop)) { + oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); + if (!obj->mark()->is_marked()) { + mark_object(obj); + obj->follow_contents(); + } + } + follow_stack(); +} + +template <class T> inline void MarkSweep::mark_and_follow(T* p) { +// assert(Universe::heap()->is_in_reserved(p), "should be in object space"); + T heap_oop = oopDesc::load_heap_oop(p); + if (!oopDesc::is_null(heap_oop)) { + oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); + if (!obj->mark()->is_marked()) { + mark_object(obj); + obj->follow_contents(); + } + } +} + +template <class T> inline void MarkSweep::mark_and_push(T* p) { +// assert(Universe::heap()->is_in_reserved(p), "should be in object space"); + T heap_oop = oopDesc::load_heap_oop(p); + if (!oopDesc::is_null(heap_oop)) { + oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); + if (!obj->mark()->is_marked()) { + mark_object(obj); + _marking_stack->push(obj); + } + } +} + +template <class T> inline void MarkSweep::adjust_pointer(T* p, bool isroot) { + T heap_oop = oopDesc::load_heap_oop(p); + if (!oopDesc::is_null(heap_oop)) { + oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); + oop new_obj = oop(obj->mark()->decode_pointer()); + assert(new_obj != NULL || // is forwarding ptr? + obj->mark() == markOopDesc::prototype() || // not gc marked? + (UseBiasedLocking && obj->mark()->has_bias_pattern()) || + // not gc marked? + obj->is_shared(), // never forwarded? + "should be forwarded"); + if (new_obj != NULL) { + assert(Universe::heap()->is_in_reserved(new_obj), + "should be in object space"); + oopDesc::encode_store_heap_oop_not_null(p, new_obj); + } + } + VALIDATE_MARK_SWEEP_ONLY(track_adjusted_pointer(p, isroot)); +} + +template <class T> inline void MarkSweep::KeepAliveClosure::do_oop_work(T* p) { +#ifdef VALIDATE_MARK_SWEEP + if (ValidateMarkSweep) { + if (!Universe::heap()->is_in_reserved(p)) { + _root_refs_stack->push(p); + } else { + _other_refs_stack->push(p); + } + } +#endif + mark_and_push(p); +}