1326 // into heap dumper. 1327 ShenandoahHeapIterationRootScanner rp; 1328 rp.roots_do(&oops); 1329 } 1330 1331 // Work through the oop stack to traverse heap. 1332 while (! oop_stack.is_empty()) { 1333 oop obj = oop_stack.pop(); 1334 assert(oopDesc::is_oop(obj), "must be a valid oop"); 1335 cl->do_object(obj); 1336 obj->oop_iterate(&oops); 1337 } 1338 1339 assert(oop_stack.is_empty(), "should be empty"); 1340 1341 if (!_aux_bitmap_region_special && !os::uncommit_memory((char*)_aux_bitmap_region.start(), _aux_bitmap_region.byte_size())) { 1342 log_warning(gc)("Could not uncommit native memory for auxiliary marking bitmap for heap iteration"); 1343 } 1344 } 1345 1346 // Keep alive an object that was loaded with AS_NO_KEEPALIVE. 1347 void ShenandoahHeap::keep_alive(oop obj) { 1348 if (is_concurrent_mark_in_progress()) { 1349 ShenandoahBarrierSet::barrier_set()->enqueue(obj); 1350 } 1351 } 1352 1353 void ShenandoahHeap::heap_region_iterate(ShenandoahHeapRegionClosure* blk) const { 1354 for (size_t i = 0; i < num_regions(); i++) { 1355 ShenandoahHeapRegion* current = get_region(i); 1356 blk->heap_region_do(current); 1357 } 1358 } 1359 1360 class ShenandoahParallelHeapRegionTask : public AbstractGangTask { 1361 private: 1362 ShenandoahHeap* const _heap; 1363 ShenandoahHeapRegionClosure* const _blk; 1364 1365 shenandoah_padding(0); | 1326 // into heap dumper. 1327 ShenandoahHeapIterationRootScanner rp; 1328 rp.roots_do(&oops); 1329 } 1330 1331 // Work through the oop stack to traverse heap. 1332 while (! oop_stack.is_empty()) { 1333 oop obj = oop_stack.pop(); 1334 assert(oopDesc::is_oop(obj), "must be a valid oop"); 1335 cl->do_object(obj); 1336 obj->oop_iterate(&oops); 1337 } 1338 1339 assert(oop_stack.is_empty(), "should be empty"); 1340 1341 if (!_aux_bitmap_region_special && !os::uncommit_memory((char*)_aux_bitmap_region.start(), _aux_bitmap_region.byte_size())) { 1342 log_warning(gc)("Could not uncommit native memory for auxiliary marking bitmap for heap iteration"); 1343 } 1344 } 1345 1346 void ShenandoahHeap::run_task(AbstractGangTask* task) { 1347 workers()->run_task(task, workers()->active_workers()); 1348 } 1349 1350 // Keep alive an object that was loaded with AS_NO_KEEPALIVE. 1351 void ShenandoahHeap::keep_alive(oop obj) { 1352 if (is_concurrent_mark_in_progress()) { 1353 ShenandoahBarrierSet::barrier_set()->enqueue(obj); 1354 } 1355 } 1356 1357 void ShenandoahHeap::heap_region_iterate(ShenandoahHeapRegionClosure* blk) const { 1358 for (size_t i = 0; i < num_regions(); i++) { 1359 ShenandoahHeapRegion* current = get_region(i); 1360 blk->heap_region_do(current); 1361 } 1362 } 1363 1364 class ShenandoahParallelHeapRegionTask : public AbstractGangTask { 1365 private: 1366 ShenandoahHeap* const _heap; 1367 ShenandoahHeapRegionClosure* const _blk; 1368 1369 shenandoah_padding(0); |