340 _to_region = new_to_region;
341 _compact_point = _to_region->bottom();
342 }
343 assert(_compact_point + obj_size <= _to_region->end(), "must fit");
344 // tty->print_cr("forwarding %p to %p", p, _compact_point + BrooksPointer::BROOKS_POINTER_OBJ_SIZE);
345 assert(oopDesc::unsafe_equals(p, ShenandoahBarrierSet::resolve_oop_static_not_null(p)),
346 "expect forwarded oop");
347 BrooksPointer::get(p).set_forwardee(oop(_compact_point + BrooksPointer::BROOKS_POINTER_OBJ_SIZE));
348 _compact_point += obj_size;
349 }
350 };
351
352 class ShenandoahPrepareForCompactionTask : public AbstractGangTask {
353 private:
354
355 ShenandoahHeapRegionSet** _copy_queues;
356 ShenandoahHeapRegionSet* _from_regions;
357
358 ShenandoahHeapRegion* next_from_region(ShenandoahHeapRegionSet* copy_queue) {
359 ShenandoahHeapRegion* from_region = _from_regions->claim_next();
360 while (from_region != NULL && from_region->is_humongous()) {
361 from_region = _from_regions->claim_next();
362 }
363 if (from_region != NULL) {
364 assert(copy_queue != NULL, "sanity");
365 assert(! from_region->is_humongous(), "must not get humongous regions here");
366 copy_queue->add_region(from_region);
367 }
368 return from_region;
369 }
370
371 public:
372 ShenandoahPrepareForCompactionTask(ShenandoahHeapRegionSet* from_regions, ShenandoahHeapRegionSet** copy_queues) :
373 AbstractGangTask("Shenandoah Prepare For Compaction Task"),
374 _from_regions(from_regions), _copy_queues(copy_queues) {
375 }
376
377 void work(uint worker_id) {
378 ShenandoahHeapRegionSet* copy_queue = _copy_queues[worker_id];
379 ShenandoahHeapRegion* from_region = next_from_region(copy_queue);
380 if (from_region == NULL) return;
381 ShenandoahHeapRegionSet* to_regions = new ShenandoahHeapRegionSet(ShenandoahHeap::heap()->max_regions());
382 ShenandoahPrepareForCompactionObjectClosure cl(to_regions, from_region);
383 while (from_region != NULL) {
384 assert(from_region != NULL, "sanity");
385 cl.set_from_region(from_region);
|
340 _to_region = new_to_region;
341 _compact_point = _to_region->bottom();
342 }
343 assert(_compact_point + obj_size <= _to_region->end(), "must fit");
344 // tty->print_cr("forwarding %p to %p", p, _compact_point + BrooksPointer::BROOKS_POINTER_OBJ_SIZE);
345 assert(oopDesc::unsafe_equals(p, ShenandoahBarrierSet::resolve_oop_static_not_null(p)),
346 "expect forwarded oop");
347 BrooksPointer::get(p).set_forwardee(oop(_compact_point + BrooksPointer::BROOKS_POINTER_OBJ_SIZE));
348 _compact_point += obj_size;
349 }
350 };
351
352 class ShenandoahPrepareForCompactionTask : public AbstractGangTask {
353 private:
354
355 ShenandoahHeapRegionSet** _copy_queues;
356 ShenandoahHeapRegionSet* _from_regions;
357
358 ShenandoahHeapRegion* next_from_region(ShenandoahHeapRegionSet* copy_queue) {
359 ShenandoahHeapRegion* from_region = _from_regions->claim_next();
360 while (from_region != NULL && (from_region->is_humongous() || from_region->is_pinned())) {
361 from_region = _from_regions->claim_next();
362 }
363 if (from_region != NULL) {
364 assert(copy_queue != NULL, "sanity");
365 assert(! from_region->is_humongous(), "must not get humongous regions here");
366 assert(! from_region->is_pinned(), "no pinned region in mark-compact");
367 copy_queue->add_region(from_region);
368 }
369 return from_region;
370 }
371
372 public:
373 ShenandoahPrepareForCompactionTask(ShenandoahHeapRegionSet* from_regions, ShenandoahHeapRegionSet** copy_queues) :
374 AbstractGangTask("Shenandoah Prepare For Compaction Task"),
375 _from_regions(from_regions), _copy_queues(copy_queues) {
376 }
377
378 void work(uint worker_id) {
379 ShenandoahHeapRegionSet* copy_queue = _copy_queues[worker_id];
380 ShenandoahHeapRegion* from_region = next_from_region(copy_queue);
381 if (from_region == NULL) return;
382 ShenandoahHeapRegionSet* to_regions = new ShenandoahHeapRegionSet(ShenandoahHeap::heap()->max_regions());
383 ShenandoahPrepareForCompactionObjectClosure cl(to_regions, from_region);
384 while (from_region != NULL) {
385 assert(from_region != NULL, "sanity");
386 cl.set_from_region(from_region);
|