< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahMarkCompact.cpp

Print this page




 280   void set_from_region(ShenandoahHeapRegion* from_region) {
 281     _from_region = from_region;
 282   }
 283 
 284   void finish_region() {
 285     assert(_to_region != NULL, "should not happen");
 286     _to_region->set_new_top(_compact_point);
 287   }
 288 
 289   bool is_compact_same_region() {
 290     return _from_region == _to_region;
 291   }
 292 
 293   int empty_regions_pos() {
 294     return _empty_regions_pos;
 295   }
 296 
 297   void do_object(oop p) {
 298     assert(_from_region != NULL, "must set before work");
 299     assert(_heap->complete_marking_context()->is_marked(p), "must be marked");
 300     assert(!_heap->complete_marking_context()->allocated_after_mark_start(p), "must be truly marked");
 301 
 302     size_t obj_size = p->size();
 303     if (_compact_point + obj_size > _to_region->end()) {
 304       finish_region();
 305 
 306       // Object doesn't fit. Pick next empty region and start compacting there.
 307       ShenandoahHeapRegion* new_to_region;
 308       if (_empty_regions_pos < _empty_regions.length()) {
 309         new_to_region = _empty_regions.at(_empty_regions_pos);
 310         _empty_regions_pos++;
 311       } else {
 312         // Out of empty region? Compact within the same region.
 313         new_to_region = _from_region;
 314       }
 315 
 316       assert(new_to_region != _to_region, "must not reuse same to-region");
 317       assert(new_to_region != NULL, "must not be NULL");
 318       _to_region = new_to_region;
 319       _compact_point = _to_region->bottom();
 320     }


 647 #endif
 648   }
 649 
 650   ShenandoahAdjustPointersTask adjust_pointers_task;
 651   workers->run_task(&adjust_pointers_task);
 652 }
 653 
 654 class ShenandoahCompactObjectsClosure : public ObjectClosure {
 655 private:
 656   ShenandoahHeap* const _heap;
 657   uint            const _worker_id;
 658 
 659 public:
 660   ShenandoahCompactObjectsClosure(uint worker_id) :
 661     _heap(ShenandoahHeap::heap()), _worker_id(worker_id) {}
 662 
 663   void do_object(oop p) {
 664     assert(_heap->complete_marking_context()->is_marked(p), "must be marked");
 665     size_t size = (size_t)p->size();
 666     if (p->is_forwarded()) {
 667       HeapWord* compact_from = cast_from_oop<HeapWord*>(p);
 668       HeapWord* compact_to = cast_from_oop<HeapWord*>(p->forwardee());
 669       Copy::aligned_conjoint_words(compact_from, compact_to, size);
 670       oop new_obj = oop(compact_to);
 671       new_obj->init_mark_raw();
 672     }
 673   }
 674 };
 675 
 676 class ShenandoahCompactObjectsTask : public AbstractGangTask {
 677 private:
 678   ShenandoahHeap* const _heap;
 679   ShenandoahHeapRegionSet** const _worker_slices;
 680 
 681 public:
 682   ShenandoahCompactObjectsTask(ShenandoahHeapRegionSet** worker_slices) :
 683     AbstractGangTask("Shenandoah Compact Objects Task"),
 684     _heap(ShenandoahHeap::heap()),
 685     _worker_slices(worker_slices) {
 686   }
 687 
 688   void work(uint worker_id) {




 280   void set_from_region(ShenandoahHeapRegion* from_region) {
 281     _from_region = from_region;
 282   }
 283 
 284   void finish_region() {
 285     assert(_to_region != NULL, "should not happen");
 286     _to_region->set_new_top(_compact_point);
 287   }
 288 
 289   bool is_compact_same_region() {
 290     return _from_region == _to_region;
 291   }
 292 
 293   int empty_regions_pos() {
 294     return _empty_regions_pos;
 295   }
 296 
 297   void do_object(oop p) {
 298     assert(_from_region != NULL, "must set before work");
 299     assert(_heap->complete_marking_context()->is_marked(p), "must be marked");
 300     assert(!_heap->complete_marking_context()->allocated_after_mark_start((HeapWord*) p), "must be truly marked");
 301 
 302     size_t obj_size = p->size();
 303     if (_compact_point + obj_size > _to_region->end()) {
 304       finish_region();
 305 
 306       // Object doesn't fit. Pick next empty region and start compacting there.
 307       ShenandoahHeapRegion* new_to_region;
 308       if (_empty_regions_pos < _empty_regions.length()) {
 309         new_to_region = _empty_regions.at(_empty_regions_pos);
 310         _empty_regions_pos++;
 311       } else {
 312         // Out of empty region? Compact within the same region.
 313         new_to_region = _from_region;
 314       }
 315 
 316       assert(new_to_region != _to_region, "must not reuse same to-region");
 317       assert(new_to_region != NULL, "must not be NULL");
 318       _to_region = new_to_region;
 319       _compact_point = _to_region->bottom();
 320     }


 647 #endif
 648   }
 649 
 650   ShenandoahAdjustPointersTask adjust_pointers_task;
 651   workers->run_task(&adjust_pointers_task);
 652 }
 653 
 654 class ShenandoahCompactObjectsClosure : public ObjectClosure {
 655 private:
 656   ShenandoahHeap* const _heap;
 657   uint            const _worker_id;
 658 
 659 public:
 660   ShenandoahCompactObjectsClosure(uint worker_id) :
 661     _heap(ShenandoahHeap::heap()), _worker_id(worker_id) {}
 662 
 663   void do_object(oop p) {
 664     assert(_heap->complete_marking_context()->is_marked(p), "must be marked");
 665     size_t size = (size_t)p->size();
 666     if (p->is_forwarded()) {
 667       HeapWord* compact_from = (HeapWord*) p;
 668       HeapWord* compact_to = (HeapWord*) p->forwardee();
 669       Copy::aligned_conjoint_words(compact_from, compact_to, size);
 670       oop new_obj = oop(compact_to);
 671       new_obj->init_mark_raw();
 672     }
 673   }
 674 };
 675 
 676 class ShenandoahCompactObjectsTask : public AbstractGangTask {
 677 private:
 678   ShenandoahHeap* const _heap;
 679   ShenandoahHeapRegionSet** const _worker_slices;
 680 
 681 public:
 682   ShenandoahCompactObjectsTask(ShenandoahHeapRegionSet** worker_slices) :
 683     AbstractGangTask("Shenandoah Compact Objects Task"),
 684     _heap(ShenandoahHeap::heap()),
 685     _worker_slices(worker_slices) {
 686   }
 687 
 688   void work(uint worker_id) {


< prev index next >