Mercurial > hg > graal-jvmci-8
diff src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp @ 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 12eea04c8b06 |
line wrap: on
line diff
--- a/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp Fri Apr 11 09:56:35 2008 -0400 +++ b/src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp Sun Apr 13 17:43:42 2008 -0400 @@ -28,17 +28,16 @@ // Checks an individual oop for missing precise marks. Mark // may be either dirty or newgen. class CheckForUnmarkedOops : public OopClosure { - PSYoungGen* _young_gen; + private: + PSYoungGen* _young_gen; CardTableExtension* _card_table; - HeapWord* _unmarked_addr; - jbyte* _unmarked_card; + HeapWord* _unmarked_addr; + jbyte* _unmarked_card; - public: - CheckForUnmarkedOops( PSYoungGen* young_gen, CardTableExtension* card_table ) : - _young_gen(young_gen), _card_table(card_table), _unmarked_addr(NULL) { } - - virtual void do_oop(oop* p) { - if (_young_gen->is_in_reserved(*p) && + protected: + template <class T> void do_oop_work(T* p) { + oop obj = oopDesc::load_decode_heap_oop_not_null(p); + if (_young_gen->is_in_reserved(obj) && !_card_table->addr_is_marked_imprecise(p)) { // Don't overwrite the first missing card mark if (_unmarked_addr == NULL) { @@ -48,6 +47,13 @@ } } + public: + CheckForUnmarkedOops(PSYoungGen* young_gen, CardTableExtension* card_table) : + _young_gen(young_gen), _card_table(card_table), _unmarked_addr(NULL) { } + + virtual void do_oop(oop* p) { CheckForUnmarkedOops::do_oop_work(p); } + virtual void do_oop(narrowOop* p) { CheckForUnmarkedOops::do_oop_work(p); } + bool has_unmarked_oop() { return _unmarked_addr != NULL; } @@ -56,7 +62,8 @@ // Checks all objects for the existance of some type of mark, // precise or imprecise, dirty or newgen. class CheckForUnmarkedObjects : public ObjectClosure { - PSYoungGen* _young_gen; + private: + PSYoungGen* _young_gen; CardTableExtension* _card_table; public: @@ -75,7 +82,7 @@ // we test for missing precise marks first. If any are found, we don't // fail unless the object head is also unmarked. virtual void do_object(oop obj) { - CheckForUnmarkedOops object_check( _young_gen, _card_table ); + CheckForUnmarkedOops object_check(_young_gen, _card_table); obj->oop_iterate(&object_check); if (object_check.has_unmarked_oop()) { assert(_card_table->addr_is_marked_imprecise(obj), "Found unmarked young_gen object"); @@ -85,19 +92,25 @@ // Checks for precise marking of oops as newgen. class CheckForPreciseMarks : public OopClosure { - PSYoungGen* _young_gen; + private: + PSYoungGen* _young_gen; CardTableExtension* _card_table; + protected: + template <class T> void do_oop_work(T* p) { + oop obj = oopDesc::load_decode_heap_oop_not_null(p); + if (_young_gen->is_in_reserved(obj)) { + assert(_card_table->addr_is_marked_precise(p), "Found unmarked precise oop"); + _card_table->set_card_newgen(p); + } + } + public: CheckForPreciseMarks( PSYoungGen* young_gen, CardTableExtension* card_table ) : _young_gen(young_gen), _card_table(card_table) { } - virtual void do_oop(oop* p) { - if (_young_gen->is_in_reserved(*p)) { - assert(_card_table->addr_is_marked_precise(p), "Found unmarked precise oop"); - _card_table->set_card_newgen(p); - } - } + virtual void do_oop(oop* p) { CheckForPreciseMarks::do_oop_work(p); } + virtual void do_oop(narrowOop* p) { CheckForPreciseMarks::do_oop_work(p); } }; // We get passed the space_top value to prevent us from traversing into