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) {
|