< prev index next >

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

Print this page
rev 12117 : Pin regions that contain JNI critical regions, instead of bail-and-retry protocol.


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


< prev index next >