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 OopsInHeapRegionClosure {
39 private:
40 G1CollectedHeap* _g1;
41 DirtyCardQueue *_dcq;
42 G1SATBCardTableModRefBS* _ct_bs;
43
44 public:
45 UpdateRSetDeferred(DirtyCardQueue* dcq) :
46 _g1(G1CollectedHeap::heap()), _ct_bs(_g1->g1_barrier_set()), _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(_from->is_in_reserved(p), "paranoia");
52 assert(!_from->is_survivor(), "Unexpected evac failure in survivor region");
53
54 if (!_from->is_in_reserved(oopDesc::load_decode_heap_oop(p))) {
55 size_t card_index = _ct_bs->index_for(p);
56 if (_ct_bs->mark_card_deferred(card_index)) {
57 _dcq->enqueue((jbyte*)_ct_bs->byte_for_index(card_index));
58 }
59 }
60 }
61 };
62
63 class RemoveSelfForwardPtrObjClosure: public ObjectClosure {
64 private:
65 G1CollectedHeap* _g1;
66 G1ConcurrentMark* _cm;
67 HeapRegion* _hr;
68 size_t _marked_bytes;
69 OopsInHeapRegionClosure *_update_rset_cl;
70 bool _during_initial_mark;
71 uint _worker_id;
72 HeapWord* _last_forwarded_object_end;
73
74 public:
75 RemoveSelfForwardPtrObjClosure(HeapRegion* hr,
76 OopsInHeapRegionClosure* update_rset_cl,
77 bool during_initial_mark,
|
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 OopsInHeapRegionClosure {
39 private:
40 G1CollectedHeap* _g1;
41 DirtyCardQueue *_dcq;
42 G1CardTable* _ct;
43
44 public:
45 UpdateRSetDeferred(DirtyCardQueue* dcq) :
46 _g1(G1CollectedHeap::heap()), _ct(_g1->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(_from->is_in_reserved(p), "paranoia");
52 assert(!_from->is_survivor(), "Unexpected evac failure in survivor region");
53
54 if (!_from->is_in_reserved(oopDesc::load_decode_heap_oop(p))) {
55 size_t card_index = _ct->index_for(p);
56 if (_ct->mark_card_deferred(card_index)) {
57 _dcq->enqueue((jbyte*)_ct->byte_for_index(card_index));
58 }
59 }
60 }
61 };
62
63 class RemoveSelfForwardPtrObjClosure: public ObjectClosure {
64 private:
65 G1CollectedHeap* _g1;
66 G1ConcurrentMark* _cm;
67 HeapRegion* _hr;
68 size_t _marked_bytes;
69 OopsInHeapRegionClosure *_update_rset_cl;
70 bool _during_initial_mark;
71 uint _worker_id;
72 HeapWord* _last_forwarded_object_end;
73
74 public:
75 RemoveSelfForwardPtrObjClosure(HeapRegion* hr,
76 OopsInHeapRegionClosure* update_rset_cl,
77 bool during_initial_mark,
|