21 * questions.
22 *
23 */
24
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_HPP
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_HPP
27
28 class HeapRegion;
29 class G1CollectedHeap;
30 class G1RemSet;
31 class ConcurrentMark;
32 class DirtyCardToOopClosure;
33 class CMBitMap;
34 class CMMarkStack;
35 class G1ParScanThreadState;
36 class CMTask;
37 class ReferenceProcessor;
38
39 // A class that scans oops in a given heap region (much as OopsInGenClosure
40 // scans oops in a generation.)
41 class OopsInHeapRegionClosure: public OopsInGenClosure {
42 protected:
43 HeapRegion* _from;
44 public:
45 void set_region(HeapRegion* from) { _from = from; }
46 };
47
48 class G1ParClosureSuper : public OopsInHeapRegionClosure {
49 protected:
50 G1CollectedHeap* _g1;
51 G1RemSet* _g1_rem;
52 ConcurrentMark* _cm;
53 G1ParScanThreadState* _par_scan_state;
54 uint _worker_id;
55 bool _during_initial_mark;
56 bool _mark_in_progress;
57 public:
58 G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state);
59 bool apply_to_weak_ref_discovered_field() { return true; }
60 };
61
114 }
115
116 template <class T> void do_oop_nv(T* p);
117 virtual void do_oop(oop* p) { do_oop_nv(p); }
118 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
119 };
120
121 // Add back base class for metadata
122 class G1ParCopyHelper : public G1ParClosureSuper {
123 Klass* _scanned_klass;
124
125 public:
126 G1ParCopyHelper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) :
127 _scanned_klass(NULL),
128 G1ParClosureSuper(g1, par_scan_state) {}
129
130 void set_scanned_klass(Klass* k) { _scanned_klass = k; }
131 template <class T> void do_klass_barrier(T* p, oop new_obj);
132 };
133
134 template <bool do_gen_barrier, G1Barrier barrier, bool do_mark_object>
135 class G1ParCopyClosure : public G1ParCopyHelper {
136 G1ParScanClosure _scanner;
137 template <class T> void do_oop_work(T* p);
138
139 protected:
140 // Mark the object if it's not already marked. This is used to mark
141 // objects pointed to by roots that are guaranteed not to move
142 // during the GC (i.e., non-CSet objects). It is MT-safe.
143 void mark_object(oop obj);
144
145 // Mark the object if it's not already marked. This is used to mark
146 // objects pointed to by roots that have been forwarded during a
147 // GC. It is MT-safe.
148 void mark_forwarded_object(oop from_obj, oop to_obj);
149
150 oop copy_to_survivor_space(oop obj);
151
152 public:
153 G1ParCopyClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state,
154 ReferenceProcessor* rp) :
155 _scanner(g1, par_scan_state, rp),
156 G1ParCopyHelper(g1, par_scan_state) {
157 assert(_ref_processor == NULL, "sanity");
158 }
159
160 G1ParScanClosure* scanner() { return &_scanner; }
161
162 template <class T> void do_oop_nv(T* p) {
163 do_oop_work(p);
164 }
165 virtual void do_oop(oop* p) { do_oop_nv(p); }
166 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
167 };
168
169 typedef G1ParCopyClosure<false, G1BarrierNone, false> G1ParScanExtRootClosure;
170 typedef G1ParCopyClosure<false, G1BarrierKlass, false> G1ParScanMetadataClosure;
171
172
173 typedef G1ParCopyClosure<false, G1BarrierNone, true> G1ParScanAndMarkExtRootClosure;
174 typedef G1ParCopyClosure<true, G1BarrierNone, true> G1ParScanAndMarkClosure;
175 typedef G1ParCopyClosure<false, G1BarrierKlass, true> G1ParScanAndMarkMetadataClosure;
176
177 // The following closure types are no longer used but are retained
178 // for historical reasons:
179 // typedef G1ParCopyClosure<false, G1BarrierRS, false> G1ParScanHeapRSClosure;
180 // typedef G1ParCopyClosure<false, G1BarrierRS, true> G1ParScanAndMarkHeapRSClosure;
181
182 // The following closure type is defined in g1_specialized_oop_closures.hpp:
183 //
184 // typedef G1ParCopyClosure<false, G1BarrierEvac, false> G1ParScanHeapEvacClosure;
185
186 // We use a separate closure to handle references during evacuation
187 // failure processing.
188 // We could have used another instance of G1ParScanHeapEvacClosure
189 // (since that closure no longer assumes that the references it
190 // handles point into the collection set).
191
192 typedef G1ParCopyClosure<false, G1BarrierEvac, false> G1ParScanHeapEvacFailureClosure;
193
194 class FilterIntoCSClosure: public ExtendedOopClosure {
195 G1CollectedHeap* _g1;
196 OopClosure* _oc;
197 DirtyCardToOopClosure* _dcto_cl;
198 public:
199 FilterIntoCSClosure( DirtyCardToOopClosure* dcto_cl,
200 G1CollectedHeap* g1,
201 OopClosure* oc) :
202 _dcto_cl(dcto_cl), _g1(g1), _oc(oc) { }
203
204 template <class T> void do_oop_nv(T* p);
205 virtual void do_oop(oop* p) { do_oop_nv(p); }
206 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
207 bool apply_to_weak_ref_discovered_field() { return true; }
208 };
209
210 class FilterOutOfRegionClosure: public ExtendedOopClosure {
211 HeapWord* _r_bottom;
212 HeapWord* _r_end;
|
21 * questions.
22 *
23 */
24
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_HPP
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_G1OOPCLOSURES_HPP
27
28 class HeapRegion;
29 class G1CollectedHeap;
30 class G1RemSet;
31 class ConcurrentMark;
32 class DirtyCardToOopClosure;
33 class CMBitMap;
34 class CMMarkStack;
35 class G1ParScanThreadState;
36 class CMTask;
37 class ReferenceProcessor;
38
39 // A class that scans oops in a given heap region (much as OopsInGenClosure
40 // scans oops in a generation.)
41 class OopsInHeapRegionClosure: public ExtendedOopClosure {
42 protected:
43 HeapRegion* _from;
44 public:
45 void set_region(HeapRegion* from) { _from = from; }
46 };
47
48 class G1ParClosureSuper : public OopsInHeapRegionClosure {
49 protected:
50 G1CollectedHeap* _g1;
51 G1RemSet* _g1_rem;
52 ConcurrentMark* _cm;
53 G1ParScanThreadState* _par_scan_state;
54 uint _worker_id;
55 bool _during_initial_mark;
56 bool _mark_in_progress;
57 public:
58 G1ParClosureSuper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state);
59 bool apply_to_weak_ref_discovered_field() { return true; }
60 };
61
114 }
115
116 template <class T> void do_oop_nv(T* p);
117 virtual void do_oop(oop* p) { do_oop_nv(p); }
118 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
119 };
120
121 // Add back base class for metadata
122 class G1ParCopyHelper : public G1ParClosureSuper {
123 Klass* _scanned_klass;
124
125 public:
126 G1ParCopyHelper(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state) :
127 _scanned_klass(NULL),
128 G1ParClosureSuper(g1, par_scan_state) {}
129
130 void set_scanned_klass(Klass* k) { _scanned_klass = k; }
131 template <class T> void do_klass_barrier(T* p, oop new_obj);
132 };
133
134 template <G1Barrier barrier, bool do_mark_object>
135 class G1ParCopyClosure : public G1ParCopyHelper {
136 G1ParScanClosure _scanner;
137 template <class T> void do_oop_work(T* p);
138
139 protected:
140 // Mark the object if it's not already marked. This is used to mark
141 // objects pointed to by roots that are guaranteed not to move
142 // during the GC (i.e., non-CSet objects). It is MT-safe.
143 void mark_object(oop obj);
144
145 // Mark the object if it's not already marked. This is used to mark
146 // objects pointed to by roots that have been forwarded during a
147 // GC. It is MT-safe.
148 void mark_forwarded_object(oop from_obj, oop to_obj);
149
150 oop copy_to_survivor_space(oop obj);
151
152 public:
153 G1ParCopyClosure(G1CollectedHeap* g1, G1ParScanThreadState* par_scan_state,
154 ReferenceProcessor* rp) :
155 _scanner(g1, par_scan_state, rp),
156 G1ParCopyHelper(g1, par_scan_state) {
157 assert(_ref_processor == NULL, "sanity");
158 }
159
160 G1ParScanClosure* scanner() { return &_scanner; }
161
162 template <class T> void do_oop_nv(T* p) {
163 do_oop_work(p);
164 }
165 virtual void do_oop(oop* p) { do_oop_nv(p); }
166 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
167 };
168
169 typedef G1ParCopyClosure<G1BarrierNone, false> G1ParScanExtRootClosure;
170 typedef G1ParCopyClosure<G1BarrierKlass, false> G1ParScanMetadataClosure;
171
172
173 typedef G1ParCopyClosure<G1BarrierNone, true> G1ParScanAndMarkExtRootClosure;
174 typedef G1ParCopyClosure<G1BarrierKlass, true> G1ParScanAndMarkMetadataClosure;
175
176 // The following closure type is defined in g1_specialized_oop_closures.hpp:
177 //
178 // typedef G1ParCopyClosure<G1BarrierEvac, false> G1ParScanHeapEvacClosure;
179
180 // We use a separate closure to handle references during evacuation
181 // failure processing.
182 // We could have used another instance of G1ParScanHeapEvacClosure
183 // (since that closure no longer assumes that the references it
184 // handles point into the collection set).
185
186 typedef G1ParCopyClosure<G1BarrierEvac, false> G1ParScanHeapEvacFailureClosure;
187
188 class FilterIntoCSClosure: public ExtendedOopClosure {
189 G1CollectedHeap* _g1;
190 OopClosure* _oc;
191 DirtyCardToOopClosure* _dcto_cl;
192 public:
193 FilterIntoCSClosure( DirtyCardToOopClosure* dcto_cl,
194 G1CollectedHeap* g1,
195 OopClosure* oc) :
196 _dcto_cl(dcto_cl), _g1(g1), _oc(oc) { }
197
198 template <class T> void do_oop_nv(T* p);
199 virtual void do_oop(oop* p) { do_oop_nv(p); }
200 virtual void do_oop(narrowOop* p) { do_oop_nv(p); }
201 bool apply_to_weak_ref_discovered_field() { return true; }
202 };
203
204 class FilterOutOfRegionClosure: public ExtendedOopClosure {
205 HeapWord* _r_bottom;
206 HeapWord* _r_end;
|