308 HeapWord* finger,
309 HeapWord** global_finger_addr,
310 Par_MarkFromRootsClosure* parent);
311 virtual void do_oop(oop* p);
312 virtual void do_oop(narrowOop* p);
313 inline void do_oop_nv(oop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
314 inline void do_oop_nv(narrowOop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
315 virtual const bool should_remember_klasses() const {
316 return _should_remember_klasses;
317 }
318 virtual void remember_klass(Klass* k);
319 // Deal with a stack overflow condition
320 void handle_stack_overflow(HeapWord* lost);
321 private:
322 inline void do_yield_check();
323 };
324
325 // For objects in CMS generation, this closure marks
326 // given objects (transitively) as being reachable/live.
327 // This is currently used during the (weak) reference object
328 // processing phase of the CMS final checkpoint step.
329 class CMSKeepAliveClosure: public OopClosure {
330 private:
331 CMSCollector* _collector;
332 const MemRegion _span;
333 CMSMarkStack* _mark_stack;
334 CMSBitMap* _bit_map;
335 protected:
336 DO_OOP_WORK_DEFN
337 public:
338 CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
339 CMSBitMap* bit_map, CMSMarkStack* mark_stack):
340 _collector(collector),
341 _span(span),
342 _bit_map(bit_map),
343 _mark_stack(mark_stack) {
344 assert(!_span.is_empty(), "Empty span could spell trouble");
345 }
346 virtual void do_oop(oop* p);
347 virtual void do_oop(narrowOop* p);
348 inline void do_oop_nv(oop* p) { CMSKeepAliveClosure::do_oop_work(p); }
349 inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
350 };
351
352 class CMSInnerParMarkAndPushClosure: public OopClosure {
353 private:
354 CMSCollector* _collector;
355 MemRegion _span;
356 OopTaskQueue* _work_queue;
357 CMSBitMap* _bit_map;
358 protected:
359 DO_OOP_WORK_DEFN
360 public:
361 CMSInnerParMarkAndPushClosure(CMSCollector* collector,
362 MemRegion span, CMSBitMap* bit_map,
363 OopTaskQueue* work_queue):
|
308 HeapWord* finger,
309 HeapWord** global_finger_addr,
310 Par_MarkFromRootsClosure* parent);
311 virtual void do_oop(oop* p);
312 virtual void do_oop(narrowOop* p);
313 inline void do_oop_nv(oop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
314 inline void do_oop_nv(narrowOop* p) { Par_PushOrMarkClosure::do_oop_work(p); }
315 virtual const bool should_remember_klasses() const {
316 return _should_remember_klasses;
317 }
318 virtual void remember_klass(Klass* k);
319 // Deal with a stack overflow condition
320 void handle_stack_overflow(HeapWord* lost);
321 private:
322 inline void do_yield_check();
323 };
324
325 // For objects in CMS generation, this closure marks
326 // given objects (transitively) as being reachable/live.
327 // This is currently used during the (weak) reference object
328 // processing phase of the CMS final checkpoint step, as
329 // well as during the concurrent precleaning of the discovered
330 // reference lists.
331 class CMSKeepAliveClosure: public OopClosure {
332 friend class CMSDrainMarkingStackClosure; // for assertion checking
333 private:
334 CMSCollector* _collector;
335 const MemRegion _span;
336 CMSMarkStack* _mark_stack;
337 CMSBitMap* _bit_map;
338 bool _concurrent_precleaning;
339 protected:
340 DO_OOP_WORK_DEFN
341 public:
342 CMSKeepAliveClosure(CMSCollector* collector, MemRegion span,
343 CMSBitMap* bit_map, CMSMarkStack* mark_stack,
344 bool concurrent_precleaning):
345 _collector(collector),
346 _span(span),
347 _bit_map(bit_map),
348 _mark_stack(mark_stack),
349 _concurrent_precleaning(concurrent_precleaning) {
350 assert(!_span.is_empty(), "Empty span could spell trouble");
351 }
352 virtual void do_oop(oop* p);
353 virtual void do_oop(narrowOop* p);
354 inline void do_oop_nv(oop* p) { CMSKeepAliveClosure::do_oop_work(p); }
355 inline void do_oop_nv(narrowOop* p) { CMSKeepAliveClosure::do_oop_work(p); }
356 };
357
358 class CMSInnerParMarkAndPushClosure: public OopClosure {
359 private:
360 CMSCollector* _collector;
361 MemRegion _span;
362 OopTaskQueue* _work_queue;
363 CMSBitMap* _bit_map;
364 protected:
365 DO_OOP_WORK_DEFN
366 public:
367 CMSInnerParMarkAndPushClosure(CMSCollector* collector,
368 MemRegion span, CMSBitMap* bit_map,
369 OopTaskQueue* work_queue):
|