Wed, 23 Sep 2009 23:57:44 -0700
6885169: merge of 4957990 and 6863023 causes conflict on do_nmethods
Summary: After mechanically merging changes, some by-hand adjustments are needed.
Reviewed-by: ysr
1 /*
2 * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 *
23 */
25 /////////////////////////////////////////////////////////////////
26 // Closures used by ConcurrentMarkSweepGeneration's collector
27 /////////////////////////////////////////////////////////////////
28 class ConcurrentMarkSweepGeneration;
29 class CMSBitMap;
30 class CMSMarkStack;
31 class CMSCollector;
32 class MarkFromRootsClosure;
33 class Par_MarkFromRootsClosure;
35 // Decode the oop and call do_oop on it.
36 #define DO_OOP_WORK_DEFN \
37 void do_oop(oop obj); \
38 template <class T> inline void do_oop_work(T* p) { \
39 T heap_oop = oopDesc::load_heap_oop(p); \
40 if (!oopDesc::is_null(heap_oop)) { \
41 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop); \
42 do_oop(obj); \
43 } \
44 }
46 class MarkRefsIntoClosure: public OopsInGenClosure {
47 private:
48 const MemRegion _span;
49 CMSBitMap* _bitMap;
50 protected:
51 DO_OOP_WORK_DEFN
52 public:
53 MarkRefsIntoClosure(MemRegion span, CMSBitMap* bitMap);
54 virtual void do_oop(oop* p);
55 virtual void do_oop(narrowOop* p);
56 inline void do_oop_nv(oop* p) { MarkRefsIntoClosure::do_oop_work(p); }
57 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoClosure::do_oop_work(p); }
58 bool do_header() { return true; }
59 Prefetch::style prefetch_style() {
60 return Prefetch::do_read;
61 }
62 };
64 // A variant of the above used in certain kinds of CMS
65 // marking verification.
66 class MarkRefsIntoVerifyClosure: public OopsInGenClosure {
67 private:
68 const MemRegion _span;
69 CMSBitMap* _verification_bm;
70 CMSBitMap* _cms_bm;
71 protected:
72 DO_OOP_WORK_DEFN
73 public:
74 MarkRefsIntoVerifyClosure(MemRegion span, CMSBitMap* verification_bm,
75 CMSBitMap* cms_bm);
76 virtual void do_oop(oop* p);
77 virtual void do_oop(narrowOop* p);
78 inline void do_oop_nv(oop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); }
79 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoVerifyClosure::do_oop_work(p); }
80 bool do_header() { return true; }
81 Prefetch::style prefetch_style() {
82 return Prefetch::do_read;
83 }
84 };
86 // KlassRememberingOopClosure is used when marking of the permanent generation
87 // is being done. It adds fields to support revisiting of klasses
88 // for class unloading. _should_remember_klasses should be set to
89 // indicate if klasses should be remembered. Currently that is whenever
90 // CMS class unloading is turned on. The _revisit_stack is used
91 // to save the klasses for later processing.
92 class KlassRememberingOopClosure : public OopClosure {
93 protected:
94 CMSCollector* _collector;
95 CMSMarkStack* _revisit_stack;
96 bool const _should_remember_klasses;
97 public:
98 void check_remember_klasses() const PRODUCT_RETURN;
99 virtual const bool should_remember_klasses() const {
100 check_remember_klasses();
101 return _should_remember_klasses;
102 }
103 virtual void remember_klass(Klass* k);
105 KlassRememberingOopClosure(CMSCollector* collector,
106 ReferenceProcessor* rp,
107 CMSMarkStack* revisit_stack);
108 };
110 // Similar to KlassRememberingOopClosure for use when multiple
111 // GC threads will execute the closure.
113 class Par_KlassRememberingOopClosure : public KlassRememberingOopClosure {
114 public:
115 Par_KlassRememberingOopClosure(CMSCollector* collector,
116 ReferenceProcessor* rp,
117 CMSMarkStack* revisit_stack):
118 KlassRememberingOopClosure(collector, rp, revisit_stack) {}
119 virtual void remember_klass(Klass* k);
120 };
122 // The non-parallel version (the parallel version appears further below).
123 class PushAndMarkClosure: public KlassRememberingOopClosure {
124 private:
125 MemRegion _span;
126 CMSBitMap* _bit_map;
127 CMSBitMap* _mod_union_table;
128 CMSMarkStack* _mark_stack;
129 bool _concurrent_precleaning;
130 protected:
131 DO_OOP_WORK_DEFN
132 public:
133 PushAndMarkClosure(CMSCollector* collector,
134 MemRegion span,
135 ReferenceProcessor* rp,
136 CMSBitMap* bit_map,
137 CMSBitMap* mod_union_table,
138 CMSMarkStack* mark_stack,
139 CMSMarkStack* revisit_stack,
140 bool concurrent_precleaning);
141 virtual void do_oop(oop* p);
142 virtual void do_oop(narrowOop* p);
143 inline void do_oop_nv(oop* p) { PushAndMarkClosure::do_oop_work(p); }
144 inline void do_oop_nv(narrowOop* p) { PushAndMarkClosure::do_oop_work(p); }
145 bool do_header() { return true; }
146 Prefetch::style prefetch_style() {
147 return Prefetch::do_read;
148 }
149 // In support of class unloading
150 virtual const bool should_remember_mdo() const {
151 return false;
152 // return _should_remember_klasses;
153 }
154 virtual void remember_mdo(DataLayout* v);
155 };
157 // In the parallel case, the revisit stack, the bit map and the
158 // reference processor are currently all shared. Access to
159 // these shared mutable structures must use appropriate
160 // synchronization (for instance, via CAS). The marking stack
161 // used in the non-parallel case above is here replaced with
162 // an OopTaskQueue structure to allow efficient work stealing.
163 class Par_PushAndMarkClosure: public Par_KlassRememberingOopClosure {
164 private:
165 MemRegion _span;
166 CMSBitMap* _bit_map;
167 OopTaskQueue* _work_queue;
168 protected:
169 DO_OOP_WORK_DEFN
170 public:
171 Par_PushAndMarkClosure(CMSCollector* collector,
172 MemRegion span,
173 ReferenceProcessor* rp,
174 CMSBitMap* bit_map,
175 OopTaskQueue* work_queue,
176 CMSMarkStack* revisit_stack);
177 virtual void do_oop(oop* p);
178 virtual void do_oop(narrowOop* p);
179 inline void do_oop_nv(oop* p) { Par_PushAndMarkClosure::do_oop_work(p); }
180 inline void do_oop_nv(narrowOop* p) { Par_PushAndMarkClosure::do_oop_work(p); }
181 bool do_header() { return true; }
182 Prefetch::style prefetch_style() {
183 return Prefetch::do_read;
184 }
185 // In support of class unloading
186 virtual const bool should_remember_mdo() const {
187 return false;
188 // return _should_remember_klasses;
189 }
190 virtual void remember_mdo(DataLayout* v);
191 };
193 // The non-parallel version (the parallel version appears further below).
194 class MarkRefsIntoAndScanClosure: public OopsInGenClosure {
195 private:
196 MemRegion _span;
197 CMSBitMap* _bit_map;
198 CMSMarkStack* _mark_stack;
199 PushAndMarkClosure _pushAndMarkClosure;
200 CMSCollector* _collector;
201 Mutex* _freelistLock;
202 bool _yield;
203 // Whether closure is being used for concurrent precleaning
204 bool _concurrent_precleaning;
205 protected:
206 DO_OOP_WORK_DEFN
207 public:
208 MarkRefsIntoAndScanClosure(MemRegion span,
209 ReferenceProcessor* rp,
210 CMSBitMap* bit_map,
211 CMSBitMap* mod_union_table,
212 CMSMarkStack* mark_stack,
213 CMSMarkStack* revisit_stack,
214 CMSCollector* collector,
215 bool should_yield,
216 bool concurrent_precleaning);
217 virtual void do_oop(oop* p);
218 virtual void do_oop(narrowOop* p);
219 inline void do_oop_nv(oop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); }
220 inline void do_oop_nv(narrowOop* p) { MarkRefsIntoAndScanClosure::do_oop_work(p); }
221 bool do_header() { return true; }
222 Prefetch::style prefetch_style() {
223 return Prefetch::do_read;
224 }
225 void set_freelistLock(Mutex* m) {
226 _freelistLock = m;
227 }
228 virtual const bool should_remember_klasses() const {
229 return _pushAndMarkClosure.should_remember_klasses();
230 }
231 virtual void remember_klass(Klass* k) {
232 _pushAndMarkClosure.remember_klass(k);
233 }
235 private:
236 inline void do_yield_check();
237 void do_yield_work();
238 bool take_from_overflow_list();
239 };
241 // Tn this, the parallel avatar of MarkRefsIntoAndScanClosure, the revisit
242 // stack and the bitMap are shared, so access needs to be suitably
243 // sycnhronized. An OopTaskQueue structure, supporting efficient
244 // workstealing, replaces a CMSMarkStack for storing grey objects.
245 class Par_MarkRefsIntoAndScanClosure: public OopsInGenClosure {
246 private:
247 MemRegion _span;
248 CMSBitMap* _bit_map;
249 OopTaskQueue* _work_queue;
250 const uint _low_water_mark;
251 Par_PushAndMarkClosure _par_pushAndMarkClosure;
252 protected:
253 DO_OOP_WORK_DEFN
254 public:
255 Par_MarkRefsIntoAndScanClosure(CMSCollector* collector,
256 MemRegion span,
257 ReferenceProcessor* rp,
258 CMSBitMap* bit_map,
259 OopTaskQueue* work_queue,
260 CMSMarkStack* revisit_stack);
261 virtual void do_oop(oop* p);
262 virtual void do_oop(narrowOop* p);
263 inline void do_oop_nv(oop* p) { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
264 inline void do_oop_nv(narrowOop* p) { Par_MarkRefsIntoAndScanClosure::do_oop_work(p); }
265 bool do_header() { return true; }
266 // When ScanMarkedObjectsAgainClosure is used,
267 // it passes [Par_]MarkRefsIntoAndScanClosure to oop_oop_iterate(),
268 // and this delegation is used.
269 virtual const bool should_remember_klasses() const {
270 return _par_pushAndMarkClosure.should_remember_klasses();
271 }
272 // See comment on should_remember_klasses() above.
273 virtual void remember_klass(Klass* k) {
274 _par_pushAndMarkClosure.remember_klass(k);
275 }
276 Prefetch::style prefetch_style() {
277 return Prefetch::do_read;
278 }
279 void trim_queue(uint size);
280 };
282 // This closure is used during the concurrent marking phase
283 // following the first checkpoint. Its use is buried in
284 // the closure MarkFromRootsClosure.
285 class PushOrMarkClosure: public KlassRememberingOopClosure {
286 private:
287 MemRegion _span;
288 CMSBitMap* _bitMap;
289 CMSMarkStack* _markStack;
290 HeapWord* const _finger;
291 MarkFromRootsClosure* const
292 _parent;
293 protected:
294 DO_OOP_WORK_DEFN
295 public:
296 PushOrMarkClosure(CMSCollector* cms_collector,
297 MemRegion span,
298 CMSBitMap* bitMap,
299 CMSMarkStack* markStack,
300 CMSMarkStack* revisitStack,
301 HeapWord* finger,
302 MarkFromRootsClosure* parent);
303 virtual void do_oop(oop* p);
304 virtual void do_oop(narrowOop* p);
305 inline void do_oop_nv(oop* p) { PushOrMarkClosure::do_oop_work(p); }
306 inline void do_oop_nv(narrowOop* p) { PushOrMarkClosure::do_oop_work(p); }
307 // In support of class unloading
308 virtual const bool should_remember_mdo() const {
309 return false;
310 // return _should_remember_klasses;
311 }
312 virtual void remember_mdo(DataLayout* v);
314 // Deal with a stack overflow condition
315 void handle_stack_overflow(HeapWord* lost);
316 private:
317 inline void do_yield_check();
318 };
320 // A parallel (MT) version of the above.
321 // This closure is used during the concurrent marking phase
322 // following the first checkpoint. Its use is buried in
323 // the closure Par_MarkFromRootsClosure.
324 class Par_PushOrMarkClosure: public Par_KlassRememberingOopClosure {
325 private:
326 MemRegion _whole_span;
327 MemRegion _span; // local chunk
328 CMSBitMap* _bit_map;
329 OopTaskQueue* _work_queue;
330 CMSMarkStack* _overflow_stack;
331 HeapWord* const _finger;
332 HeapWord** const _global_finger_addr;
333 Par_MarkFromRootsClosure* const
334 _parent;
335 protected:
336 DO_OOP_WORK_DEFN
337 public:
338 Par_PushOrMarkClosure(CMSCollector* cms_collector,
339 MemRegion span,
340 CMSBitMap* bit_map,
341 OopTaskQueue* work_queue,
342 CMSMarkStack* mark_stack,
343 CMSMarkStack* revisit_stack,
344 HeapWord* finger,
345 HeapWord** global_finger_addr,
346 Par_MarkFromRootsClosure* parent);
347 virtual void do_oop(oop* p);
348 virtual void do_oop(narrowOop* p);
349 inline void do_oop_nv(oop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
350 inline void do_oop_nv(narrowOop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
351 // In support of class unloading
352 virtual const bool should_remember_mdo() const {
353 return false;
354 // return _should_remember_klasses;
355 }
356 virtual void remember_mdo(DataLayout* v);
358 // Deal with a stack overflow condition
359 void handle_stack_overflow(HeapWord* lost);
360 private:
361 inline void do_yield_check();
362 };
364 // For objects in CMS generation, this closure marks
365 // given objects (transitively) as being reachable/live.
366 // This is currently used during the (weak) reference object
367 // processing phase of the CMS final checkpoint step, as
368 // well as during the concurrent precleaning of the discovered
369 // reference lists.
370 class CMSKeepAliveClosure: public KlassRememberingOopClosure {
371 private:
372 const MemRegion _span;
373 CMSMarkStack* _mark_stack;
374 CMSBitMap* _bit_map;
375 bool _concurrent_precleaning;
376 protected:
377 DO_OOP_WORK_DEFN
378 public:
379 CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
380 CMSBitMap* bit_map, CMSMarkStack* mark_stack,
381 CMSMarkStack* revisit_stack, bool cpc);
382 bool concurrent_precleaning() const { return _concurrent_precleaning; }
383 virtual void do_oop(oop* p);
384 virtual void do_oop(narrowOop* p);
385 inline void do_oop_nv(oop* p) { CMSKeepAliveClosure::do_oop_work(p); }
386 inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
387 };
389 class CMSInnerParMarkAndPushClosure: public Par_KlassRememberingOopClosure {
390 private:
391 MemRegion _span;
392 OopTaskQueue* _work_queue;
393 CMSBitMap* _bit_map;
394 protected:
395 DO_OOP_WORK_DEFN
396 public:
397 CMSInnerParMarkAndPushClosure(CMSCollector* collector,
398 MemRegion span, CMSBitMap* bit_map,
399 CMSMarkStack* revisit_stack,
400 OopTaskQueue* work_queue);
401 virtual void do_oop(oop* p);
402 virtual void do_oop(narrowOop* p);
403 inline void do_oop_nv(oop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
404 inline void do_oop_nv(narrowOop* p) { CMSInnerParMarkAndPushClosure::do_oop_work(p); }
405 };
407 // A parallel (MT) version of the above, used when
408 // reference processing is parallel; the only difference
409 // is in the do_oop method.
410 class CMSParKeepAliveClosure: public Par_KlassRememberingOopClosure {
411 private:
412 MemRegion _span;
413 OopTaskQueue* _work_queue;
414 CMSBitMap* _bit_map;
415 CMSInnerParMarkAndPushClosure
416 _mark_and_push;
417 const uint _low_water_mark;
418 void trim_queue(uint max);
419 protected:
420 DO_OOP_WORK_DEFN
421 public:
422 CMSParKeepAliveClosure(CMSCollector* collector, MemRegion span,
423 CMSBitMap* bit_map, CMSMarkStack* revisit_stack,
424 OopTaskQueue* work_queue);
425 virtual void do_oop(oop* p);
426 virtual void do_oop(narrowOop* p);
427 inline void do_oop_nv(oop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
428 inline void do_oop_nv(narrowOop* p) { CMSParKeepAliveClosure::do_oop_work(p); }
429 };