void process_buffer () { assert((_hr_curr - _hr_buffer) == (_buffer_curr - _buffer), "the two lengths should be the same"); double start = os::elapsedTime(); HeapRegion** hr_curr = _hr_buffer; HeapRegion* hr_prev = NULL; for (StarTask* curr = _buffer; curr < _buffer_curr; ++curr) { HeapRegion* region = *hr_curr; if (region != hr_prev) { _oc->set_region(region); hr_prev = region; } if (curr->is_narrow()) { assert(UseCompressedOops, "Error"); _oc->do_oop((narrowOop*)(*curr)); } else { _oc->do_oop((oop*)(*curr)); } ++hr_curr; } _buffer_curr = _buffer; _hr_curr = _hr_buffer; _closure_app_seconds += (os::elapsedTime() - start); }
void scanCard(size_t index, HeapRegion *r) { _cards_done++; DirtyCardToOopClosure* cl = r->new_dcto_closure(_oc, CardTableModRefBS::Precise, HeapRegionDCTOC::IntoCSFilterKind); // Set the "from" region in the closure. _oc->set_region(r); HeapWord* card_start = _bot_shared->address_for_index(index); HeapWord* card_end = card_start + G1BlockOffsetSharedArray::N_words; Space *sp = SharedHeap::heap()->space_containing(card_start); MemRegion sm_region; if (ParallelGCThreads > 0) { // first find the used area sm_region = sp->used_region_at_save_marks(); } else { // The closure is not idempotent. We shouldn't look at objects // allocated during the GC. sm_region = sp->used_region_at_save_marks(); } MemRegion mr = sm_region.intersection(MemRegion(card_start,card_end)); if (!mr.is_empty()) { cl->do_MemRegion(mr); } }
void process_buffer () { assert((_hr_curr - _hr_buffer) == (_buffer_curr - _buffer), "the two lengths should be the same"); double start = os::elapsedTime(); HeapRegion **hr_curr = _hr_buffer; HeapRegion *hr_prev = NULL; for (oop **curr = _buffer; curr < _buffer_curr; ++curr) { HeapRegion *region = *hr_curr; if (region != hr_prev) { _oc->set_region(region); hr_prev = region; } _oc->do_oop(*curr); ++hr_curr; } _buffer_curr = _buffer; _hr_curr = _hr_buffer; _closure_app_seconds += (os::elapsedTime() - start); }
template <class T> void do_oop_work(T* p) { oop obj = oopDesc::load_decode_heap_oop(p); if (_g1->obj_in_cs(obj)) _blk->do_oop(p); }
void set_region(HeapRegion* from) { _blk->set_region(from); }