17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #include "precompiled.hpp" 26 #include "gc/g1/dirtyCardQueue.hpp" 27 #include "gc/g1/g1CollectedHeap.inline.hpp" 28 #include "gc/g1/g1CollectorState.hpp" 29 #include "gc/g1/g1ConcurrentMark.inline.hpp" 30 #include "gc/g1/g1EvacFailure.hpp" 31 #include "gc/g1/g1HeapVerifier.hpp" 32 #include "gc/g1/g1OopClosures.inline.hpp" 33 #include "gc/g1/g1_globals.hpp" 34 #include "gc/g1/heapRegion.hpp" 35 #include "gc/g1/heapRegionRemSet.hpp" 36 #include "gc/shared/preservedMarks.inline.hpp" 37 38 class UpdateRSetDeferred : public ExtendedOopClosure { 39 private: 40 G1CollectedHeap* _g1; 41 DirtyCardQueue* _dcq; 42 G1CardTable* _ct; 43 44 public: 45 UpdateRSetDeferred(DirtyCardQueue* dcq) : 46 _g1(G1CollectedHeap::heap()), _ct(_g1->card_table()), _dcq(dcq) {} 47 48 virtual void do_oop(narrowOop* p) { do_oop_work(p); } 49 virtual void do_oop( oop* p) { do_oop_work(p); } 50 template <class T> void do_oop_work(T* p) { 51 assert(_g1->heap_region_containing(p)->is_in_reserved(p), "paranoia"); 52 assert(!_g1->heap_region_containing(p)->is_survivor(), "Unexpected evac failure in survivor region"); 53 54 T const o = oopDesc::load_heap_oop(p); 55 if (oopDesc::is_null(o)) { 56 return; 57 } 58 59 if (HeapRegion::is_in_same_region(p, oopDesc::decode_heap_oop(o))) { 60 return; 61 } 62 size_t card_index = _ct->index_for(p); 63 if (_ct->mark_card_deferred(card_index)) { 64 _dcq->enqueue((jbyte*)_ct->byte_for_index(card_index)); 65 } 66 } 67 }; 68 69 class RemoveSelfForwardPtrObjClosure: public ObjectClosure { 70 private: 71 G1CollectedHeap* _g1; 72 G1ConcurrentMark* _cm; 73 HeapRegion* _hr; 74 size_t _marked_bytes; 75 UpdateRSetDeferred* _update_rset_cl; 76 bool _during_initial_mark; 77 uint _worker_id; 78 HeapWord* _last_forwarded_object_end; 79 | 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #include "precompiled.hpp" 26 #include "gc/g1/dirtyCardQueue.hpp" 27 #include "gc/g1/g1CollectedHeap.inline.hpp" 28 #include "gc/g1/g1CollectorState.hpp" 29 #include "gc/g1/g1ConcurrentMark.inline.hpp" 30 #include "gc/g1/g1EvacFailure.hpp" 31 #include "gc/g1/g1HeapVerifier.hpp" 32 #include "gc/g1/g1OopClosures.inline.hpp" 33 #include "gc/g1/g1_globals.hpp" 34 #include "gc/g1/heapRegion.hpp" 35 #include "gc/g1/heapRegionRemSet.hpp" 36 #include "gc/shared/preservedMarks.inline.hpp" 37 #include "oops/access.inline.hpp" 38 #include "oops/compressedOops.inline.hpp" 39 40 class UpdateRSetDeferred : public ExtendedOopClosure { 41 private: 42 G1CollectedHeap* _g1; 43 DirtyCardQueue* _dcq; 44 G1CardTable* _ct; 45 46 public: 47 UpdateRSetDeferred(DirtyCardQueue* dcq) : 48 _g1(G1CollectedHeap::heap()), _ct(_g1->card_table()), _dcq(dcq) {} 49 50 virtual void do_oop(narrowOop* p) { do_oop_work(p); } 51 virtual void do_oop( oop* p) { do_oop_work(p); } 52 template <class T> void do_oop_work(T* p) { 53 assert(_g1->heap_region_containing(p)->is_in_reserved(p), "paranoia"); 54 assert(!_g1->heap_region_containing(p)->is_survivor(), "Unexpected evac failure in survivor region"); 55 56 T const o = RawAccess<>::oop_load(p); 57 if (CompressedOops::is_null(o)) { 58 return; 59 } 60 61 if (HeapRegion::is_in_same_region(p, CompressedOops::decode(o))) { 62 return; 63 } 64 size_t card_index = _ct->index_for(p); 65 if (_ct->mark_card_deferred(card_index)) { 66 _dcq->enqueue((jbyte*)_ct->byte_for_index(card_index)); 67 } 68 } 69 }; 70 71 class RemoveSelfForwardPtrObjClosure: public ObjectClosure { 72 private: 73 G1CollectedHeap* _g1; 74 G1ConcurrentMark* _cm; 75 HeapRegion* _hr; 76 size_t _marked_bytes; 77 UpdateRSetDeferred* _update_rset_cl; 78 bool _during_initial_mark; 79 uint _worker_id; 80 HeapWord* _last_forwarded_object_end; 81 |